Файлы и обмен данными в 1С

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

Коротко

Как сохранить файл в 1С зависит от того, что сохраняем и где выполняется код. Двоичные данные пишутся на диск методом ДвоичныеДанные.Записать(), отчёт или печатная форма — методом ТабличныйДокумент.Записать() с нужным ТипФайлаТабличногоДокумента (PDF, XLSX, MXL), текстовые файлы — объектом ЗаписьТекста.

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

Сохранить данные в файл: ДвоичныеДанные.Записать

Универсальный способ в 1С сохранить данные в файл — объект ДвоичныеДанные. Он подходит для любого содержимого: PDF из вложения, картинки, архива, ответа HTTP-сервиса. Метод Записать() принимает полное имя файла или поток:

// Двоичные данные уже есть (из реквизита, HTTP-ответа, временного хранилища)
Данные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);

// Записываем на диск (на сервере — диск сервера!)
Данные.Записать("D:\Exchange\schet_123.pdf");
Новый ДвоичныеДанные
ИмяФайлаполное имя файла, из которого читаются данные
ДвоичныеДанные, метод Записать() пишет их в файл или поток

Конструктор Новый ДвоичныеДанные(ИмяФайла) решает и обратную задачу — прочитать существующий файл в память, чтобы затем положить его во временное хранилище или в реквизит типа ХранилищеЗначения. Для асинхронного контекста клиента есть парный метод ЗаписатьАсинх(ИмяФайла), возвращающий Обещание.

Сохранить отчёт в файл 1С: табличный документ в PDF, XLSX, MXL

Чтобы сохранить отчёт в файл, в 1С используют метод Записать() табличного документа. Формат задаёт второй параметр — значение перечисления ТипФайлаТабличногоДокумента:

ТабДок = Новый ТабличныйДокумент;
// ... заполняем: СКД, макет, СформироватьПечатнуюФорму и т.п.

ТабДок.Записать("D:\Reports\prodazhi.pdf",  ТипФайлаТабличногоДокумента.PDF);
ТабДок.Записать("D:\Reports\prodazhi.xlsx", ТипФайлаТабличногоДокумента.XLSX);
ТабДок.Записать("D:\Reports\prodazhi.mxl",  ТипФайлаТабличногоДокумента.MXL);
ТабличныйДокумент.Записать
ИмяФайлаполное имя выходного файла
ТипФайлаТаблицыPDF, XLSX, MXL, HTML, DOCX, ODS…
Вложенияфайлы-вложения для PDF/A-3
→ файл на диске

Метод доступен и на клиенте, и на сервере (включая веб-клиент — там платформа сама предложит пользователю сохранить результат). Для PDF с длительным хранением есть варианты PDF_A_1PDF_A_3.

Документ сохранить в файл: печатная форма в PDF

Типовая задача «документ сохранить в файл» в 1С сводится к тому же табличному документу: печатная форма счёта, накладной или акта — это ТабличныйДокумент, который формирует команда печати. Получаем его программно и пишем на диск:

&НаСервере
Процедура СохранитьПечатнуюФормуНаСервере(ДокументСсылка, ПутьКФайлу)
    // В типовых на БСП печатную форму отдаёт менеджер печати
    ТабДок = Документы.СчетНаОплатуПокупателю.ПечатнаяФормаСчета(ДокументСсылка);
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
КонецПроцедуры
В Консоли кода такую задачу можно целиком отдать агенту: попросите «сохрани печатные формы всех счетов за март в PDF в папку на сервере» — агент сам найдёт макет печатной формы в конфигурации, напишет код с ТабличныйДокумент.Записать() и выполнит его.

Сохранить текстовый файл: ЗаписьТекста

Для текстовых форматов (выгрузки CSV, логи, обменные файлы) используется объект ЗаписьТекста. В конструкторе задаются имя файла, кодировка и режим дозаписи:

Запись = Новый ЗаписьТекста("D:\Exchange\vygruzka.csv",
    КодировкаТекста.UTF8);

Запись.ЗаписатьСтроку("Код;Наименование;Цена");
Запись.ЗаписатьСтроку("00-001;Ноутбук;54900");
Запись.Записать("строка без перевода");   // разделитель не добавляется

Запись.Закрыть();  // без Закрыть() файл останется пустым или занятым
Новый ЗаписьТекста
ИмяФайлаполное имя создаваемого файла
КодировкаКодировкаТекста.UTF8, ANSI и др.
РазделительСтрокпо умолчанию перевод строки
ДописыватьИстина — дописать в конец файла
КонвертируемыйРазделительСтрокзамена разделителей в тексте
ЗаписьТекста

Данные буферизуются: пока не вызван Закрыть(), содержимое может не попасть на диск, а файл остаётся заблокированным процессом 1С. Готовый текстовый документ целиком сохраняет и ТекстовыйДокумент.Записать(ИмяФайла, ТипФайла, РазделительСтрок).

Передача файла с сервера на клиент: временное хранилище

В клиент-серверной базе Записать() в серверном коде сохраняет файл на диск сервера. Чтобы сохранить файл 1С 8.3 на компьютер пользователя, файл формируют на сервере, помещают во временное хранилище и получают на клиенте:

&НаСервере
Функция СформироватьСчетНаСервере()
    ТабДок = Документы.СчетНаОплатуПокупателю.ПечатнаяФормаСчета(ДокументСсылка);
    ИмяВрФайла = ПолучитьИмяВременногоФайла("pdf");
    ТабДок.Записать(ИмяВрФайла, ТипФайлаТабличногоДокумента.PDF);

    Данные = Новый ДвоичныеДанные(ИмяВрФайла);
    УдалитьФайлы(ИмяВрФайла);
    Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор(ЭтаФорма));
