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

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

При разработке регламентных заданий и автоматических механизмов рассылки часто возникает задача программного формирования отчетов на базе системы компоновки данных (СКД). Например, требуется взять типовой или созданный пользователем вариант отчета с определенным набором колонок и отборов, сформировать табличный документ без открытия экранных форм и сохранить его на диск в формате Excel для последующей отправки по электронной почте.

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

Где хранятся варианты отчетов в 1С

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

  1. Предопределенные варианты схемы: хранятся непосредственно в схеме компоновки данных в коллекции СхемаКомпоновкиДанных.ВариантыНастроек. К ним можно обращаться по имени варианта.
  2. Пользовательские варианты в типовых конфигурациях: в конфигурациях на базе БСП (например, УТ 11, ERP, КА) созданные пользователями варианты сохраняются в справочнике ВариантыОтчетов. Настройки компоновки в этом случае лежат в реквизите ХранилищеЗначений.
  3. Платформенное хранилище настроек: на уровне платформы для работы с вариантами предусмотрен менеджер ХранилищеВариантовОтчетов.

Способ 1. Полный программный цикл компоновки макета и вывода

Рассмотрим классический способ формирования отчета через программную инициализацию цепочки объектов СКД. Этот метод дает полный контроль над каждым шагом генерации отчета.

Обратим внимание на частую ошибку: объектом-приемником для ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент всегда должен выступать ТабличныйДокумент, а не ТаблицаЗначений.

Посмотрим на пример загрузки пользовательского варианта из справочника и выгрузки в файл Excel:


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

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

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

// 4. Находим нужный сохраненный вариант отчета и загружаем его настройки
ПользовательскийВариант = Справочники.ВариантыОтчетов.НайтиПоНаименованию("ЗверюгоЦветыАркиРозница");
Если ЗначениеЗаполнено(ПользовательскийВариант) Тогда
    НастройкиВарианта = ПользовательскийВариант.ХранилищеЗначений.Получить();
    Если НастройкиВарианта <> Неопределено Тогда
        КомпоновщикНастроекКД.ЗагрузитьНастройки(НастройкиВарианта);
    КонецЕсли;
КонецЕсли;

// 5. Компонуем макет данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    СхемаКомпоновкиДанных, 
    КомпоновщикНастроекКД.ПолучитьНастройки(), 
    , 
    , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляТабличногоДокумента")
);

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

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

// 8. Сохраняем сформированный табличный документ в файл
ПутьХранения = "D:\bazi_1c\";
ИмяФайла = "Прайс " + Формат(ТекущаяДата(), "ДФ=""дд ММ гггг""") + ".xls";
ТабличныйДокумент.Записать(ПутьХранения + ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);

Способ 2. Быстрое формирование через объект отчета

Если для отчета назначена основная схема компоновки данных, код можно существенно сократить с помощью метода СкомпоноватьРезультат() объекта отчета.

Проанализируем пример получения предопределенного варианта прямо из схемы:


ОтчетОбъект = Отчеты.ПрайсЛист.Создать();
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;

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

// Ищем предопределенный вариант по имени в схеме
ИмяНужногоВарианта = "Основной";
ВариантНастройки = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(ИмяНужногоВарианта);

Если ВариантНастройки <> Неопределено Тогда
    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ВариантНастройки.Настройки);
КонецЕсли;

// Формируем отчет сразу в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);

// Сохраняем в файл
ТабличныйДокумент.Записать("D:\bazi_1c\Price.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Программное изменение параметров и отборов для конкретного получателя

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


// Установка значения параметра данных СКД
КомпоновщикНастроекКД.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
    "ВидЦены", 
    Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая")
);

Особенности выполнения в фоновых и регламентных заданиях

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

  1. Отсутствие интерфейса: код выполняется на стороне сервера в фоновом сеансе, поэтому использование клиентских диалогов и методов форм недопустимо.
  2. Права доступа (RLS): регламентное задание выполняется от имени указанного пользователя. Если у пользователя ограничены права на просмотр определенных цен или складов, часть данных не попадет в отчет. При необходимости обойти ограничения можно воспользоваться методом УстановитьПривилегированныйРежим(Истина).
  3. Штатная подсистема рассылки: перед написанием собственного регламентного задания проверьте конфигурацию. В типовых конфигурациях на базе БСП уже встроен механизм «Рассылка отчетов», который позволяет настраивать отправку отчетов по расписанию и получателям в пользовательском режиме без внесения изменений в конфигурацию.
← На главную