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