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

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

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

Анализ исходной проблемы и структуры запроса

Рассмотрим ситуацию: имеется простейший запрос к документу РеализацияТоваровУслуг, где данные выбираются напрямую из объекта документа вместе с его табличной частью. Проблема такого подхода заключается в том, что обращение к вложенной таблице (Товары) внутри запроса к документу крайне неэффективно с точки зрения производительности базы данных SQL. Проанализируем, почему за такой подход опытные разработчики могут высказать резкую критику.

Когда мы пишем РеализацияТоваровУслуг.Товары.(Номенклатура, Количество), платформа 1С вынуждена выполнять сложные преобразования для объединения данных заголовка и строк. Вместо этого в 1С принято строить запросы «от табличной части».

Решение №1: Переход к запросу по табличной части

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

Посмотрим на правильную структуру запроса, которая позволит нам обратиться к реквизитам номенклатуры:


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

В данном примере мы используем таблицу Документ.РеализацияТоваровУслуг.Товары. Это позволяет нам напрямую обращаться к полю Номенклатура каждой строки. Поскольку Номенклатура — это ссылка на справочник, мы можем «разыменовать» её и обратиться к её реквизиту НоменклатурнаяГруппа.

Важный момент: Мы используем конструкцию &НужнаяГруппа — это параметр запроса, который пользователь сможет заполнить перед формированием отчета.

Решение №2: Использование СКД для гибких отборов

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

Рассмотрим подробнее, как добавить отбор без правки текста секции ГДЕ:

  1. В конструкторе схемы компоновки данных на закладке «Наборы данных» просто выберите поле Номенклатура.НоменклатурнаяГруппа в списке полей запроса.
  2. Перейдите на закладку «Настройки».
  3. В нижней части выберите вкладку «Отбор».
  4. Добавьте новое поле отбора и выберите в нем Номенклатура.НоменклатурнаяГруппа.

Такой подход позволяет пользователю в режиме «1С:Предприятие» самостоятельно решать, нужен ли ему отбор в данный момент, и выбирать вид сравнения (например, «В списке» или «Равно»).

Использование расширения языка запросов для СКД

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

Пример запроса с расширением:


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

Использование знака * внутри фигурных скобок позволяет СКД автоматически подставлять доступные поля для иерархического отбора.

Оптимизация: Почему "разыменование" через точку может быть опасным?

Выясним причину, по которой опытные программисты предостерегают от длинных цепочек точек, таких как Ссылка.Контрагент.ГоловнойКонтрагент или Номенклатура.НоменклатурнаяГруппа. На уровне базы данных каждое такое обращение превращается в LEFT JOIN (левое соединение).

Если в вашем отчете тысячи строк, и вы обращаетесь к реквизитам через несколько «точек», отчет может начать тормозить. Проанализируем, как сделать запрос более профессиональным:

  1. Сначала выберите данные во временную таблицу.
  2. Затем соедините эту таблицу со справочником Номенклатура по ссылке.
  3. В соединении укажите условие по номенклатурной группе.

Однако для простых внешних отчетов в «Бухгалтерии предприятия», где объем данных в одной реализации невелик, обращение через точку вполне допустимо и экономит время разработчика.

Нюансы учета в «1С:Бухгалтерии 3.0»

Важно помнить, что в БП 3.0 Номенклатурная группа — это не просто свойство товара. Это аналитический разрез для учета доходов и расходов (счета 20, 90). Рассмотрим два важных аспекта:

Подводя итог, разберем краткий алгоритм действий для создания качественного отчета:

  1. Строим запрос по табличной части Товары документа РеализацияТоваровУслуг.
  2. Выносим поле Номенклатура.НоменклатурнаяГруппа в список полей СКД.
  3. Устанавливаем пользовательский отбор в настройках.
  4. Если отчет охватывает большой период, переходим от использования документов к использованию виртуальных таблиц оборотов регистров.

Следуя этим правилам, мы получим быстрый, надежный и удобный для пользователя инструмент аналитики.

← На главную