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

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

При разработке внешних отчетов для «1С:Бухгалтерия 3.0» (БП 3.0) начинающие программисты часто сталкиваются с дилеммой: как правильно построить запрос к документам, чтобы получить детальную информацию по товарам, сохранив при этом возможность фильтрации по специфическим реквизитам, таким как Номенклатурная группа. В этой статье мы подробно разберем, как оптимизировать запрос, правильно обратиться к данным табличной части и настроить гибкие отборы в системе компоновки данных (СКД).

Выбор источника данных: Документ или Табличная часть?

Рассмотрим типичную ошибку при проектировании запроса. Часто разработчики пытаются выбрать данные напрямую из таблицы документов, например, Документ.РеализацияТоваровУслуг. При таком подходе табличная часть «Товары» попадает в результат запроса как вложенная таблица значений. Это крайне неудобно для вывода в отчет и накладывает ограничения на фильтрацию.

Правильный подход — строить запрос, обращаясь непосредственно к табличной части документа. Это позволит нам получить плоскую таблицу, где каждая строка — это отдельная позиция товара с его ценой, количеством и ссылкой на родительский документ. Проанализируем пример корректного выбора источника:


ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка КАК Документ,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    РеализацияТоваровУслугТовары.Количество КАК Количество,
    РеализацияТоваровУслугТовары.Цена КАК Цена
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

Такая структура гораздо нагляднее и проще в обработке механизмом СКД.

Как получить данные из шапки документа (Контрагент, Дата, Номер)

Когда мы выбираем данные из табличной части, у нас возникает вопрос: как вытащить реквизиты, принадлежащие всему документу в целом? В 1С это решается обращением через точку от поля Ссылка. Рассмотрим подробнее, как добавить в нашу выборку контрагента и номер документа:


ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер,
    РеализацияТоваровУслугТовары.Ссылка.Дата КАК Дата,
    РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    РеализацияТоваровУслугТовары.Количество КАК Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА

Важное замечание: Каждое обращение через точку (например, Ссылка.Контрагент) создает неявное левое соединение в SQL-запросе. Для небольших отчетов это допустимо, но при работе с огромными массивами данных (десятки тысяч документов) рекомендуется использовать явное соединение с таблицей документа для повышения производительности.

Установка отбора по номенклатурной группе

Теперь перейдем к основной задаче: как ограничить выборку конкретной номенклатурной группой. Здесь важно не путать два понятия:

  1. Иерархия номенклатуры — это группы (папки) внутри самого справочника Номенклатура. Для отбора по ним используется оператор В ИЕРАРХИИ.
  2. Номенклатурная группа — это отдельный справочник, ссылка на который хранится в реквизите карточки номенклатуры.

Выясним, как прописать условие в запросе, если нам нужно отобрать товары, принадлежащие определенной группе видов деятельности (Номенклатурной группе):


ГДЕ
    РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа

В данном случае &НоменклатурнаяГруппа — это параметр запроса, который мы можем передать программно или через настройки СКД.

Использование расширения языка запросов СКД (Фигурные скобки)

Для того чтобы сделать отчет максимально гибким, профессионалы используют специальные конструкции СКД — фигурные скобки {}. Рассмотрим ситуацию: если вы просто напишете ГДЕ в тексте запроса, параметр станет обязательным. Если пользователь не укажет группу, отчет выдаст ошибку или пустой результат.

Проанализируем пример использования расширения СКД:


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

Что это дает? Если на вкладке «Настройки» в СКД пользователь установит флажок отбора по номенклатурной группе, система сама добавит условие в итоговый SQL-запрос. Если флажок снят — условие игнорируется, и отчет выводит все данные. Это наиболее правильный метод разработки отчетов на базе СКД.

Программная установка параметров

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |ГДЕ
    |   РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа = &Группа";

// Установка значения параметра (например, выбор конкретной группы по наименованию)
НужнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Продукция");
Запрос.УстановитьПараметр("Группа", НужнаяГруппа);

РезультатЗапроса = Запрос.Выполнить();

Рекомендации по оптимизации для БП 3.0

Посмотрим на ситуацию шире. В конфигурации «Бухгалтерия предприятия 3.0» данные о продажах фиксируются не только в документах, но и в регистрах. Если ваша задача — получить итоговые суммы выручки и себестоимости в разрезе номенклатурных групп, зачастую правильнее обращаться к Регистру бухгалтерии (Хозрасчетный) или специализированным регистрам накопления.

Например, выручка отражается на счете 90.01. Номенклатурная группа там выступает в качестве одного из Субконто. Запрос к виртуальной таблице Обороты регистра бухгалтерии будет работать в разы быстрее, чем перебор всех документов РеализацияТоваровУслуг за несколько лет.

Подведем итог: для простого внешнего отчета по документам используйте выборку из табличной части .Товары, обращайтесь к реквизитам шапки через Ссылка.НаименованиеРеквизита и не забывайте использовать фигурные скобки в тексте запроса СКД для обеспечения гибкости настроек пользователя.

← На главную