Как в отчете 1С вывести данные по группе номенклатуры, а не только по одному товару?

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

Часто при разработке отчетов в 1С возникает стандартная задача: отчет отлично работает, когда пользователь выбирает один конкретный товар, но перестает выводить данные, как только в качестве параметра указывается группа номенклатуры (например, все товары одного производителя). Это происходит потому, что запрос отчета не умеет "раскрывать" группу и получать все вложенные в нее элементы.

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

Решение 1: Использование оператора "В ИЕРАРХИИ"

Основной инструмент для работы с иерархическими данными в запросах 1С — это оператор В ИЕРАРХИИ. Он позволяет выбрать не только указанный элемент, но и все дочерние элементы, находящиеся под ним в иерархии. Это именно то, что нам нужно для групп номенклатуры.

Оператор можно применять как в секции ГДЕ обычного запроса, так и в параметрах виртуальных таблиц регистров, что является более предпочтительным и производительным способом.

Посмотрим на пример использования в условии ГДЕ:

Предположим, у нас есть простой запрос, который выбирает номенклатуру. Чтобы он работал с группами, нужно добавить условие с В ИЕРАРХИИ.


ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ(&ТоварИлиГруппа)

В этом примере &ТоварИлиГруппа — это параметр запроса, в который передается значение, выбранное пользователем в отчете. Если пользователь выберет конкретный товар, запрос вернет только его. Если же он выберет группу, запрос вернет и саму группу, и все товары и подгруппы внутри нее.

Применение в параметрах виртуальной таблицы:

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

Рассмотрим пример с виртуальной таблицей оборотов регистра накопления "Продажи":


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

Здесь условие отбора по иерархии передается четвертым параметром в виртуальную таблицу Обороты. Это самый правильный и быстрый способ для получения данных из регистров по группе номенклатуры.

Решение 2: Исключение самих групп из выборки

После применения оператора В ИЕРАРХИИ вы можете заметить, что в результат попадают не только конечные товары, но и сами папки (группы номенклатуры). Как правило, в отчетах по продажам или остаткам нужно видеть только товары. Чтобы отфильтровать группы, используется стандартный реквизит иерархических справочников — ЭтоГруппа.

Этот реквизит имеет булев тип: ИСТИНА для групп и ЛОЖЬ для элементов. Нам нужно добавить в запрос проверку, что этот реквизит равен ЛОЖЬ.

Важный момент: это условие нужно применять совместно с В ИЕРАРХИИ, а не вместо него. Если использовать только Номенклатура.ЭтоГруппа = ЛОЖЬ и выбрать в параметре группу, то отчет ничего не выведет, так как для самой группы это условие не выполняется. В этом и заключалась частая ошибка.

Правильная комбинация условий выглядит так:


ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ(&ТоварИлиГруппа)
    И Номенклатура.ЭтоГруппа = ЛОЖЬ

Это условие сначала найдет все вложенные элементы благодаря В ИЕРАРХИИ, а затем из полученного списка уберет все записи, которые являются группами, оставив только конечные элементы номенклатуры.

Настройка в Системе Компоновки Данных (СКД)

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

Рассмотрим, как настроить отбор по группе на уровне пользовательских настроек:

  1. В настройках варианта отчета перейдите на закладку "Отбор".

  2. Добавьте новый элемент отбора по полю "Номенклатура".

  3. В колонке "Вид сравнения" выберите один из специальных видов для иерархии: "В группе" или "В группе из списка".

  4. Сохраните настройки. Теперь, когда пользователь будет выбирать значение для этого поля, он сможет указать группу, и СКД автоматически применит правильную конструкцию В ИЕРАРХИИ при формировании запроса к базе данных.

Этот способ является наиболее гибким, так как позволяет пользователю самому решать, как фильтровать данные: по одному элементу, по группе или по списку элементов, используя стандартные возможности интерфейса 1С.

Подведем итог: для корректного вывода данных по группам номенклатуры ключевым является использование оператора В ИЕРАРХИИ. Наиболее эффективно применять его в параметрах виртуальных таблиц. Для исключения самих папок из результата добавляйте условие И Номенклатура.ЭтоГруппа = ЛОЖЬ. А в отчетах на СКД используйте встроенные виды сравнения, такие как "В группе", для удобной пользовательской настройки.

← На главную