КонецФункции

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

&НаКлиенте
Процедура СохранитьСчетЗавершение(ПолученныйФайл, ДопПараметры) Экспорт
    Если ПолученныйФайл <> Неопределено Тогда
        ПоказатьОповещениеПользователя("Файл сохранён", , ПолученныйФайл.Имя);
    КонецЕсли;
КонецПроцедуры

НачатьПолучениеФайлаССервера() — асинхронный вариант, работающий во всех клиентах, включая веб-клиент. Старый синхронный ПолучитьФайл(Адрес, ИмяФайла, Интерактивно) в конфигурациях с отключёнными синхронными вызовами вызывает ошибку «Использование синхронных методов на клиенте не разрешено» — в новом коде его не используют.

Если файл «не сохраняется» и непонятно, на каком диске его искать, — попросите агента Консоли кода вывести КаталогВременныхФайлов(), имя компьютера и пользователя ОС на сервере: сразу видно, от чьего имени работает код и куда реально пишутся файлы.

Выбор каталога и имени файла: ДиалогВыбораФайла

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

&НаКлиенте
Процедура ВыбратьПутьИСохранить(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок  = "Сохранить файл";
    Диалог.Фильтр     = "Документ PDF (*.pdf)|*.pdf";
    Диалог.Расширение = "pdf";

    Оповещение = Новый ОписаниеОповещения("ВыборЗавершение", ЭтотОбъект);
    Диалог.Показать(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ВыборЗавершение(ВыбранныеФайлы, ДопПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено Тогда
        ПутьКФайлу = ВыбранныеФайлы[0];
        // дальше — получение файла с сервера по выбранному пути
    КонецЕсли;
КонецПроцедуры
Новый ДиалогВыбораФайла
РежимРаботыОткрытие, Сохранение или ВыборКаталога
ДиалогВыбораФайла; асинхронный показ — Показать(<ОписаниеОповещения>)

Для выбора папки используйте режим РежимДиалогаВыбораФайла.ВыборКаталога — выбранный путь окажется в свойстве Каталог. В веб-клиенте диалог требует установленного расширения работы с файлами.

Сохранить вложение справочника на диск

Вложения и присоединённые файлы хранятся в базе как двоичные данные, поэтому их сохранение — комбинация «достать ДвоичныеДанныеЗаписать()». Если файл лежит в реквизите типа ХранилищеЗначения:

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

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

Как сохранить файл в 1С 8.3 программно: какой способ выбрать

  • Произвольные бинарные данные (PDF, картинка, архив) — ДвоичныеДанные.Записать().
  • Отчёт, печатная формаТабличныйДокумент.Записать() с ТипФайлаТабличногоДокумента.
  • Текст, CSV, обменный файлЗаписьТекста с явной кодировкой.
  • Файл должен оказаться у пользователя — временное хранилище + НачатьПолучениеФайлаССервера().
  • Путь выбирает пользовательДиалогВыбораФайла на клиенте.
  • Файл из базы (вложение) — достать ДвоичныеДанные и записать любым способом выше.

Частые ошибки при программном сохранении файлов в 1С

  • Серверный код пишет «не туда». Записать("C:\...") на сервере создаёт файл на диске сервера, а не на компьютере пользователя. Для клиента — только передача через временное хранилище.
  • «Использование синхронных методов на клиенте не разрешено». Вызван синхронный ПолучитьФайл() или Диалог.Выбрать() при отключённом режиме синхронных вызовов. Переходите на НачатьПолучениеФайлаССервера() и Показать() с описанием оповещения.
  • Нет прав на каталог. Серверный код работает от имени пользователя службы сервера 1С (например, USR1CV8) — у него должны быть права записи в целевую папку. Сетевые ресурсы указывайте UNC-путём (\\server\share), подключённые диски службе недоступны.
  • Недопустимые символы в имени файла. Имя, собранное из наименования документа, может содержать / \ : * ? " | — перед записью символы нужно вычистить, иначе Записать() упадёт.
  • Не вызван Закрыть() у ЗаписьТекста. Файл остаётся пустым или заблокированным до закрытия записи (или завершения процесса).
  • Веб-клиент без расширения работы с файлами. Прямой записи на диск в веб-клиенте нет: диалоги и сохранение работают только через расширение либо через стандартное получение файла браузером.
  • Мусор из временных файлов. После ПолучитьИмяВременногоФайла() и передачи данных вызывайте УдалитьФайлы(), иначе каталог временных файлов сервера растёт бесконтрольно.

Частые вопросы о сохранении файлов в 1С

Как сохранить файл на сервере, а не на компьютере пользователя?

Выполнить запись в серверном контексте (&НаСервере или общий модуль с признаком «Сервер»): Данные.Записать("D:\Exchange\file.pdf"). Путь трактуется относительно файловой системы сервера, а права проверяются для пользователя службы сервера 1С — убедитесь, что у него есть запись в целевой каталог.

Как программно сохранить отчёт в PDF в 1С 8.3?

Сформировать ТабличныйДокумент (СКД или макет) и вызвать ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF). Метод работает на клиенте и на сервере; для архивного хранения есть форматы PDF/A.

Почему ПолучитьФайл выдаёт ошибку про синхронные вызовы?

В свойствах конфигурации отключён режим использования синхронных вызовов расширений платформы, а ПолучитьФайл() — синхронный метод. Используйте асинхронный НачатьПолучениеФайлаССервера() с описанием оповещения — он работает во всех клиентах, включая веб-клиент.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф