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