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

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

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

Понимаем архитектуру: Построитель vs СКД

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

Шаг 1. Подготовка структуры отчета

Для создания отчета на базе собственного запроса проще всего взять за образец существующий типовой отчет, использующий запрос, например, «Валовая прибыль». Основная работа будет вестись в модуле отчета в процедуре УстановитьНачальныеНастройки().

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


УниверсальныйОтчет.мНазваниеОтчета = "Мой произвольный отчет";
УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь; // Отключаем выбор регистра пользователем
УниверсальныйОтчет.ИмяРегистра = ""; // Оставляем пустым, так как запрос ручной

Шаг 2. Написание запроса для Построителя

Запрос для «Универсального отчета» должен быть написан с соблюдением синтаксиса ПостроителяОтчета. Главная особенность здесь — использование фигурных скобок {}. Именно они позволяют пользователю в режиме «Предприятие» выбирать поля в настройках, добавлять отборы и условия.

Давайте проанализируем пример запроса, который мы можем внедрить:


ТекстЗапроса = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    Продажи.Номенклатура КАК Номенклатура,
|    Продажи.КоличествоОборот КАК Количество,
|    Продажи.СтоимостьОборот КАК Сумма
|    //ПОЛЯ_СВОЙСТВА
|    //ПОЛЯ_КАТЕГОРИИ
|{ВЫБРАТЬ
|    Номенклатура.*,
|    Количество,
|    Сумма
|    //ПС_ВЫБРАТЬ
|}
|ИЗ
|    РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, , ) КАК Продажи
|{ГДЕ
|    Продажи.Номенклатура.*
|    //ПС_ГДЕ
|}
|{ИТОГИ ПО
|    Номенклатура.*
|    //ПС_ИТОГИ
|}
|АВТОУПОРЯДОЧИВАНИЕ";

Важный момент: Обратите внимание на комментарии типа //ПОЛЯ_СВОЙСТВА. Они служат маркерами для механизма автоматического добавления свойств и категорий. Если вы планируете использовать метод УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса), эти метки обязательны.

Шаг 3. Регистрация показателей

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


// Добавляем показатель: ИмяПоля, Синоним, ИспользоватьПоУмолчанию, Формат
УниверсальныйОтчет.ДобавитьПоказатель("Количество", "Кол-во", Истина, "ЧЦ=15; ЧДЦ=3");
УниверсальныйОтчет.ДобавитьПоказатель("Сумма", "Сумма реализации", Истина, "ЧЦ=15; ЧДЦ=2");

Затем передаем текст запроса в построитель:

УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;

Шаг 4. Настройка свойств и категорий

Если нам нужно, чтобы в отчете можно было выводить свойства (например, «Цвет» или «Размер» номенклатуры), мы должны выполнить привязку метаданных. Проанализируем, как это делается для номенклатуры:


УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Истина;
УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина;

УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля(
    "Продажи.Номенклатура", 
    "Номенклатура", 
    "Номенклатура", 
    ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура
);

// Обновляем текст запроса с учетом добавленных свойств
УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса);
УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;

Разбор типичных проблем

Разберем ситуацию, когда пользователь вставляет произвольный запрос, но в отчете ничего не выводится или нет настроек. Выясним причину:

  1. Отсутствие секции ИТОГИ: Для корректной работы группировок в ПостроителеОтчета обязательно должна присутствовать секция ИТОГИ ПО, причем поля в ней должны быть обернуты в фигурные скобки {ИТОГИ ПО ...}.
  2. Параметры дат: «Универсальный отчет» автоматически оперирует параметрами &ДатаНач и &ДатаКон. Если в вашем запросе используются другие имена параметров, данные не попадут в выборку.
  3. Режим ввода периода: Если ваш отчет строится «на дату» (остатки), обязательно укажите УниверсальныйОтчет.мРежимВводаПериода = 1;. По умолчанию стоит 0 (произвольный период), что требует двух дат.
  4. Ошибка на переменную УКО: Как упоминалось в обсуждении, иногда могут возникать ошибки на специфические переменные конфигурации. Это часто связано с подсистемами защиты или управления качеством. В таких случаях стоит проверить, инициализирована ли переменная в модуле приложения, или временно закомментировать обращения к ней в коде формы отчета.

Создание «Простых» отчетов (кросс-таблиц)

Рассмотрим ситуацию, когда нужно вывести свойства договоров: договора по вертикали, названия свойств по горизонтали, а значения — в пересечении. Для реализации такой кросс-таблицы в «Универсальном отчете» недостаточно просто написать ВЫБРАТЬ.

Необходимо программно настроить измерения колонок построителя:


// В процедуре УстановитьНачальныеНастройки после задания текста запроса:
НовоеИзмерение = УниверсальныйОтчет.ПостроительОтчета.ИзмеренияКолонки.Добавить("Свойство");
НовоеИзмерение.ТипИзмерения = ТипИзмеренияПостроителяОтчета.Элементы;

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

Заключение

Мы выяснили, что интеграция своего запроса в «Универсальный отчет» — это не просто вставка текста SELECT. Это комплексная настройка, включающая правильную разметку запроса фигурными скобками, регистрацию показателей через методы объекта УниверсальныйОтчет и корректную инициализацию параметров периода. Используя эти шаги, вы сможете превратить стандартный инструмент в гибкий отчет любой сложности.

← На главную