Как доработать типовой отчет на базе «Универсального отчета» в 1С:УПП?

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

Архитектура Универсального отчета

Для начала проанализируем структуру типового отчета, например, «Анализ внутренних заказов». В отличие от простых отчетов, где логика может быть сосредоточена в форме, Универсальный отчет — это мощная надстройка. Основная работа происходит в модуле объекта самого отчета и в общем модуле УниверсальныйОтчет. Рассмотрим основные составляющие:

  1. Объект ПостроительОтчета: Это фундамент. Он отвечает за генерацию текста запроса, наложение отборов, группировок и формирование итогового макета.
  2. Процедура УстановитьНачальныеНастройки(): Находится в модуле объекта отчета. Именно здесь разработчик описывает «скелет» отчета: текст запроса, доступные поля и показатели.
  3. Интерфейсная часть: Форма отчета обычно содержит только вызовы методов универсального механизма, который автоматически рисует кнопки «Настройка», «Сформировать» и дерево отборов.

Где искать и как менять текст запроса

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

Важно помнить об особенностях синтаксиса ПостроительОтчета. Запрос содержит секции в фигурных скобках {}. Эти секции — инструкции для построителя, которые позволяют пользователю управлять составом полей. Рассмотрим на примере:


ТекстЗапроса = "
|ВЫБРАТЬ
|    ВнутреннийЗаказ.Ссылка КАК Заказ,
|    ВнутреннийЗаказ.Дата КАК ДатаЗаказа,
|    ВнутреннийЗаказ.Склад КАК Склад
|    {ВЫБРАТЬ
|        Заказ.*,
|        ДатаЗаказа,
|        Склад.*}
|ИЗ
|    Документ.ВнутреннийЗаказ КАК ВнутреннийЗаказ
|{ГДЕ
|    ВнутреннийЗаказ.Ссылка.* КАК Заказ,
|    ВнутреннийЗаказ.Склад.* КАК Склад}
|{УПОРЯДОЧИТЬ ПО
|    Заказ.*,
|    Склад.*}
|ИТОГИ ПО
|    ОБЩИЕ
|{ИТОГИ ПО
|    Заказ.*,
|    Склад.*}";

Если мы хотим добавить новое поле, например, «Организация», нам нужно выполнить следующие действия:

  1. Добавить ВнутреннийЗаказ.Организация КАК Организация в основной список ВЫБРАТЬ.
  2. Добавить Организация.* в секцию {ВЫБРАТЬ ...}, чтобы поле стало доступным в настройках.
  3. Добавить ВнутреннийЗаказ.Организация.* КАК Организация в секцию {ГДЕ ...} для возможности фильтрации.

Регистрация полей в коде 1С

Просто изменить текст запроса недостаточно. Чтобы Универсальный отчет «увидел» новые данные и корректно отобразил их в диалоге настроек, их нужно зарегистрировать программно. Рассмотрим подробнее использование методов объекта УниверсальныйОтчет в той же процедуре УстановитьНачальныеНастройки.

Для добавления обычного поля (измерения или реквизита) используем метод ДобавитьПоле:


УниверсальныйОтчет.ДобавитьПоле("Организация", НоваяСтруктураПолей, "Организация", "Организация");

Если же мы добавляем числовой ресурс, который должен суммироваться (например, количество или сумма), необходимо использовать регистрацию показателей:


УниверсальныйОтчет.ДобавитьПоказатель("КоличествоОстаток", "Количество (остаток)", Истина, "ЧЦ=15; ЧДЦ=3");

Здесь третий параметр (Истина) указывает на то, что данный показатель будет включен в отчет по умолчанию при первом открытии.

Как проанализировать итоговый запрос при отладке

Часто в УПП запросы в отчетах собираются динамически из кусочков строк в зависимости от параметров. Выясним причину, по которой отчет выдает не те данные, проанализировав финальный запрос. Посмотрим на алгоритм действий в режиме отладки:

  1. Установим точку останова в модуле объекта отчета на строке УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент).
  2. В табло (Shift+F9) введем выражение: УниверсальныйОтчет.ПостроительОтчета.ПолучитьЗапрос().Текст.
  3. Проанализируем полученный текст. Это именно тот SQL-подобный код, который платформа отправляет в базу данных с учетом всех пользовательских фильтров и настроек.

Важный нюанс: ПостроительОтчета может некорректно работать со сложными временными таблицами. Если ваш запрос использует МенеджерВременныхТаблиц, убедитесь, что все поля временных таблиц, которые должны быть доступны пользователю, явно описаны в финальном пакете запроса.

Особенности отчета «Анализ внутренних заказов»

Рассмотрим специфику конкретного отчета, упомянутого в теме. «Анализ внутренних заказов» часто использует объединения (UNION) данных из регистров накопления и табличных частей документов. Если ваша задача — «добавить свою строчку», проанализируйте, не является ли эта строка результатом объединения нескольких выборок. В этом случае поле нужно добавить в каждый блок ОБЪЕДИНИТЬ ВСЕ внутри запроса.

Также обратите внимание на предопределенные макеты. Если Универсальный отчет использует свой макет (свойство УниверсальныйОтчет.Макет), то добавление поля в запрос может не привести к его автоматическому появлению в печатной форме, если макет жестко зафиксирован. Однако в 90% случаев в УПП используется стандартное оформление, которое расширяется автоматически при добавлении полей в группировки или выбранные поля.

Практические советы для новичков

Если вы только начинаете работать с УПП, придерживайтесь следующей стратегии при изменении отчетов:

Подытожим: работа с Универсальным отчетом требует внимательности к деталям в процедуре инициализации. Понимая связь между ТекстомЗапроса, методами ДобавитьПоле и объектом ПостроительОтчета, вы сможете модифицировать любые типовые отчеты в наследуемых системах на базе 1С 8.2 и 8.3.

← На главную