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