В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11, ERP 2 или Комплексная автоматизация, механизм УниверсальныйОтчет является мощным инструментом для анализа данных. Часто возникает задача не просто открыть этот отчет из меню, а вызвать его программно из формы другого объекта (например, из списка документов), передав в него конкретные параметры: период, номенклатуру или склад. Разберем по шагам, как это реализовать правильно и эффективно.
Для программного открытия любого отчета в управляемом приложении используется метод ОткрытьФорму. Основная сложность заключается в подготовке структуры параметров, которые система БСП должна корректно интерпретировать при инициализации формы. Проанализируем пример кода, который позволяет открыть УниверсальныйОтчет с предустановленным фильтром:
&НаКлиенте
Процедура ОткрытьОтчетПоНоменклатуре(Регистратор)
// Формируем список значений или массив для отбора
спНоменклатуры = ПолучитьСписокНоменклатурыИзДокумента(Регистратор);
// Структура 'Отбор' содержит поля, которые будут добавлены в компоновку
УсловияОтбора = Новый Структура("Номенклатура", спНоменклатуры);
// Структура 'Параметры' отвечает за параметры СКД (например, период)
ПараметрыОтчета = Новый Структура("Период", ПолучитьДату(Регистратор));
// Формируем параметры формы для передачи в Универсальный отчет
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Отбор", УсловияОтбора);
ПараметрыФормы.Вставить("Параметры", ПараметрыОтчета);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("Расширенный", Истина);
// Вызываем форму объекта отчета
ОткрытьФорму("Отчет.УниверсальныйОтчет.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
В данном примере мы видим использование ключевых параметров: Отбор, Параметры и флаг СформироватьПриОткрытии. Это позволяет пользователю сразу увидеть результат, не нажимая кнопку формирования вручную.
Если вы открываете УниверсальныйОтчет не из его стандартного интерфейса, а «с нуля», система может не знать, по какому регистру или справочнику нужно строить данные. Для этого в структуру ПараметрыФормы необходимо добавить описание метаданных. Разберем, какие ключи за это отвечают:
"РегистрНакопления", "РегистрСведений", "Документ" или "Справочник"."ВыручкаИСебестоимостьПродаж" или "ОстаткиТоваров"."Обороты", "Остатки" или "ОстаткиИОбороты".Посмотрим на расширенный пример настройки источника данных:
ПараметрыФормы.Вставить("ТипОбъекта", "РегистрНакопления");
ПараметрыФормы.Вставить("ИмяОбъекта", "Продажи");
ПараметрыФормы.Вставить("ИмяТаблицы", "Обороты");
Иногда требуется открыть не «чистый» отчет, а конкретный вариант, который уже настроен пользователем или разработчиком. В этом случае используйте параметр КлючВарианта. Это избавит вас от необходимости программно описывать все группировки и поля. Для реализации подобного вывода с готовыми отборами средствами БСП можно использовать способ вывода отчета на форму через варианты отчетов.
Если же ваша задача — жестко ограничить данные так, чтобы пользователь не мог изменить фильтр в интерфейсе, следует использовать механизм ФиксированныеНастройки. Это часть механизма СКД (Системы компоновки данных), которая передается через параметры формы и накладывается поверх пользовательских настроек.
Для улучшения UX (пользовательского опыта) мы можем управлять тем, как отчет будет выглядеть на экране. Выясним, какие дополнительные параметры БСП поддерживает для формы Универсального отчета:
Истина, чтобы убрать лишнее место в верхней части формы, если отчет встроен в другую форму или открывается как вспомогательный.Истина. Это предотвратит «зависание» интерфейса во время длительной компоновки результата.Рассмотрим ситуацию, когда отчет нужно сформировать «в фоне», получить его табличный документ и, например, отправить по электронной почте. В этом случае нам не нужно вызывать ОткрытьФорму. Мы работаем напрямую с объектом отчета на сервере.
Проанализируем последовательность действий:
// 1. Создаем объект отчета
ОтчетОбъект = Отчеты.УниверсальныйОтчет.Создать();
// 2. Инициализируем настройки источника
ОтчетОбъект.ТипОбъекта = "РегистрНакопления";
ОтчетОбъект.ИмяОбъекта = "ТоварыНаСкладах";
ОтчетОбъект.УстановитьНачальныеНастройки();
// 3. Работаем с компоновщиком настроек
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;
НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = НужныйСклад;
НовыйОтбор.Использование = Истина;
// 4. Формируем результат в табличный документ
ТабДок = Новый ТабличныйДокумент;
ОтчетОбъект.СкомпоноватьРезультат(ТабДок);
Этот подход требует более глубокого понимания работы КомпоновщикаНастроек, но дает максимальную гибкость. Важно помнить, что после установки ТипОбъекта и ИмяОбъекта обязателен вызов метода УстановитьНачальныеНастройки(), так как именно он инициализирует схему компоновки данных (СКД) внутри объекта УниверсальныйОтчет. Для упрощения программной работы с объектной моделью компоновки данных подойдёт общий модуль-обёртка для построения СКД.
Стоит отметить, что в старых версиях БСП (ниже 2.3) некоторые параметры могли передаваться иначе, но в современных конфигурациях на платформе 8.3 (Управляемые формы) описанный выше метод через структуру ПараметрыФормы является стандартом. Если вы столкнулись с тем, что отборы не применяются, проверьте, включен ли режим Расширенный (это соответствует переключателю «Расширенная настройка» в интерфейсе отчета).
Используя эти методы, вы сможете интегрировать универсальный отчет в бизнес-процессы вашей конфигурации, делая работу пользователей более удобной и автоматизированной.