К статье
Практический материал

Разработка и Конфигурация · 11 мин

1С: сохранить как программно — способы и примеры

Как программно сохранить файл из 1С: Записать, СохранитьКак, диалог выбора файла, работа с табличными документами и двоичными данными. Примеры кода.

Задача «сохранить как» возникает в 1С постоянно: выгрузить табличный документ в Excel, записать файл обмена на диск, сохранить вложение из письма или выгрузить печатную форму в PDF. В тонком клиенте и веб-клиенте действуют ограничения безопасности, поэтому прямой записи в произвольный путь, как на сервере, обычно недоступно — нужно использовать диалоги выбора файла или механизмы помещения файлов.

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

Какие методы отвечают за сохранение в 1С

Встроенный язык 1С предоставляет несколько семейств методов записи, и выбор зависит от типа сохраняемого объекта:

  • ТабличныйДокумент.Записать(ИмяФайла, ТипФайла) — сохранение печатных форм и отчётов в MXL, Excel, PDF, HTML и другие форматы;
  • ТекстовыйДокумент.Записать(ИмяФайла, Кодировка) — выгрузка текстовых файлов, XML, CSV;
  • ДвоичныеДанные.Записать(ИмяФайла) — сохранение произвольных файлов (картинки, архивы, вложения);
  • ЗаписьXML, ЗаписьJSON, ЗаписьТекста — потоковая запись структурированных данных;
  • ЗначениеВФайл(ИмяФайла, Значение) — сериализация произвольного значения во внутреннем формате.

Общий принцип один: сначала готовится объект в памяти, затем вызывается метод записи с полным путём к файлу. Если путь не существует или недоступен, платформа выбросит исключение, поэтому запись стоит оборачивать в Попытка...Исключение.

Сохранение табличного документа (печатной формы) в файл

Самый частый сценарий — выгрузить сформированный табличный документ в Excel или PDF. Минимальный пример на сервере:

ТабДок = Новый ТабличныйДокумент;

// ... формирование макета ...

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

Параметр типа файла определяет формат: MXL, XLSX, XLS, PDF, HTML5, ODS, TXT и другие. Для PDF доступна дополнительная настройка через объект ПараметрыЗаписиPDF — можно задать защиту, вложения и соответствие стандарту PDF/A.

При записи в Excel учитывайте, что объединённые ячейки, группировки и некоторые элементы оформления переносятся с ограничениями. Если файл нужен пользователю для дальнейшей работы, проверьте результат вручную на типовом документе, прежде чем отдавать доработку в эксплуатацию.

