При работе в среде 1С:Предприятие 8.3 часто возникает задача программного сохранения данных документа во внешний файл. Это может быть как сохранение печатной формы (счета, накладной) в формате Excel или PDF, так и выгрузка технических данных в JSON или XML для обмена информацией. В данной статье мы подробно разберем все основные способы решения этой задачи, проанализируем методы платформы и рассмотрим практические примеры кода.
Наиболее распространенный сценарий — это сохранение визуального представления документа (макета). Для этого используется объект ТабличныйДокумент. Рассмотрим ситуацию, когда нам нужно программно сформировать печатную форму и записать ее на диск.
Сначала нам необходимо получить сам табличный документ. В типовых конфигурациях (например, БП 3.0) для этого вызываются экспортные функции модулей менеджера документов. Разберем по шагам процесс сохранения счета на оплату:
// 1. Подготовка параметров
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаСчет);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыПечати = Новый Структура;
// 2. Формирование табличного документа (вызов стандартного метода печати)
ТаблицаСведенийСчетНаОплату = Документы.СчетНаОплатуПокупателю.ПолучитьТаблицуСведенийСчетаНаОплату(МассивСсылок);
ТабДок = ПечатьТорговыхДокументов.ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати, ПараметрыПечати);
// 3. Сохранение в файл
ПутьКФайлу = "C:\MyFiles\СчетНаОплату.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Метод Записать является универсальным. Вторым параметром мы указываем желаемый формат. Проанализируем основные типы:
ТипФайлаТабличногоДокумента.XLSX — современный формат Excel.ТипФайлаТабличногоДокумента.PDF — формат для документов, не требующих редактирования.ТипФайлаТабличногоДокумента.MXL — внутренний формат 1С.Важный нюанс: Если вы сохраняете документ в PDF, рекомендуем устанавливать свойство АвтоМасштаб, чтобы документ корректно вписывался в ширину страницы:
ТабДок.АвтоМасштаб = Истина;
ТабДок.Записать("C:\Temp\Document.pdf", ТипФайлаТабличногоДокумента.PDF);
Если ваша задача заключается не в сохранении «картинки» документа, а в передаче его данных (реквизитов и табличных частей) другой системе, лучшим выбором будет формат JSON. Рассмотрим, как это сделать правильно через структуру данных.
Выясним причину популярности этого метода: он легковесный и поддерживается практически всеми современными языками программирования. Разберем пример выгрузки данных документа:
&НаСервере
Функция СохранитьДанныеВJSON(СсылкаНаДокумент)
// Создаем структуру для хранения данных
Данные = Новый Структура;
Данные.Вставить("Номер", СсылкаНаДокумент.Номер);
Данные.Вставить("Дата", СсылкаНаДокумент.Дата);
Данные.Вставить("Контрагент", Строка(СсылкаНаДокумент.Контрагент));
// Выгружаем табличную часть
МассивСтрок = Новый Массив;
Для Каждого Стр Из СсылкаНаДокумент.Товары Цикл
СтруктураСтроки = Новый Структура("Номенклатура, Количество, Цена",
Строка(Стр.Номенклатура), Стр.Количество, Стр.Цена);
МассивСтрок.Добавить(СтруктураСтроки);
КонецЦикла;
Данные.Вставить("Товары", МассивСтрок);
// Записываем в файл
ПутьКФайлу = ПолучитьИмяВременногоФайла("json");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ПутьКФайлу);
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписьJSON.Закрыть();
Возврат ПутьКФайлу;
КонецФункции
Для обмена данными между базами 1С часто используется XML-сериализация. Этот метод позволяет сохранить весь объект «как есть» одной командой. Посмотрим на пример реализации:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\Document.xml");
ЗаписатьXML(ЗаписьXML, СсылкаНаДокумент.ПолучитьОбъект());
ЗаписьXML.Закрыть();
Этот способ крайне эффективен, когда нужно сохранить полное состояние документа, включая все скрытые реквизиты, для последующей загрузки в другую базу с аналогичной конфигурацией.
Важно помнить, что код, исполняемый на сервере, не имеет прямого доступа к файловой системе пользователя. Если вы хотите, чтобы файл сохранился именно на компьютер клиента (в папку «Загрузки» или по выбору пользователя), необходимо использовать механизм временного хранилища.
Разберем этот алгоритм:
ПолучитьФайл.
&НаКлиенте
Процедура СохранитьНаКомпьютерПользователя()
АдресХранилища = СформироватьФайлНаСервере();
ИмяФайла = "Счет.xlsx";
// Интерактивное сохранение
ПолучитьФайл(АдресХранилища, ИмяФайла, Истина);
КонецПроцедуры
&НаСервере
Функция СформироватьФайлНаСервере()
ТабДок = СформироватьПечатнуюФорму(); // Ваша функция формирования
ИмяТемпФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяТемпФайла, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяТемпФайла);
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецФункции
При программном сохранении большого количества документов полезно автоматизировать генерацию имен файлов. Мы рекомендуем использовать комбинацию вида ТипДокумента_Номер_Дата. Чтобы избежать ошибок записи, обязательно очищайте номер документа от символов, недопустимых в именах файлов (например, «/» или «\»), используя функцию СтрЗаменить.
Также в современных конфигурациях (на базе БСП) для получения табличного документа лучше использовать возможности общего модуля УправлениеПечатью, что позволит сохранить все пользовательские настройки макетов и внешние печатные формы, подключенные к базе.