8.х Запрос с пустыми параметрами

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Samouchka, 4 сен 2015.

  1. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Всем здравствуйте. Нужно получить итог по запросу (ресурс - ДвижениеДолгаНачальныйОстаток) с учетом того, что некоторые или даже все параметры группировок будут пустыми. Сами параметры группировок берутся из реквизитов документа. Как это реализовать? Неужели придется разные запросы делать в зависимости от разных сочетаний пустых и заполненных реквизитов? Должно быть другое решение. Ведь если строить отчет с помощью СКД, то как-то же там можно выбирать параметры. А программно как? Вот мой неудачный код, помогите, пожалуйста

    Код:
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация КАК Организация,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Склад КАК Склад,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Поставщик КАК Поставщик,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Договор КАК Договор,
    |    СУММА(РасчетыСПоставщикамиОстаткиИОбороты.ДвижениеДолгаНачальныйОстаток) КАК ДвижениеДолгаНачальныйОстаток
    |ИЗ
    |    РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты(&НачДата, &КонДата, , , ) КАК РасчетыСПоставщикамиОстаткиИОбороты
    |ГДЕ
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация = &Организация
    |    И РасчетыСПоставщикамиОстаткиИОбороты.Склад = &Склад
    |    И РасчетыСПоставщикамиОстаткиИОбороты.Поставщик = &Поставщик
    |    И РасчетыСПоставщикамиОстаткиИОбороты.Договор = &Договор
    |
    |СГРУППИРОВАТЬ ПО
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Склад,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Поставщик,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Договор
    |
    |УПОРЯДОЧИТЬ ПО
    |    Организация,
    |    Склад,
    |    Поставщик,
    |    Договор,
    |    ДвижениеДолгаНачальныйОстаток
    |ИТОГИ
    |    СУММА(ДвижениеДолгаНачальныйОстаток)
    |ПО
    |    ОБЩИЕ,
    |    Организация,
    |    Склад,
    |    Поставщик,
    |    Договор"
        );
        Запрос.УстановитьПараметр("НачДата",НачПериода);
        Запрос.УстановитьПараметр("КонДата",КонПериода);
        Запрос.УстановитьПараметр("Организация",Организация);
        Запрос.УстановитьПараметр("Склад",Склад);
        Запрос.УстановитьПараметр("Поставщик",Поставщик);
       
        Если Договор=Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
            Запрос.УстановитьПараметр("Договор",Справочники.ДоговорыКонтрагентов.ПустаяСсылка());
        КонецЕсли;
        Если Договор<>Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
            Запрос.УстановитьПараметр("Договор",Договор);
        КонецЕсли;
       
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Реквизит1 = Выборка.ДвижениеДолгаНачальныйОстаток;
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Насколько понял суть проблемы из описания: вам не нужны ИТОГИ в запросе ВООБЩЕ.
    В конечном итоге с результатом запроса чего делать будете?
  3. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    я вооще не понял. можно хоть пример какой то
  4. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    397
    Баллы:
    104
    +1
  5. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Надо получить начальный остаток по ресурсу ДвижениеДолга из регистра накопления
    РасчетыСПоставщикамиОстаткиИОбороты за период времени между НачПериода и КонПериода (где НачПериода и КонПериода - реквизиты документа типа Дата, в запросе это параметры НачДата и КонДата). Но при этом могут быть разные варианты по измерениям. В документе есть реквизиты Организация, Склад, Поставщик, Договор (тип - Справочник.Ссылка). В регистре РасчетыСПоставщикамиОстаткиИОбороты есть соответствующие данным реквизитам измерения (они точно так же и называются). Если просто установить все параметры как реквизиты дока соответствующие измерениям регистра (часть кода)
    Код:
    Запрос.УстановитьПараметр("НачДата",НачПериода);
        Запрос.УстановитьПараметр("КонДата",КонПериода);
        Запрос.УстановитьПараметр("Организация",Организация);
        Запрос.УстановитьПараметр("Склад",Склад);
        Запрос.УстановитьПараметр("Поставщик",Поставщик);
    Запрос.УстановитьПараметр("Договор",Договор);
    
    то результат получится по всем измерениям. Т.е. в данном случае все реквизиты дока должны быть заполнены, иначе результат равен 0. Нужно сделать так, к примеру - заполнена только Организация, значит результат за период только по измерению регистра Организация; заполнены Организация и Поставщик, результат по измерениям Организация и Поставщик и т.п., варианты могут быть различные. Как для всех вариантов написать один код?
    Хотя я догадываюсь, где я лажаю - вот здесь:
    Код:
    |ГДЕ
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация = &Организация
    |    И РасчетыСПоставщикамиОстаткиИОбороты.Склад = &Склад
    |    И РасчетыСПоставщикамиОстаткиИОбороты.Поставщик = &Поставщик
    |    И РасчетыСПоставщикамиОстаткиИОбороты.Договор = &Договор
    Если я затем передам хотя бы в один параметр пустую ссылку, то естественно в измерении её не будет. Надо игнорировать измерение, а не искать пустую ссылку. Вот этой частью кода надо программно управлять:
    Код:
    |
    |СГРУППИРОВАТЬ ПО
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Склад,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Поставщик,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Договор
    |
    |УПОРЯДОЧИТЬ ПО
    |    Организация,
    |    Склад,
    |    Поставщик,
    |    Договор,
    |    ДвижениеДолгаНачальныйОстаток
    |ИТОГИ
    |    СУММА(ДвижениеДолгаНачальныйОстаток)
    |ПО
    |    ОБЩИЕ,
    |    Организация,
    |    Склад,
    |    Поставщик,
    |    Договор"
        );
    А может у кого-нибудь есть лучшее решение. Например, создать структуру отбора, а затем ее передать как-то в параметры запроса?
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    динамически формировать текст запроса - ничего сложного.
    Условия отбора через конструкцию "Выбор Когда....":

    Выбор Когда НЕ &Организация = Значение(Справочник.Организации.ПустаяСсылка)
    ТОГДА Организация = &Организация
    ИНаче Истина
    Конец

    Отбор через параметры виртуальной таблицы, а не через ГДЕ.
  7. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Поясните, пожалуйста, для незнающего, куда именно это вставлять в запрос и где должен быть "Конец". Щас в моем коде 1С ругается: синтаксическая ошибка "Выбор", а если убрать слово "Выбор", то ругается на "Когда".
    Код:
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация КАК Организация,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Склад КАК Склад,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Поставщик КАК Поставщик,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Договор КАК Договор,
    |    СУММА(РасчетыСПоставщикамиОстаткиИОбороты.ДвижениеДолгаНачальныйОстаток) КАК ДвижениеДолгаНачальныйОстаток
    |ИЗ
    |    РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты(&НачДата, &КонДата, , , ) КАК РасчетыСПоставщикамиОстаткиИОбороты
    |Выбор Когда
    |НЕ &Организация = Значение(Справочник.Организации.ПустаяСсылка)
    |ТОГДА Организация = &Организация
    |Иначе Истина
    |Конец
    |Когда НЕ &Склад = Значение(Справочник.Склады.ПустаяСсылка)
    |ТОГДА Склад = &Склад
    |Иначе Истина
    |Конец
    |Когда НЕ &Поставщик = Значение(Справочник.Контрагенты.ПустаяСсылка)
    |ТОГДА Поставщик = &Поставщик
    |Иначе Истина
    |Конец
    |Когда НЕ &Договор = Значение(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
    |ТОГДА Договор = &Договор
    |Иначе Истина
    |Конец
    |
    |СГРУППИРОВАТЬ ПО
    |    РасчетыСПоставщикамиОстаткиИОбороты.Организация,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Склад,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Поставщик,
    |    РасчетыСПоставщикамиОстаткиИОбороты.Договор
    |
    |УПОРЯДОЧИТЬ ПО
    |    Организация,
    |    Склад,
    |    Поставщик,
    |    Договор,
    |    ДвижениеДолгаНачальныйОстаток
    |ИТОГИ
    |    СУММА(ДвижениеДолгаНачальныйОстаток)
    |ПО
    |    ОБЩИЕ,
    |    Организация,
    |    Склад,
    |    Поставщик,
    |    Договор"
        );
        Запрос.УстановитьПараметр("НачДата",НачПериода);
        Запрос.УстановитьПараметр("КонДата",КонПериода);
        Запрос.УстановитьПараметр("Организация",Организация);
        Запрос.УстановитьПараметр("Склад",Склад);
        Запрос.УстановитьПараметр("Поставщик",Поставщик);
        Запрос.УстановитьПараметр("Договор",Договор);
                   
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Реквизит1 = Выборка.ДвижениеДолгаНачальныйОстаток;
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Вы запрос первый раз в 1С пишите?
    Параметры границ периода указали правильно, с отбором - все то же самое.
    Условия отбора объединяются логическим И:

    Выбор когда ..... Конец И Выбор Когда......Конец......

    Еще раз повторяю: не нужны вам ИТОГИ в запросе, абсолютно.
  9. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    1.А где конструкция ГДЕ на отбор то
    2. Выбор когда оно каждый раз с Выбор начинаеться должно же
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Параметры виртуальной таблицы необходимо использовать
  11. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Можете попробовать так :
    Код:
      Запрос = Новый Запрос;
       Запрос.Текст = "
       |ВЫБРАТЬ
       |  РасчетыСПоставщикамиОстаткиИОбороты.Организация  КАК Организация,
       |  РасчетыСПоставщикамиОстаткиИОбороты.Склад  КАК Склад,
       |  РасчетыСПоставщикамиОстаткиИОбороты.Поставщик  КАК Поставщик,
       |  РасчетыСПоставщикамиОстаткиИОбороты.Договор  КАК Договор,
       |  СУММА(РасчетыСПоставщикамиОстаткиИОбороты.ДвижениеДолгаНачальныйОстаток) КАК ДвижениеДолгаНачальныйОстаток
       |ИЗ
       |  РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты(
       |  &НачДата
       |  , &КонДата
       |  , Период
       |  , ДвиженияИГраницыПериода
       |  , ИСТИНА
       |  //УсловиеОрганизацияИ РасчетыСПоставщикамиОстаткиИОбороты.Организация = &Организация
       |  //УсловиеСкладИ РасчетыСПоставщикамиОстаткиИОбороты.Склад  = &Склад
       |  //УсловиеПоставщикИ РасчетыСПоставщикамиОстаткиИОбороты.Поставщик  = &Поставщик
       |  //УсловиеДоговорИ РасчетыСПоставщикамиОстаткиИОбороты.Договор  = &Договор
       |  ) КАК РасчетыСПоставщикамиОстаткиИОбороты
       |
       |СГРУППИРОВАТЬ ПО
       |  РасчетыСПоставщикамиОстаткиИОбороты.Организация,
       |  РасчетыСПоставщикамиОстаткиИОбороты.Склад,
       |  РасчетыСПоставщикамиОстаткиИОбороты.Поставщик,
       |  РасчетыСПоставщикамиОстаткиИОбороты.Договор
       |
       |УПОРЯДОЧИТЬ ПО
       |  Организация,
       |  Склад,
       |  Поставщик,
       |  Договор,
       |  ДвижениеДолгаНачальныйОстаток
       |ИТОГИ
       |  СУММА(ДвижениеДолгаНачальныйОстаток)
       |ПО
       |  ОБЩИЕ,
       |  Организация,
       |  Склад,
       |  Поставщик,
       |  Договор
       |";
       Запрос.УстановитьПараметр("НачДата", НачПериода);
       Запрос.УстановитьПараметр("КонДата", КонПериода);
       
       // Условие по организации
       Если СокрЛП(Организация) <> "" Тогда
         Запрос.Текст = СтрЗаменить(Запрос.Текст, "//УсловиеОрганизация", "");
         Запрос.УстановитьПараметр("Организация", Организация);
       КонецЕсли;
       
       // Условие по Складу
       Если СокрЛП(Склад) <> "" Тогда
         Запрос.Текст = СтрЗаменить(Запрос.Текст, "//УсловиеСклад", "");
         Запрос.УстановитьПараметр("Склад", Склад);
       КонецЕсли;
       
       // Условие по Поставщику
       Если СокрЛП(Поставщик) <> "" Тогда
         Запрос.Текст = СтрЗаменить(Запрос.Текст, "//УсловиеПоставщик", "");
         Запрос.УстановитьПараметр("Поставщик", Поставщик);
       КонецЕсли;
       
       // Условие по Договору
       Если СокрЛП(Договор) <> "" Тогда
         Запрос.Текст = СтрЗаменить(Запрос.Текст, "//УсловиеДоговор", "");
         Запрос.УстановитьПараметр("Договор", Договор);
       КонецЕсли;
       
       Результат = Запрос.Выполнить();
       
       // и т.д.
       
    //END
    
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не увидел ответа на:
    А так. Могу предложить писать на СКД.
    А еще какую-то новомодную шнягу придумали - "Построитель запроса" называется.
    Последнее редактирование: 4 сен 2015
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Построитель запроса - оно далеко не новомодная, с 8.0 существует :)
    upload_2015-9-4_16-3-3.png
    Последнее редактирование: 4 сен 2015
  14. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Хм. Да.
    А почему я на него внимание обращал когда про 8.3 читал? Где-то оно упоминалось там, поэтому подумал что что-то новое. Аж интересно стало.
    --- Объединение сообщений, 4 сен 2015 ---
    Хм. А щас ниче не нахожу. Только динамический список.
    Ок. Отредактировал свой пост.

Поделиться этой страницей