1c
ТабДок.Записать("C:\Temp\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Интерактивное «Сохранить как»: диалог выбора файла

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

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx";

Диалог.ИмяФайла = "Реестр платежей";

Если Диалог.Выбрать() Тогда

ТабДок.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

КонецЕсли;

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

&НаКлиенте

Процедура СохранитьФайл(Команда)

Адрес = СформироватьФайлНаСервере(); // помещаем данные во временное хранилище

НачатьПолучениеФайла(Новый ОписаниеОповещения("ПослеПолучения", ЭтотОбъект),

Адрес, "Реестр.xlsx", Истина);

КонецПроцедуры

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

Порядок действий для сохранения из управляемой формы
  1. 1
    Сформируйте данные на сервере (табличный документ, двоичные данные)
  2. 2
    Запишите их во временный файл или сразу поместите во временное хранилище
  3. 3
    Верните адрес хранилища в клиентскую процедуру
  4. 4
    Вызовите НачатьПолучениеФайла с адресом и именем файла
  5. 5
    В обработчике оповещения проверьте, что файл получен без ошибки

Сохранение двоичных данных и вложений

Файлы, хранящиеся в базе (в реквизитах типа «ХранилищеЗначения», в справочниках присоединённых файлов БСП), извлекаются как двоичные данные и записываются на диск:

ДвоичныеДанные = ХранилищеФайла.Получить();

ДвоичныеДанные.Записать("D:\Выгрузка\договор.pdf");

Если используется библиотека стандартных подсистем, удобнее готовые функции работы с присоединёнными файлами — они сами разрешают пути, версии файлов и права доступа. Самостоятельная запись двоичных данных оправдана в простых конфигурациях без БСП или в специфических обменах.

При массовой выгрузке вложений следите за свободным местом и длиной пути: в Windows действует ограничение около 260 символов для классических API, и длинные имена файлов из базы могут приводить к ошибкам записи.

Запись на сервере и права доступа

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

Правила безопасной записи на сервере:

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

Проверка результата и типичные ошибки

После записи файл стоит проверить программно, особенно в регламентных обменах. Минимальная проверка — существование файла и его размер:

Файл = Новый Файл(ПутьКФайлу);

Если Не Файл.Существует() Или Файл.Размер() = 0 Тогда

ВызватьИсключение "Файл не был сохранён: " + ПутьКФайлу;

КонецЕсли;

Для XML и JSON дополнительно полезно сразу прочитать файл обратно соответствующим объектом чтения — это отловит обрыв записи и ошибки кодировки. Для Excel-файлов полноценная проверка сложнее; обычно ограничиваются контролем размера и тестовым открытием на эталонном примере.

Типичные ошибки
01
Использование синхронного Диалог.Выбрать() в конфигурации с отключёнными синхронными вызовами — код не компилируется или падает на клиенте
02
Запись по относительному пути — файл оказывается в непредсказуемом рабочем каталоге процесса
03
Сохранение в Excel без указания типа файла — получается MXL с расширением xlsx, который Excel не открывает
04
Игнорирование кодировки при записи текста — кириллица превращается в нечитаемые символы у получателя
05
Запись в сетевую папку через букву диска на сервере — ошибка доступа, так как у агента сервера нет подключённых дисков

Выбор подходящего способа

Сравнение вариантов

Записать() с жёстким путём

Подходит для серверных регламентных заданий и обменов. Не подходит для интерактивной работы пользователя

ДиалогВыбораФайла (синхронный)

Простой код для толстого клиента и локальных решений. Не работает при отключённом режиме синхронных вызовов

НачатьПолучениеФайла

Рекомендуемый способ для тонкого и веб-клиента: показывает диалог сохранения и передаёт файл с сервера. Требует разделения кода на серверную и клиентскую части

ПолучитьФайл (временное хранилище)

Упрощённый вариант передачи готового файла с сервера клиенту без лишних промежуточных записей

Маршрут решения

Как выбрать действие

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

Итоговая логика проста: серверные фоновые задачи пишут напрямую в каталоги с контролируемыми правами, интерактивные сценарии — через временное хранилище и асинхронное получение файла на клиенте. Такой подход работает одинаково в файловом и клиент-серверном режимах и не ломается при переходе на веб-клиент.

Итог

Что важно запомнить

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

Частые вопросы

Как сохранить табличный документ в PDF с защитой от редактирования?

Используйте объект ПараметрыЗаписиPDF: в нём задаются параметры защиты и стандарт документа. Объект передаётся в метод Записать() табличного документа вместе с типом файла PDF.

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

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

Как сохранить файл в кодировке UTF-8 без BOM?

При записи через ТекстовыйДокумент или ЗаписьТекста укажите кодировку КодировкаТекста.UTF8 — она пишет BOM. Для записи без BOM используйте объект ЗаписьТекста с параметром, отключающим запись сигнатуры, либо преобразуйте текст в двоичные данные через ПолучитьДвоичныеДанныеИзСтроки и запишите их.

Можно ли сохранить файл на клиенте, минуя диалог, в тонком клиенте?

Только в заранее согласованные каталоги при наличии соответствующих настроек безопасности, и это считается плохой практикой. Штатный безопасный путь — диалог выбора файла или стандартная загрузка через браузер в веб-клиенте.

Что делать, если при записи большого файла возникает ошибка нехватки памяти?

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

Как программно предложить пользователю «Сохранить как» для уже открытого табличного документа?

Вызовите у табличного документа метод записи внутри обработчика, предварительно получив путь через ДиалогВыбораФайла в режиме Сохранение, либо поместите документ во временное хранилище и передайте его клиенту через НачатьПолучениеФайла.