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

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

При работе в среде 1С:Предприятие 8.3 часто возникает задача программного сохранения данных документа во внешний файл. Это может быть как сохранение печатной формы (счета, накладной) в формате Excel или PDF, так и выгрузка технических данных в JSON или XML для обмена информацией. В данной статье мы подробно разберем все основные способы решения этой задачи, проанализируем методы платформы и рассмотрим практические примеры кода.

Вариант 1: Сохранение печатной формы в Excel или PDF

Наиболее распространенный сценарий — это сохранение визуального представления документа (макета). Для этого используется объект ТабличныйДокумент. Рассмотрим ситуацию, когда нам нужно программно сформировать печатную форму и записать ее на диск.

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


// 1. Подготовка параметров
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаСчет);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыПечати = Новый Структура;

// 2. Формирование табличного документа (вызов стандартного метода печати)
ТаблицаСведенийСчетНаОплату = Документы.СчетНаОплатуПокупателю.ПолучитьТаблицуСведенийСчетаНаОплату(МассивСсылок);
ТабДок = ПечатьТорговыхДокументов.ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати, ПараметрыПечати);

// 3. Сохранение в файл
ПутьКФайлу = "C:\MyFiles\СчетНаОплату.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Метод Записать является универсальным. Вторым параметром мы указываем желаемый формат. Проанализируем основные типы:

Важный нюанс: Если вы сохраняете документ в PDF, рекомендуем устанавливать свойство АвтоМасштаб, чтобы документ корректно вписывался в ширину страницы:


ТабДок.АвтоМасштаб = Истина;
ТабДок.Записать("C:\Temp\Document.pdf", ТипФайлаТабличногоДокумента.PDF);

Вариант 2: Выгрузка данных документа в формат JSON

Если ваша задача заключается не в сохранении «картинки» документа, а в передаче его данных (реквизитов и табличных частей) другой системе, лучшим выбором будет формат JSON. Рассмотрим, как это сделать правильно через структуру данных.

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


&НаСервере
Функция СохранитьДанныеВJSON(СсылкаНаДокумент)
    // Создаем структуру для хранения данных
    Данные = Новый Структура;
    Данные.Вставить("Номер", СсылкаНаДокумент.Номер);
    Данные.Вставить("Дата", СсылкаНаДокумент.Дата);
    Данные.Вставить("Контрагент", Строка(СсылкаНаДокумент.Контрагент));
    
    // Выгружаем табличную часть
    МассивСтрок = Новый Массив;
    Для Каждого Стр Из СсылкаНаДокумент.Товары Цикл
        СтруктураСтроки = Новый Структура("Номенклатура, Количество, Цена", 
            Строка(Стр.Номенклатура), Стр.Количество, Стр.Цена);
        МассивСтрок.Добавить(СтруктураСтроки);
    КонецЦикла;
    Данные.Вставить("Товары", МассивСтрок);

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

Вариант 3: Сериализация объекта в XML

Для обмена данными между базами 1С часто используется XML-сериализация. Этот метод позволяет сохранить весь объект «как есть» одной командой. Посмотрим на пример реализации:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\Document.xml");
ЗаписатьXML(ЗаписьXML, СсылкаНаДокумент.ПолучитьОбъект());
ЗаписьXML.Закрыть();

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

Вариант 4: Особенности работы в веб-клиенте и тонком клиенте

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

Разберем этот алгоритм:

  1. На сервере формируем файл и сохраняем его во временное хранилище.
  2. Получаем адрес (URL) этого хранилища.
  3. На клиенте вызываем метод ПолучитьФайл.

&НаКлиенте
Процедура СохранитьНаКомпьютерПользователя()
    АдресХранилища = СформироватьФайлНаСервере();
    ИмяФайла = "Счет.xlsx";
    // Интерактивное сохранение
    ПолучитьФайл(АдресХранилища, ИмяФайла, Истина);
КонецПроцедуры

&НаСервере
Функция СформироватьФайлНаСервере()
    ТабДок = СформироватьПечатнуюФорму(); // Ваша функция формирования
    ИмяТемпФайла = ПолучитьИмяВременногоФайла("xlsx");
    ТабДок.Записать(ИмяТемпФайла, ТипФайлаТабличногоДокумента.XLSX);
    
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяТемпФайла);
    Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецФункции

Рекомендации по автоматизации

При программном сохранении большого количества документов полезно автоматизировать генерацию имен файлов. Мы рекомендуем использовать комбинацию вида ТипДокумента_Номер_Дата. Чтобы избежать ошибок записи, обязательно очищайте номер документа от символов, недопустимых в именах файлов (например, «/» или «\»), используя функцию СтрЗаменить.

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

← На главную