Как правильно использовать разные параметры дат для разных таблиц в СКД?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки отчетов на системе компоновки данных (СКД) часто возникают ситуации, когда требуется получить данные из одного периода (например, заказы за месяц), а затем дополнить их аналитикой из другого периода (например, оплаты за весь год). При попытке реализовать это через параметры виртуальных таблиц часто возникают конфликты: СКД автоматически «уравнивает» параметры или игнорирует настройки пользователя. Давайте разберем, почему это происходит и как правильно настроить такой запрос.

Разбор причин некорректной работы параметров

Когда вы добавляете параметры вида {&ДатаНач} в текст запроса, СКД автоматически создает их в списке параметров. Основные проблемы возникают из-за следующих факторов:

  1. Автоматическая оптимизация: Если вы используете одинаковые имена параметров в разных виртуальных таблицах, СКД считает, что они должны иметь одно и то же значение. Попытка установить разные значения для разных таблиц приводит к тому, что система принудительно синхронизирует их.
  2. Конфликт с настройками СКД: Если вы вручную создали параметры в закладке «Параметры», настройки СКД могут вступать в противоречие с тем, что написано в тексте запроса.
  3. Фильтрация через ГДЕ против виртуальных таблиц: Условия внутри параметров виртуальной таблицы работают на этапе формирования физического запроса к СУБД. Если вы используете конструкцию ГДЕ, фильтрация происходит уже после выборки, что может негативно сказаться на производительности, но при этом позволяет более гибко управлять логикой отбора.

Решение через временные таблицы и блок ГДЕ

Наиболее надежный способ — это разбить запрос на логические этапы с помощью временных таблиц. В этом случае мы сначала выбираем нужные заказы, а затем соединяем их с полными данными регистров. Рассмотрим пример реализации:


ВЫБРАТЬ 
    Обороты.ЗаказКлиента КАК Заказ, 
    Обороты.СуммаПриход КАК Сумма
ПОМЕСТИТЬ втЗаказы
ИЗ РегистрНакопления.ЗаказыКлиентов.Обороты(,, Регистратор,) КАК Обороты
ГДЕ Обороты.Регистратор.Дата МЕЖДУ &ДатаН И &ДатаО;

ВЫБРАТЬ 
    Заказы.Заказ, 
    Реализации.СуммаРасход КАК СуммаПродажи
ИЗ втЗаказы КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыКлиентов.Обороты(,, Регистратор,) КАК Реализации
ПО Заказы.Заказ = Реализации.ЗаказКлиента;

В данном примере мы сознательно убрали параметры из виртуальной таблицы Обороты и перенесли условие в секцию ГДЕ. Это позволяет избежать конфликтов имен параметров и гарантирует, что &ДатаН и &ДатаО будут применены только к заказам, а для реализаций будет выбрано все, что соответствует условию соединения.

Использование связи наборов данных в СКД

Если вы хотите избежать написания сложных соединений внутри одного текста запроса, рекомендуется использовать механизм «Связи наборов данных». Этот метод является «родным» для СКД и позволяет настроить взаимодействие таблиц визуально.

Разберем процесс по шагам:

  1. Создайте в СКД три отдельных набора данных: Заказы, Реализации, Оплаты.
  2. В каждом наборе данных укажите свои собственные параметры периода (например, &ПериодЗаказов и &ПериодОплат). Поскольку они определены в разных наборах, СКД не будет их конфликтно синхронизировать.
  3. Перейдите на вкладку «Связи наборов данных».
  4. Добавьте связь: Источник — Заказы, Приемник — Реализации. В качестве условия связи укажите ЗаказКлиента = ЗаказКлиента.
  5. Повторите аналогичное действие для набора Оплаты.

Таким образом, СКД сама сформирует итоговый запрос, а вы сможете гибко управлять фильтрами для каждой группы документов независимо друг от друга.

Важные советы по работе с регистрами оплат

При работе с оплатами помните, что поле Регистратор в регистре РасчетыСКлиентами не всегда содержит сам документ оплаты (например, ПКО или Поступление на расчетный счет). Часто там находится документ-основание. Если вы не видите нужных данных, проверьте структуру аналитики регистра. Возможно, потребуется связать данные через объект РасчетыСКлиентами.ОбъектРасчетов, так как именно он является связующим звеном между заказом и фактической оплатой.

Всегда анализируйте план запроса, если используете ГДЕ для больших массивов данных. Если данных становится слишком много, лучше возвращаться к использованию параметров виртуальных таблиц, но с использованием уникальных имен (например, &ДатаНачЗаказы, &ДатаНачОплаты), которые затем программно или через настройки СКД заполняются нужными вам значениями.

← На главную