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