В процессе разработки отчетов часто возникает задача сравнения показателей за разные периоды, например, количество позиций в заказах за прошлый и текущий год. Рассмотрим, как эффективно решить эту задачу средствами языка запросов 1С, избегая дублирования кода и лишних сложностей.
Это наиболее компактный способ, если периоды заранее известны. Мы можем добавить условие прямо внутри оператора ВЫБРАТЬ. Суть метода заключается в проверке даты документа и заполнении колонки только при выполнении заданного условия.
Разберем пример реализации:
ВЫБРАТЬ
Заказ.Контрагент КАК Контрагент,
Заказ.Менеджер КАК Менеджер,
СУММА(ВЫБОР
КОГДА Заказ.Дата МЕЖДУ ДАТАВРЕМЯ(2020, 1, 1) И ДАТАВРЕМЯ(2020, 12, 31)
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК Количество_2020
ИЗ
Документ.ЗаказПоставщику.Товары КАК Заказ
СГРУППИРОВАТЬ ПО
Заказ.Контрагент,
Заказ.Менеджер
Обратите внимание на использование ИНАЧЕ 0 внутри конструкции ВЫБОР. Это гарантирует, что в случае отсутствия данных за указанный период, мы получим числовой ноль, а не значение NULL, что значительно упрощает дальнейшую обработку данных в СКД.
Если задача требует более сложной логики или отчет строится на базе большого объема данных, логичнее разнести расчеты по временным таблицам, а затем объединить их с основной таблицей документов.
Рассмотрим по шагам логику такого построения:
ПОМЕСТИТЬ.Документ.ЗаказПоставщику с нашими временными таблицами через ЛЕВОЕ СОЕДИНЕНИЕ.Пример объединения данных:
ВЫБРАТЬ
Док.Ссылка,
Вт2019.Количество КАК НК_2019,
Вт2020.Количество КАК НК_2020
ИЗ
Документ.ЗаказПоставщику КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ втКоличество2019 КАК Вт2019
ПО Вт2019.Ссылка = Док.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ втКоличество2020 КАК Вт2020
ПО Вт2020.Ссылка = Док.Ссылка
В процессе работы над запросами важно помнить о следующих правилах:
ГОД(Дата) или МЕСЯЦ(Дата) в секции ГДЕ принудительно заставляет систему перебирать все записи таблицы, что отменяет использование индексов. Всегда лучше передавать параметры &ДатаНачала и &ДатаКонца и использовать оператор МЕЖДУ.КОЛИЧЕСТВО всегда возвращает число. Обертывание её в ЕСТЬNULL чаще всего избыточно, если вы не выполняете внешнее соединение с таблицами, где записей может не быть.Системы компоновки данных (СКД). Вместо создания множества колонок в запросе, вы можете передать «сырые» данные с полем Дата, а группировку по годам настроить в структуре отчета, используя функцию НАЧАЛОПЕРИОДА. Это позволит пользователю самостоятельно менять уровни детализации без участия программиста.Проанализировав эти подходы, вы сможете создавать гибкие и производительные отчеты, которые будут легко адаптироваться под изменяющиеся потребности пользователей, не требуя переписывания кода каждый год.