В конфигурации «Управление производственным предприятием» (УПП) или «Комплексная автоматизация 1.1» большинство аналитических отчетов построены на технологии Универсального отчета. Несмотря на то, что современным стандартом является Система компоновки данных (СКД), поддержка и модификация существующих типовых отчетов требует глубокого понимания работы объекта ПостроительОтчета. В этой статье мы разберем, как устроена архитектура таких отчетов, где искать текст запроса и как добавить в них собственные поля.
Для начала проанализируем структуру типового отчета, например, «Анализ внутренних заказов». В отличие от простых отчетов, где логика может быть сосредоточена в форме, Универсальный отчет — это мощная надстройка. Основная работа происходит в модуле объекта самого отчета и в общем модуле УниверсальныйОтчет. Рассмотрим основные составляющие:
Разберем ситуацию, когда нам нужно добавить новую колонку (поле) в отчет. Первым делом мы должны найти, где формируется запрос. Откроем модуль объекта отчета и найдем процедуру УстановитьНачальныеНастройки. В ней вы увидите присвоение длинной строки свойству УниверсальныйОтчет.ПостроительОтчета.Текст.
Важно помнить об особенностях синтаксиса ПостроительОтчета. Запрос содержит секции в фигурных скобках {}. Эти секции — инструкции для построителя, которые позволяют пользователю управлять составом полей. Рассмотрим на примере:
ТекстЗапроса = "
|ВЫБРАТЬ
| ВнутреннийЗаказ.Ссылка КАК Заказ,
| ВнутреннийЗаказ.Дата КАК ДатаЗаказа,
| ВнутреннийЗаказ.Склад КАК Склад
| {ВЫБРАТЬ
| Заказ.*,
| ДатаЗаказа,
| Склад.*}
|ИЗ
| Документ.ВнутреннийЗаказ КАК ВнутреннийЗаказ
|{ГДЕ
| ВнутреннийЗаказ.Ссылка.* КАК Заказ,
| ВнутреннийЗаказ.Склад.* КАК Склад}
|{УПОРЯДОЧИТЬ ПО
| Заказ.*,
| Склад.*}
|ИТОГИ ПО
| ОБЩИЕ
|{ИТОГИ ПО
| Заказ.*,
| Склад.*}";
Если мы хотим добавить новое поле, например, «Организация», нам нужно выполнить следующие действия:
ВнутреннийЗаказ.Организация КАК Организация в основной список ВЫБРАТЬ.Организация.* в секцию {ВЫБРАТЬ ...}, чтобы поле стало доступным в настройках.ВнутреннийЗаказ.Организация.* КАК Организация в секцию {ГДЕ ...} для возможности фильтрации.Просто изменить текст запроса недостаточно. Чтобы Универсальный отчет «увидел» новые данные и корректно отобразил их в диалоге настроек, их нужно зарегистрировать программно. Рассмотрим подробнее использование методов объекта УниверсальныйОтчет в той же процедуре УстановитьНачальныеНастройки.
Для добавления обычного поля (измерения или реквизита) используем метод ДобавитьПоле:
УниверсальныйОтчет.ДобавитьПоле("Организация", НоваяСтруктураПолей, "Организация", "Организация");
Если же мы добавляем числовой ресурс, который должен суммироваться (например, количество или сумма), необходимо использовать регистрацию показателей:
УниверсальныйОтчет.ДобавитьПоказатель("КоличествоОстаток", "Количество (остаток)", Истина, "ЧЦ=15; ЧДЦ=3");
Здесь третий параметр (Истина) указывает на то, что данный показатель будет включен в отчет по умолчанию при первом открытии.
Часто в УПП запросы в отчетах собираются динамически из кусочков строк в зависимости от параметров. Выясним причину, по которой отчет выдает не те данные, проанализировав финальный запрос. Посмотрим на алгоритм действий в режиме отладки:
УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент).УниверсальныйОтчет.ПостроительОтчета.ПолучитьЗапрос().Текст.Важный нюанс: ПостроительОтчета может некорректно работать со сложными временными таблицами. Если ваш запрос использует МенеджерВременныхТаблиц, убедитесь, что все поля временных таблиц, которые должны быть доступны пользователю, явно описаны в финальном пакете запроса.
Рассмотрим специфику конкретного отчета, упомянутого в теме. «Анализ внутренних заказов» часто использует объединения (UNION) данных из регистров накопления и табличных частей документов. Если ваша задача — «добавить свою строчку», проанализируйте, не является ли эта строка результатом объединения нескольких выборок. В этом случае поле нужно добавить в каждый блок ОБЪЕДИНИТЬ ВСЕ внутри запроса.
Также обратите внимание на предопределенные макеты. Если Универсальный отчет использует свой макет (свойство УниверсальныйОтчет.Макет), то добавление поля в запрос может не привести к его автоматическому появлению в печатной форме, если макет жестко зафиксирован. Однако в 90% случаев в УПП используется стандартное оформление, которое расширяется автоматически при добавлении полей в группировки или выбранные поля.
Если вы только начинаете работать с УПП, придерживайтесь следующей стратегии при изменении отчетов:
ПостроительОтчета понимает расширения языка запросов, и конструктор выделит их на закладке «Компоновка данных» (в старых версиях — закладка «Построитель»).Подытожим: работа с Универсальным отчетом требует внимательности к деталям в процедуре инициализации. Понимая связь между ТекстомЗапроса, методами ДобавитьПоле и объектом ПостроительОтчета, вы сможете модифицировать любые типовые отчеты в наследуемых системах на базе 1С 8.2 и 8.3.