Как сделать отбор в СКД по товару с учетом его комплектующих?

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

При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда стандартный механизм отборов платформы отсекает необходимые записи. Типичный пример — отчет по остаткам, в котором пользователь выбирает конкретную номенклатуру (товар), но помимо самого товара в результат должны попадать и его комплектующие (составляющие из спецификации или регистра сведений).

Если наложить обычный пользовательский отбор по полю Номенклатура, платформа 1С автоматически подставит условие фильтрации во все секции ГДЕ и в параметры виртуальных таблиц. В результате остатки по комплектующим будут полностью отсечены, так как комплектующая и сам товар — это разные элементы справочника.

Разберем по шагам, какими способами можно решить эту задачу в СКД и красиво выводить данные в отчете.

Причина возникновения проблемы

Проанализируем архитектуру работы СКД при автозаполнении настроек. По умолчанию в СКД включен флаг Автозаполнение. Когда пользователь накладывает отбор по полю Номенклатура = [Выбранный Товар], система транслирует это условие напрямую к таблице остатков:


ГДЕ
    РегистрНакопления.ТоварыНаСкладах.Остатки.Номенклатура = &П1

Так как комплектующие имеют собственные ссылки в справочнике Номенклатура, они не проходят проверку этим условием. Наша задача — разгрузить стандартное поле отбора и дать СКД инструкцию запрашивать данные по собственным правилам.

Способ 1. Использование расширения языка запросов {ГДЕ ... КАК ...}

Самый простой и эффективный способ — переопределить поле отбора в тексте запроса с помощью синтаксиса расширения языка запросов СКД. Этот метод позволяет разделить реальное поле таблицы и поле, по которому пользователь устанавливает отбор в настройках.

Рассмотрим порядок действий при настройке запроса:

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

Способ 2. Добавление группировочного поля назначения

Посмотрим на другой подход — создание дополнительной колонки (например, ГотоваяПродукция или Назначение), которая будет связывать комплектующую с главным товаром.

В этом случае в запросе объединяются две выборки или используется левое соединение со спецификациями/регистром комплектующих:

Настроив отбор по колонке Назначение, пользователь выбирает целевой товар, а СКД выбирает из БД как сам товар, так и все его комплектующие, так как у них совпадает значение в этой колонке.

Способ 3. Отключение автозаполнения и ручная настройка параметров

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

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

Использование описанных механизмов позволяет гибко управлять выборкой данных в СКД, сохраняя корректные показатели остатков как по основной номенклатуре, так и по всем ее составляющим.

← На главную