В процессе разработки отчетов на системе компоновки данных (СКД) часто возникают ситуации, когда требуется получить данные из одного периода (например, заказы за месяц), а затем дополнить их аналитикой из другого периода (например, оплаты за весь год). При попытке реализовать это через параметры виртуальных таблиц часто возникают конфликты: СКД автоматически «уравнивает» параметры или игнорирует настройки пользователя. Давайте разберем, почему это происходит и как правильно настроить такой запрос.
Когда вы добавляете параметры вида {&ДатаНач} в текст запроса, СКД автоматически создает их в списке параметров. Основные проблемы возникают из-за следующих факторов:
ГДЕ, фильтрация происходит уже после выборки, что может негативно сказаться на производительности, но при этом позволяет более гибко управлять логикой отбора.Наиболее надежный способ — это разбить запрос на логические этапы с помощью временных таблиц. В этом случае мы сначала выбираем нужные заказы, а затем соединяем их с полными данными регистров. Рассмотрим пример реализации:
ВЫБРАТЬ
Обороты.ЗаказКлиента КАК Заказ,
Обороты.СуммаПриход КАК Сумма
ПОМЕСТИТЬ втЗаказы
ИЗ РегистрНакопления.ЗаказыКлиентов.Обороты(,, Регистратор,) КАК Обороты
ГДЕ Обороты.Регистратор.Дата МЕЖДУ &ДатаН И &ДатаО;
ВЫБРАТЬ
Заказы.Заказ,
Реализации.СуммаРасход КАК СуммаПродажи
ИЗ втЗаказы КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыКлиентов.Обороты(,, Регистратор,) КАК Реализации
ПО Заказы.Заказ = Реализации.ЗаказКлиента;
В данном примере мы сознательно убрали параметры из виртуальной таблицы Обороты и перенесли условие в секцию ГДЕ. Это позволяет избежать конфликтов имен параметров и гарантирует, что &ДатаН и &ДатаО будут применены только к заказам, а для реализаций будет выбрано все, что соответствует условию соединения.
Если вы хотите избежать написания сложных соединений внутри одного текста запроса, рекомендуется использовать механизм «Связи наборов данных». Этот метод является «родным» для СКД и позволяет настроить взаимодействие таблиц визуально.
Разберем процесс по шагам:
Заказы, Реализации, Оплаты.&ПериодЗаказов и &ПериодОплат). Поскольку они определены в разных наборах, СКД не будет их конфликтно синхронизировать.Заказы, Приемник — Реализации. В качестве условия связи укажите ЗаказКлиента = ЗаказКлиента.Оплаты.Таким образом, СКД сама сформирует итоговый запрос, а вы сможете гибко управлять фильтрами для каждой группы документов независимо друг от друга.
При работе с оплатами помните, что поле Регистратор в регистре РасчетыСКлиентами не всегда содержит сам документ оплаты (например, ПКО или Поступление на расчетный счет). Часто там находится документ-основание. Если вы не видите нужных данных, проверьте структуру аналитики регистра. Возможно, потребуется связать данные через объект РасчетыСКлиентами.ОбъектРасчетов, так как именно он является связующим звеном между заказом и фактической оплатой.
Всегда анализируйте план запроса, если используете ГДЕ для больших массивов данных. Если данных становится слишком много, лучше возвращаться к использованию параметров виртуальных таблиц, но с использованием уникальных имен (например, &ДатаНачЗаказы, &ДатаНачОплаты), которые затем программно или через настройки СКД заполняются нужными вам значениями.