В типовых конфигурациях 1С, построенных на «обычных формах» (таких как УПП 1.3, УТ 10.3 или КА 1.1), «Универсальный отчет» является мощным инструментом. Однако часто возникает вопрос: как заставить его работать не с типовым регистром, а с вашим сложным произвольным запросом? Давайте подробно разберем, как это реализовать, и выясним технические нюансы работы этого механизма. При необходимости можно изучить примеры практической работы и доработки Универсального отчета для УПП 1.3.
Первое, что нам необходимо уяснить: классический «Универсальный отчет» работает на базе ПостроителяОтчета, а не Системы компоновки данных (СКД). Несмотря на то что в макетах некоторых отчетов (например, в УПП) можно встретить схемы СКД, они часто являются «заделами на будущее» или артефактами переходного периода и программно не используются. Вся магия формирования происходит через объект УниверсальныйОтчет, который инкапсулирует в себе настройки ПостроителяОтчета.
Для создания отчета на базе собственного запроса проще всего взять за образец существующий типовой отчет, использующий запрос, например, «Валовая прибыль». Основная работа будет вестись в модуле отчета в процедуре УстановитьНачальныеНастройки().
Рассмотрим структуру настройки. Сначала нам нужно отключить выбор регистра, так как мы будем использовать свой текст запроса, и задать имя отчета:
УниверсальныйОтчет.мНазваниеОтчета = "Мой произвольный отчет";
УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь; // Отключаем выбор регистра пользователем
УниверсальныйОтчет.ИмяРегистра = ""; // Оставляем пустым, так как запрос ручной
Запрос для «Универсального отчета» должен быть написан с соблюдением синтаксиса ПостроителяОтчета. Главная особенность здесь — использование фигурных скобок {}. Именно они позволяют пользователю в режиме «Предприятие» выбирать поля в настройках, добавлять отборы и условия.
Давайте проанализируем пример запроса, который мы можем внедрить:
ТекстЗапроса = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Продажи.Номенклатура КАК Номенклатура,
| Продажи.КоличествоОборот КАК Количество,
| Продажи.СтоимостьОборот КАК Сумма
| //ПОЛЯ_СВОЙСТВА
| //ПОЛЯ_КАТЕГОРИИ
|{ВЫБРАТЬ
| Номенклатура.*,
| Количество,
| Сумма
| //ПС_ВЫБРАТЬ
|}
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, , ) КАК Продажи
|{ГДЕ
| Продажи.Номенклатура.*
| //ПС_ГДЕ
|}
|{ИТОГИ ПО
| Номенклатура.*
| //ПС_ИТОГИ
|}
|АВТОУПОРЯДОЧИВАНИЕ";
Важный момент: Обратите внимание на комментарии типа //ПОЛЯ_СВОЙСТВА. Они служат маркерами для механизма автоматического добавления свойств и категорий. Если вы планируете использовать метод УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса), эти метки обязательны.
Одной из главных ошибок при встраивании своего запроса является отсутствие регистрации показателей. Если вы просто передадите запрос в построитель, отчет может вывестись пустым или без итогов. Мы должны явно сказать «Универсальному отчету», какие поля являются ресурсами (показателями):
// Добавляем показатель: ИмяПоля, Синоним, ИспользоватьПоУмолчанию, Формат
УниверсальныйОтчет.ДобавитьПоказатель("Количество", "Кол-во", Истина, "ЧЦ=15; ЧДЦ=3");
УниверсальныйОтчет.ДобавитьПоказатель("Сумма", "Сумма реализации", Истина, "ЧЦ=15; ЧДЦ=2");
Затем передаем текст запроса в построитель:
УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;
Если нам нужно, чтобы в отчете можно было выводить свойства (например, «Цвет» или «Размер» номенклатуры), мы должны выполнить привязку метаданных. Проанализируем, как это делается для номенклатуры:
УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Истина;
УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина;
УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля(
"Продажи.Номенклатура",
"Номенклатура",
"Номенклатура",
ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура
);
// Обновляем текст запроса с учетом добавленных свойств
УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса);
УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;
Разберем ситуацию, когда пользователь вставляет произвольный запрос, но в отчете ничего не выводится или нет настроек. Выясним причину:
ПостроителеОтчета обязательно должна присутствовать секция ИТОГИ ПО, причем поля в ней должны быть обернуты в фигурные скобки {ИТОГИ ПО ...}.&ДатаНач и &ДатаКон. Если в вашем запросе используются другие имена параметров, данные не попадут в выборку.УниверсальныйОтчет.мРежимВводаПериода = 1;. По умолчанию стоит 0 (произвольный период), что требует двух дат.Рассмотрим ситуацию, когда нужно вывести свойства договоров: договора по вертикали, названия свойств по горизонтали, а значения — в пересечении. Для реализации такой кросс-таблицы в «Универсальном отчете» недостаточно просто написать ВЫБРАТЬ.
Необходимо программно настроить измерения колонок построителя:
// В процедуре УстановитьНачальныеНастройки после задания текста запроса:
НовоеИзмерение = УниверсальныйОтчет.ПостроительОтчета.ИзмеренияКолонки.Добавить("Свойство");
НовоеИзмерение.ТипИзмерения = ТипИзмеренияПостроителяОтчета.Элементы;
Без этой настройки ПостроительОтчета не поймет, что свойство нужно выносить в «шапку» колонок, и выведет все данные в одну вертикальную таблицу. Для вывода сопутствующих сведений также подойдет способ добавления контактной информации в отчеты на базе Универсального отчета встроенными средствами.
Мы выяснили, что интеграция своего запроса в «Универсальный отчет» — это не просто вставка текста SELECT. Это комплексная настройка, включающая правильную разметку запроса фигурными скобками, регистрацию показателей через методы объекта УниверсальныйОтчет и корректную инициализацию параметров периода. Используя эти шаги, вы сможете превратить стандартный инструмент в гибкий отчет любой сложности.