При разработке отчетов в системе 1С:Предприятие 8.3 (особенно для конфигурации «Бухгалтерия предприятия 3.0») начинающие программисты часто сталкиваются с задачей фильтрации данных по реквизитам справочников, связанных с документами. Одной из типичных задач является отбор по номенклатурной группе. В этой статье мы подробно разберем, как правильно составить запрос, почему не стоит использовать вложенные таблицы документов в отчетах и как эффективно настроить Систему компоновки данных (СКД) для решения этой задачи.
Рассмотрим ситуацию: имеется простейший запрос к документу РеализацияТоваровУслуг, где данные выбираются напрямую из объекта документа вместе с его табличной частью. Проблема такого подхода заключается в том, что обращение к вложенной таблице (Товары) внутри запроса к документу крайне неэффективно с точки зрения производительности базы данных SQL. Проанализируем, почему за такой подход опытные разработчики могут высказать резкую критику.
Когда мы пишем РеализацияТоваровУслуг.Товары.(Номенклатура, Количество), платформа 1С вынуждена выполнять сложные преобразования для объединения данных заголовка и строк. Вместо этого в 1С принято строить запросы «от табличной части».
Чтобы иметь возможность легко установить отбор по номенклатурной группе, нам нужно изменить источник данных в запросе. Вместо таблицы самого документа выберем таблицу его строк. Разберем этот процесс по шагам.
Посмотрим на правильную структуру запроса, которая позволит нам обратиться к реквизитам номенклатуры:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Количество КАК Количество,
РеализацияТоваровУслугТовары.Цена КАК Цена,
РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа = &НужнаяГруппа
В данном примере мы используем таблицу Документ.РеализацияТоваровУслуг.Товары. Это позволяет нам напрямую обращаться к полю Номенклатура каждой строки. Поскольку Номенклатура — это ссылка на справочник, мы можем «разыменовать» её и обратиться к её реквизиту НоменклатурнаяГруппа.
Важный момент: Мы используем конструкцию &НужнаяГруппа — это параметр запроса, который пользователь сможет заполнить перед формированием отчета.
Если вы разрабатываете отчет на базе Системы компоновки данных (СКД), вам не обязательно жестко прописывать условие в тексте запроса. Платформа предоставляет более элегантные механизмы.
Рассмотрим подробнее, как добавить отбор без правки текста секции ГДЕ:
Номенклатура.НоменклатурнаяГруппа в списке полей запроса.Номенклатура.НоменклатурнаяГруппа.Такой подход позволяет пользователю в режиме «1С:Предприятие» самостоятельно решать, нужен ли ему отбор в данный момент, и выбирать вид сравнения (например, «В списке» или «Равно»).
Для еще большей гибкости проанализируем использование фигурных скобок {}. Это специальные инструкции СКД, которые добавляют условия в итоговый SQL-запрос только тогда, когда пользователь включил соответствующий флаг в настройках отчета.
Пример запроса с расширением:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
{ГДЕ
РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа.* КАК НоменклатурнаяГруппа}
Использование знака * внутри фигурных скобок позволяет СКД автоматически подставлять доступные поля для иерархического отбора.
Выясним причину, по которой опытные программисты предостерегают от длинных цепочек точек, таких как Ссылка.Контрагент.ГоловнойКонтрагент или Номенклатура.НоменклатурнаяГруппа. На уровне базы данных каждое такое обращение превращается в LEFT JOIN (левое соединение).
Если в вашем отчете тысячи строк, и вы обращаетесь к реквизитам через несколько «точек», отчет может начать тормозить. Проанализируем, как сделать запрос более профессиональным:
Номенклатура по ссылке.Однако для простых внешних отчетов в «Бухгалтерии предприятия», где объем данных в одной реализации невелик, обращение через точку вполне допустимо и экономит время разработчика.
Важно помнить, что в БП 3.0 Номенклатурная группа — это не просто свойство товара. Это аналитический разрез для учета доходов и расходов (счета 20, 90). Рассмотрим два важных аспекта:
В ИЕРАРХИИ. Если вы укажете просто Равно и выберете папку, отчет будет пустым, так как система будет искать товары, привязанные именно к папке, а не к элементам внутри неё.Продажи или данные бухгалтерских проводок по счету 90.01. Это значительно ускорит отчет, так как регистры оптимизированы для быстрых выборок.Подводя итог, разберем краткий алгоритм действий для создания качественного отчета:
Товары документа РеализацияТоваровУслуг.Номенклатура.НоменклатурнаяГруппа в список полей СКД.Следуя этим правилам, мы получим быстрый, надежный и удобный для пользователя инструмент аналитики.