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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в системе компоновки данных (СКД) нередко возникает необходимость связать два набора данных-запроса, передав из первого набора во второй параметры с определенным условием. Например, требуется получить обороты продаж по номенклатуре за период, но дата начала выборки не должна быть ранее даты документа поступления этой номенклатуры.

Проанализируем ситуацию, разберем возможные способы настройки динамических параметров в связях наборов данных, а также выясним причины логических ошибок и снижения производительности при таком подходе.

Способ 1. Вычисление параметра связи в тексте запроса первого набора данных

Рассмотрим вариант, когда вычисляемое поле создается непосредственно в первом наборе данных (источнике). В тексте запроса используется конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ, сравнивающая дату документа с пользовательским параметром &НП (Начало периода).

Посмотрим на пример запроса первого набора данных:


ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Ссылка КАК ДокументПоступления,
    ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаПоступления,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПоступлениеТоваровУслугТовары.Количество КАК КоличествоПоступило,
    ВЫБОР
        КОГДА ПоступлениеТоваровУслугТовары.Ссылка.Дата > &НП
            ТОГДА ПоступлениеТоваровУслугТовары.Ссылка.Дата
        ИНАЧЕ &НП
    КОНЕЦ КАК ПараметрСвязиДата
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

Запрос второго набора данных (приемника) выбирает данные из виртуальной таблицы с отбором по переданным параметрам:


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

Далее перейдем на вкладку Связи наборов данных и выполним настройку связывания по шагам:

  1. В поле Источник связи указываем первый набор данных.
  2. В поле Приемник связи указываем второй набор данных.
  3. В колонке Условие связи связываем номенклатуру: Номенклатура = Номенклатура.
  4. В колонке Параметры для подчиненного набора указываем соответствие: в параметр НП передаем поле ПараметрСвязиДата, а в параметр Номенклатура передаем поле Номенклатура.

Способ 2. Вычисление выражения на вкладке «Связи наборов данных»

Модифицировать исходный текст запроса необязательно. Платформа 1С позволяет использовать язык выражений компоновки данных непосредственно в таблице связей.

Разберем по шагам, как настроить такую связь без добавления поля ПараметрСвязиДата в запрос:

  1. Оставляем в первом наборе стандартные поля (включая ДатаПоступления и Номенклатура).
  2. На вкладке Связи наборов данных добавляем строку связи.
  3. В колонке Выражение источника для параметра НП прописываем выражение: Выбор Когда ДатаПоступления > &НП Тогда ДатаПоступления Иначе &НП Конец.
  4. В колонке Имя параметра указываем НП.

Анализ методических ошибок: почему отчет может выдавать неверные цифры

При реализации подобной схемы разработчики часто сталкиваются с тем, что итоговые данные продаж оказываются некорректными (задваиваются или обнуляются). Выясним основные причины:

  1. Отсутствие партионного учета в регистре: Если регистр Продажи не содержит измерения партии (документа поступления), запрос оборотов за период [ДатаПоступления, КП] возвращает все продажи указанного товара за этот отрезок времени. Если по номенклатуре было несколько поступлений, одни и те же продажи попадут в строку каждого документа поступления, что приведет к многократному завышению общего итога. Для решения задачи «сколько списано из конкретного поступления» необходимо обращаться к регистрам учета партий или себестоимости.
  2. Несогласованность дат (НачалоПериода > КонецПериода): Если документ поступления проведен позже даты окончания отчета (ДатаПоступления > &КП), вычисленная дата начала станет больше даты конца периода. При таком условии виртуальная таблица оборотов возвратит пустой результат. Чтобы этого избежать, на вкладке связей наборов данных в колонке Условие следует задать ограничение: ДатаПоступления <= &КП.
  3. Проблема производительности (N+1 запросов): Связывание наборов через параметры заставляет СКД выполнять отдельный запрос к базе данных для каждой строки набора-источника. При большом объеме документов поступления это вызывает существенные задержки формирования отчета. Для оптимизации рекомендуется объединять выборку в единый запрос с использованием временных таблиц и соединений.
← На главную