Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 2
Обязательные поля
Рассмотрим такой пакетный запрос, в котором по каждому виду цен нам нужно вывести количество позиций номенклатуры, для которых этот вид цен задан:
При выполнении отчета с группировкой по виду цен получаем запрос (первая часть пакета):
Поле «Номенклатура» исключено из запроса. Естественно в отчете получаем неверные данные. Чтобы исправить ситуацию, изменяем роль для поля «Номенклатура». Для этого предварительно необходимо поле включить в окончательный запрос, чтобы редактирование роли было доступно:
В итоге получаем правильный результирующий запрос:
Подобная ситуация может получиться в отчетах, получающих развернутое сальдо и в других запросах, в которых важен набор полей в предложении «СГРУППИРОВАТЬ ПО».
Применение отборов
С помощью расширения языка запросов 1С для СКД можно управлять местом применения отборов. Также нужно знать, что в случае отсутствия элементов расширения языка запросов, система компоновки данных по умолчанию размещает отбор:
Рассматривать будем на таком исходном запросе.
В параметрах виртуальных таблиц при отборе по измерениям:
В секции «ГДЕ» при использовании отборов по ресурсам:
В секции «ИМЕЮЩИЕ» при отборе по полю запроса, вычисляемого с помощью агрегатной функции (в исходный запрос добавлена группировка по номенклатуре и контрагенту):
В документации на диске ИТС написано, что в случае левого соединения двух таблиц, отбор, накладываемый по измерению, отсутствующему в первой (левой) таблице применяется в секции «ГДЕ». Однако в релизе платформе 8.3.15 такое поведение не подтверждается:
При наличии опции «Автозаполнение» система компоновки данных всегда пытается добавить отбор в параметр виртуальной таблицы, если с помощью расширения языка запросов этот отбор не установлен:
Исходный запрос
Если отключить опцию автозаполнения, то отбор будет установлен только там, где было указано:
Исходный запрос
При этом отбор в секции «ИМЕЮЩИЕ» автоматически не добавляется. И добавить его с помощью расширения языка запросов невозможно.
Временные таблицы
Если в запросе пакета используются временные таблицы и данные из этих таблицы не используются в конечном запросе, то такие временные таблицы из пакета исключаются. Причем независимо от опции «Автозаполнение». Эту особенность СКД можно использовать для оптимизации текста запроса, который выполняет платформа 1С. Рассмотрим такой текс запроса:
Было бы хорошо, если первый запрос пакета исключался в случае, когда пользователь захочет выбирать все заказы. Для этого необходимо, чтобы условие в «ГДЕ» стало необязательным. Второй запрос пакета перепишем так:
и посмотрим, что получилось после выполнения:
Это весь запрос. Временная таблица исключена, исключено условие. Но теперь не понятно как быть, если условие по остаткам нужно вернуть в запрос. Как видно СКД добавила алиас «Поле2» и данное поле добавляется в набор доступных полей. Если пользователь сделает отбор по этому полю, то условие вернется в запрос вместе со временной таблицей, но будет это выглядеть совсем не так как нам необходимо:
Чтобы получить нужный результат добавить параметр «ТолькоОстатки» в запрос:
Важно чтобы параметр и условие с подзапросом были в общих скобках «()» и обязательно без алиаса. Добавление алиаса по всей видимости превращает условие в одно из полей и если в настройках нет обращения к нему, то условие из запроса исчезает. Итак, в режиме пользователя мы включаем использование параметра или выключаем. При этом само значение параметра всегда должно быть равно «Истина»:
Если параметр включен, то получаем:
Если параметр выключен, то просто запрос по заказам. Можно сделать то же самое несколько по-другому. Таблицу с остатками добавить через левое соединение как необязательную. И добавлять или не добавлять отбор по полю остатка:
При этом управление отбором для пользователя можно сделать средствами СКД без дополнительных усилий:
В настройках это выглядит как:
Ну и результирующий запрос, в случае если отбор установлен:
Серия статей по СКД
Предыдущая статья .., Следующая статья ...
Автор курсов образовательного проекта Profession Store. Павел Шемякин