На практике часто возникает необходимость зафиксировать сформированный отчет в системе. Это нужно для сохранения «среза данных» на момент закрытия периода, передачи версий отчетов на согласование или подстраховки перед проверками руководство. Рассмотрим подробнее, как реализовать такую задачу в 1С и какие технические нюансы следует учесть.
Разберем важный технический момент: если пытаться сохранить в базу 1С объекты ссылочных типов или специализированные внутренние структуры напрямую, при изменении конфигурации (изменении метаданных) ранее записанные объекты могут перестать считываться. Они станут невалидными, так как платформа не сможет корректно десериализовать их обратно.
Чтобы избежать подобных проблем, необходимо переводить результат работы отчета в универсальный промежуточный формат (например, ТабличныйДокумент, XLSX, PDF или MXL) и сохранять именно его.
Самый распространенный способ фиксации результата отчета — использование реквизита с типом ХранилищеЗначения в справочнике или документе. Проанализируем алгоритмическую последовательность действий:
ХранилищеОтчета) с типом данных ХранилищеЗначения.ТабличныйДокумент и помещаем его в объект ХранилищеЗначения. С целью экономии дискового пространства рекомендуется использовать сжатие.Посмотрим на пример кода записи табличного документа на сервере:
&НаСервере
Процедура СохранитьОтчетВСправочникНаСервере(СсылкаНаСправочник, ТабличныйДокумент)
ОбъектСправочника = СсылкаНаСправочник.ПолучитьОбъект();
// Помещаем сформированный ТабличныйДокумент в хранилище со сжатием
ОбъектСправочника.ХранилищеОтчета = Новый ХранилищеЗначения(ТабличныйДокумент, Новый СжатиеДанных(9));
ОбъектСправочника.Записать();
КонецПроцедуры
Для чтения и вывода сохраненного отчета на форму применяется обратная операция с помощью метода Получить():
&НаСервере
Процедура ВосстановитьОтчетНаСервере(СсылкаНаСправочник)
ТабличныйДокументРезультат = СсылкаНаСправочник.ХранилищеОтчета.Получить();
Если ТипЗнч(ТабличныйДокументРезультат) = Тип("ТабличныйДокумент") Тогда
Элементы.ПолеТабличногоДокумента.Вывести(ТабличныйДокументРезультат);
КонецЕсли;
КонецПроцедуры
Если отчет построен на Системе компоновки данных (СКД), стандартное сохранение только печатной формы приведет к потере интерактивных возможностей (расшифровки по объектам). Чтобы пользователь мог кликать по ячейкам и открывать документы или справочники, в ХранилищеЗначения нужно упаковать структуру из двух элементов: самого ТабличныйДокумент и объекта ДанныеРасшифровкиКомпоновкиДанных.
Рассмотрим пример формирования такой структуры:
&НаСервере
Процедура СохранитьОтчетСКДСРасшифровкой(СсылкаНаСправочник, ТабличныйДокумент, ДанныеРасшифровки)
ДанныеДляСохранения = Новый Структура;
ДанныеДляСохранения.Вставить("ПечатнаяФорма", ТабличныйДокумент);
ДанныеДляСохранения.Вставить("Расшифровка", ДанныеРасшифровки);
ОбъектСправочника = СсылкаНаСправочник.ПолучитьОбъект();
ОбъектСправочника.ХранилищеОтчета = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(9));
ОбъектСправочника.Записать();
КонецПроцедуры
При восстановлении отчета полученные данные расшифровки подключаются к полю табличного документа на форме.
Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), оптимальным решением будет сохранение отчета через подсистему «Прикрепленные файлы». Это дает преимущество: файлы можно хранить не в самой базе данных 1С, а на внешних томах файлового сервера.
Выясним пошагово, как это работает:
Записать() объекта ТабличныйДокумент.
// Пример сохранения табличного документа во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);
Проанализируем важные нюансы, о которых следует помнить при реализации сохранения отчетов:
ХранилищеЗначения не отображаются напрямую на управляемой форме и недоступны на клиенте. Передача данных между клиентом и сервером происходит через временное хранилище (с помощью функций ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища).ТолькоПросмотр = Истина у элемента формы.ХранилищеЗначения в отдельный регистр сведений или подчиненный справочник.