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

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

На практике часто возникает необходимость зафиксировать сформированный отчет в системе. Это нужно для сохранения «среза данных» на момент закрытия периода, передачи версий отчетов на согласование или подстраховки перед проверками руководство. Рассмотрим подробнее, как реализовать такую задачу в 1С и какие технические нюансы следует учесть.

Почему нельзя просто сериализовать объекты 1С

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

Чтобы избежать подобных проблем, необходимо переводить результат работы отчета в универсальный промежуточный формат (например, ТабличныйДокумент, XLSX, PDF или MXL) и сохранять именно его.

Способ 1. Сохранение ТабличногоДокумента в ХранилищеЗначения

Самый распространенный способ фиксации результата отчета — использование реквизита с типом ХранилищеЗначения в справочнике или документе. Проанализируем алгоритмическую последовательность действий:

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

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


&НаСервере
Процедура СохранитьОтчетВСправочникНаСервере(СсылкаНаСправочник, ТабличныйДокумент)
    
    ОбъектСправочника = СсылкаНаСправочник.ПолучитьОбъект();
    
    // Помещаем сформированный ТабличныйДокумент в хранилище со сжатием
    ОбъектСправочника.ХранилищеОтчета = Новый ХранилищеЗначения(ТабличныйДокумент, Новый СжатиеДанных(9));
    
    ОбъектСправочника.Записать();
    
КонецПроцедуры

Для чтения и вывода сохраненного отчета на форму применяется обратная операция с помощью метода Получить():


&НаСервере
Процедура ВосстановитьОтчетНаСервере(СсылкаНаСправочник)
    
    ТабличныйДокументРезультат = СсылкаНаСправочник.ХранилищеОтчета.Получить();
    Если ТипЗнч(ТабличныйДокументРезультат) = Тип("ТабличныйДокумент") Тогда
        Элементы.ПолеТабличногоДокумента.Вывести(ТабличныйДокументРезультат);
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Сохранение отчетов СКД с поддержкой расшифровки

Если отчет построен на Системе компоновки данных (СКД), стандартное сохранение только печатной формы приведет к потере интерактивных возможностей (расшифровки по объектам). Чтобы пользователь мог кликать по ячейкам и открывать документы или справочники, в ХранилищеЗначения нужно упаковать структуру из двух элементов: самого ТабличныйДокумент и объекта ДанныеРасшифровкиКомпоновкиДанных.

Рассмотрим пример формирования такой структуры:


&НаСервере
Процедура СохранитьОтчетСКДСРасшифровкой(СсылкаНаСправочник, ТабличныйДокумент, ДанныеРасшифровки)
    
    ДанныеДляСохранения = Новый Структура;
    ДанныеДляСохранения.Вставить("ПечатнаяФорма", ТабличныйДокумент);
    ДанныеДляСохранения.Вставить("Расшифровка", ДанныеРасшифровки);
    
    ОбъектСправочника = СсылкаНаСправочник.ПолучитьОбъект();
    ОбъектСправочника.ХранилищеОтчета = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(9));
    ОбъектСправочника.Записать();
    
КонецПроцедуры

При восстановлении отчета полученные данные расшифровки подключаются к полю табличного документа на форме.

Способ 3. Экспорт в файл и интеграция с БСП

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

Выясним пошагово, как это работает:

  1. Программно сохраняем результат отчета во временный файл формата MXL, PDF или XLSX с помощью метода Записать() объекта ТабличныйДокумент.
  2. Передаем полученный файл в механизмы БСП для прикрепления к целевому документу или справочнику.

// Пример сохранения табличного документа во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);

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

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

← На главную