Как правильно указать список номенклатуры с элементами и группами в запросе 1С

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

В практике разработчика 1С часто возникает задача: на форме есть СписокЗначений, в который пользователь может добавить как отдельные товары (элементы), так и целые папки (группы номенклатуры). При построении запроса по остаткам или оборотам важно правильно обработать этот список, чтобы данные выбирались корректно для обоих типов объектов. Рассмотрим подробно, как реализовать такой механизм, какие операторы использовать и как оптимизировать выполнение запроса.

Использование оператора В ИЕРАРХИИ в параметрах виртуальных таблиц

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

Важнейшим правилом при работе с виртуальными таблицами (такими как Остатки, Обороты, ОстаткиИОбороты) является наложение условий непосредственно в параметрах этой таблицы, а не в секции ГДЕ. Проанализируем пример правильного построения запроса:


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

Почему это важно? Рассмотрим разницу механизмов:

Нюансы оператора В ИЕРАРХИИ и производительность

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

Однако стоит помнить о производительности. На уровне SQL-запроса В ИЕРАРХИИ превращается в достаточно тяжелую конструкцию (обычно это соединение с временной таблицей, содержащей все узлы дерева номенклатуры). Если ваш СписокВыбранныхТоваров содержит тысячи позиций, или иерархия справочника очень глубокая, запрос может выполняться медленно. В таких случаях рекомендуется предварительно выгрузить все элементы выбранных групп во временную таблицу и использовать в основном запросе простой оператор В.

Работа с кортежами: отбор по Номенклатуре и Характеристике

Часто в запросах встречается конструкция с использованием кортежей (нескольких полей в скобках). Рассмотрим пример, когда нужно отобрать остатки по конкретным парам «Номенклатура — Характеристика»:


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

Использование кортежей позволяет избежать ситуации «перекрестного» отбора. Если написать условия раздельно (Номенклатура В (&СписокНом) И Характеристика В (&СписокХар)), система выдаст остатки по всем характеристикам из списка для всех товаров из списка. Кортежи же гарантируют, что будет выбрана только та характеристика, которая жестко связана с конкретным товаром в вашей таблице-источнике.

Синтаксис фигурных скобок и динамические условия

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

Текст внутри фигурных скобок — это описание необязательных полей и условий. Проанализируем ситуацию:


ИЗ
    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(, { (Номенклатура).* КАК ПолеНоменклатура }) КАК Остатки

Основные особенности этого подхода:

  1. Гибкость: Если пользователь в настройках отчета не установил отбор по номенклатуре, платформа просто проигнорирует этот фрагмент кода, и запрос выполнится по всем товарам. Это избавляет программиста от необходимости писать сложные условия типа Если ЗначениеЗаполнено(Параметр) Тогда....
  2. Псевдонимы: Конструкция КАК Поле2 внутри скобок — это имя поля, которое увидит пользователь в настройках компоновки или построителя при выборе доступных полей для фильтрации.
  3. Автоматическая обработка иерархии: СКД сама определяет, как применить отбор (равно, в списке или в иерархии), в зависимости от того, что выбрал пользователь в интерфейсе настроек.

Если же вы используете обычный объект Запрос в коде (Новый Запрос), то фигурные скобки будут восприняты как синтаксическая ошибка или проигнорированы. Для динамического изменения текста обычного запроса придется использовать строковые операции или построитель.

Итоги и рекомендации

Подводя итог, для корректной работы со смешанным списком товаров (группы + элементы) придерживайтесь следующих правил:

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

← На главную