Как программно получить настройки СКД и сформировать отчет в 1С?

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

В разработке на платформе 1С:Предприятие часто возникает задача программного формирования отчетов, построенных на базе Схемы компоновки данных (СКД). Это может потребоваться для рассылки отчетов по расписанию, формирования документов в фоновом режиме или для реализации сложной логики выгрузки данных. Одним из ключевых этапов этого процесса является получение и применение настроек отчета.

В этой статье мы подробно разберем, как программно получить настройки схемы компоновки данных, загрузить их в компоновщик, установить необходимые параметры и вывести готовый результат в табличный документ. Также мы проанализируем частые ошибки разработчиков, включая проблемы с кэшированием внешних отчетов.

Шаг 1. Получение схемы компоновки и загрузка настроек

Для начала разберем типичную ошибку, с которой часто сталкиваются разработчики при попытке загрузить настройки программно. Попытка обратиться напрямую к свойству основного варианта через точку, например СхемаКомпоновкиДанных.Основной или СхемаКомпоновкиДанных.ВариантыНастроек.Основной, приводит к ошибке выполнения "Поле объекта не обнаружено" или "Ошибка при вызове метода контекста".

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

Проанализируем пример кода, в котором мы инициализируем внешний отчет, получаем его схему и загружаем настройки по умолчанию:


// 1. Создаем объект внешнего отчета программно
НужныйОтчет = ВнешниеОтчеты.Создать(ИмяФайлаОтчета, Ложь); 

// 2. Получаем схему компоновки данных из макета
СхемаКомпоновкиДанных = НужныйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); 

// 3. Создаем и инициализируем компоновщик настроек
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; 
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); 

// 4. Загружаем настройки конкретного варианта
ВариантНастройки = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки;
КомпоновщикНастроек.ЗагрузитьНастройки(ВариантНастройки);

Если вам требуется загрузить настройки, которые заданы в схеме как "Настройки по умолчанию", вы можете обратиться к ним напрямую через свойство схемы:


КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

Шаг 2. Программное формирование и вывод отчета

После того как настройки успешно загружены в компоновщик, нам необходимо запустить процесс выполнения компоновки данных и вывести результат. Этот процесс состоит из нескольких последовательных шагов, включающих генерацию макета, инициализацию процессора компоновки и вывод данных в табличный документ.

Рассмотрим подробнее этот классический алгоритм:


// 1. Инициализируем компоновщик макета компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// 2. Генерируем макет компоновки данных на основе схемы и загруженных настроек
// Если планируется использовать расшифровку, третьим параметром передается объект ДанныеРасшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());

// 3. Создаем процессор компоновки данных и связываем его с макетом
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// 4. Создаем результирующий табличный документ и процессор вывода
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);

// 5. Выводим результат компоновки в табличный документ
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Теперь документ ТабДок заполнен данными отчета. Его можно показать пользователю:
ТабДок.Показать("Результат формирования отчета");

Шаг 3. Почему программа не "видит" новые настройки?

Часто в процессе разработки возникает ситуация: вы добавили новый вариант настроек или изменили структуру СКД в конфигураторе, сохранили отчет, запускаете код, но программа по-прежнему выдает старую структуру настроек или вообще выдает ошибку, что новая настройка не найдена. Выясним, почему это происходит:

  1. Кэширование внешних файлов в сеансе 1С. Платформа 1С:Предприятие оптимизирует работу с внешними файлами (.erf / .epf) и кэширует их структуру в оперативной памяти текущего сеанса. Если вы обновили файл отчета на диске, запущенный сеанс "Предприятия" может продолжать использовать старую схему из своего кэша.
    Решение: Чтобы изменения вступили в силу, полностью перезапустите сеанс "1С:Предприятия" или временно переименуйте файл отчета на диске при повторном открытии.
  2. Кэширование вариантов в механизмах БСП. Если ваш отчет зарегистрирован в справочнике "Дополнительные отчеты и обработки" информационной базы, то список его вариантов кэшируется в системных регистрах БСП. Простое обновление файла внутри справочника не всегда мгновенно обновляет сопоставленные варианты.
    Решение: В режиме "1С:Предприятие" зайдите в карточку дополнительного отчета, обновите настройки из файла и сбросьте настройки отчета к стандартным через меню Еще -> Установить стандартные настройки.

Шаг 4. Разница между "Настройками" и "Пользовательскими настройками"

При работе с программной компоновкой важно четко разграничивать свойства компоновщика настроек:

Если вы программно изменяете или загружаете основные настройки схемы, рекомендуется синхронизировать их с пользовательскими настройками, чтобы элементы управления на форме отчета отображали актуальные данные:


КомпоновщикНастроек.ЗагрузитьНастройки(ВариантНастройки);
// Синхронизируем пользовательские настройки с основными настройками компоновщика
КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(КомпоновщикНастроек.ПользовательскиеНастройки);

Шаг 5. Программная установка параметров после загрузки настройки

Чаще всего настройки загружаются программно именно для того, чтобы перед выводом отчета автоматически заполнить в них ключевые параметры (например, период формирования или конкретную организацию). Выполнять заполнение параметров необходимо строго после загрузки настроек в компоновщик.

Посмотрим на пример установки параметров "НачалоПериода" и "КонецПериода":


// Определяем значения параметров
ДатаНачала = НачалоМесяца(ТекущаяДата());
ДатаОкончания = КонецМесяца(ТекущаяДата());

// Установка параметра "НачалоПериода"
ПараметрНачало = КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти("НачалоПериода");
Если ПараметрНачало <> Неопределено Тогда
    ПараметрНачало.Значение = ДатаНачала;
    ПараметрНачало.Использование = Истина;
КонецЕсли;

// Установка параметра "КонецПериода"
ПараметрКонец = КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти("КонецПериода");
Если ПараметрКонец <> Неопределено Тогда
    ПараметрКонец.Значение = ДатаОкончания;
    ПараметрКонец.Использование = Истина;
КонецЕсли;

Альтернативный способ запуска отчета с настройками в управляемых формах

Если ваш отчет интегрирован в конфигурацию и разработан под управляемое приложение с использованием механизмов Библиотеки стандартных подсистем (БСП), вам не обязательно писать весь низкоуровневый код с процессорами вывода. Достаточно открыть форму отчета, передав в нее структуру параметров для настройки.

Рассмотрим, как это сделать лаконично:


ПараметрыФормы = Новый Структура;
// Указываем имя конкретного варианта настроек, который нужно загрузить
ПараметрыФормы.Вставить("КлючВарианта", "ИмяНужногоВарианта"); 
// Сигнализируем системе, что отчет нужно сформировать автоматически при открытии формы
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина); 

// Задаем быстрые отборы, которые будут применены к отчету
ОтборСтруктура = Новый Структура("Организация", СсылкаНаОрганизацию);
ПараметрыФормы.Вставить("Отбор", ОтборСтруктура);

// Открываем форму отчета с переданными параметрами
ОткрытьФорму("Отчет.МойОтчет.Форма", ПараметрыФормы);

Этот способ является наиболее предпочтительным при интерактивной работе пользователя, так как платформа берет на себя все стандартные действия по формированию расшифровок, выводу шапки и корректной работе интерактивных элементов формы.

← На главную