Разработка и Конфигурация · 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 учитывайте, что объединённые ячейки, группировки и некоторые элементы оформления переносятся с ограничениями. Если файл нужен пользователю для дальнейшей работы, проверьте результат вручную на типовом документе, прежде чем отдавать доработку в эксплуатацию.
ТабДок.Записать("C:\Temp\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);Интерактивное «Сохранить как»: диалог выбора файла
Когда путь должен выбрать пользователь, применяется объект ДиалогВыбораФайла в режиме РежимДиалогаВыбораФайла.Сохранение. Синхронный вариант подходит для толстого клиента и демонстрационных решений:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx";
Диалог.ИмяФайла = "Реестр платежей";
Если Диалог.Выбрать() Тогда
ТабДок.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецЕсли;
Однако в тонком и веб-клиенте синхронные вызовы запрещены, если в конфигурации отключён режим использования синхронных вызовов. Современный подход — асинхронный метод НачатьПолучениеФайла, который сам показывает диалог сохранения и передаёт файл с сервера на клиент:
&НаКлиенте
Процедура СохранитьФайл(Команда)
Адрес = СформироватьФайлНаСервере(); // помещаем данные во временное хранилище
НачатьПолучениеФайла(Новый ОписаниеОповещения("ПослеПолучения", ЭтотОбъект),
Адрес, "Реестр.xlsx", Истина);
КонецПроцедуры
Типовая схема такова: серверная функция формирует файл (например, во временный каталог сервера), помещает его во временное хранилище через ПоместитьВоВременноеХранилище, а клиент забирает данные по адресу хранилища и предлагает пользователю выбрать место сохранения.
- 1Сформируйте данные на сервере (табличный документ, двоичные данные)
- 2Запишите их во временный файл или сразу поместите во временное хранилище
- 3Верните адрес хранилища в клиентскую процедуру
- 4Вызовите НачатьПолучениеФайла с адресом и именем файла
- 5В обработчике оповещения проверьте, что файл получен без ошибки
Сохранение двоичных данных и вложений
Файлы, хранящиеся в базе (в реквизитах типа «ХранилищеЗначения», в справочниках присоединённых файлов БСП), извлекаются как двоичные данные и записываются на диск:
ДвоичныеДанные = ХранилищеФайла.Получить();
ДвоичныеДанные.Записать("D:\Выгрузка\договор.pdf");
Если используется библиотека стандартных подсистем, удобнее готовые функции работы с присоединёнными файлами — они сами разрешают пути, версии файлов и права доступа. Самостоятельная запись двоичных данных оправдана в простых конфигурациях без БСП или в специфических обменах.
При массовой выгрузке вложений следите за свободным местом и длиной пути: в Windows действует ограничение около 260 символов для классических API, и длинные имена файлов из базы могут приводить к ошибкам записи.
Запись на сервере и права доступа
Код, выполняемый в серверной процедуре, пишет файлы от имени учётной записи, под которой работает агент сервера 1С (по умолчанию — служебная учётная запись). Это частая причина ошибок «нет доступа»: разработчик тестирует на своём компьютере, где всё работает, а на сервере запись в сетевую папку падает.
Правила безопасной записи на сервере:
- используйте
КаталогВременныхФайлов()для промежуточных файлов и удаляйте их после использования; - для постоянных выгрузок выделяйте отдельный каталог с явно выданными правами для учётной записи сервера;
- сетевые пути указывайте в формате UNC (
\\server\share), а не через подключённые диски — буквы дисков существуют только в сессии пользователя; - каждую запись оборачивайте в
Попытка...Исключениес записью ошибки в журнал регистрации.
Проверка результата и типичные ошибки
После записи файл стоит проверить программно, особенно в регламентных обменах. Минимальная проверка — существование файла и его размер:
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Или Файл.Размер() = 0 Тогда
ВызватьИсключение "Файл не был сохранён: " + ПутьКФайлу;
КонецЕсли;
Для XML и JSON дополнительно полезно сразу прочитать файл обратно соответствующим объектом чтения — это отловит обрыв записи и ошибки кодировки. Для Excel-файлов полноценная проверка сложнее; обычно ограничиваются контролем размера и тестовым открытием на эталонном примере.
Выбор подходящего способа
Сравнение вариантов
Подходит для серверных регламентных заданий и обменов. Не подходит для интерактивной работы пользователя
Простой код для толстого клиента и локальных решений. Не работает при отключённом режиме синхронных вызовов
Рекомендуемый способ для тонкого и веб-клиента: показывает диалог сохранения и передаёт файл с сервера. Требует разделения кода на серверную и клиентскую части
Упрощённый вариант передачи готового файла с сервера клиенту без лишних промежуточных записей
Как выбрать действие
Итоговая логика проста: серверные фоновые задачи пишут напрямую в каталоги с контролируемыми правами, интерактивные сценарии — через временное хранилище и асинхронное получение файла на клиенте. Такой подход работает одинаково в файловом и клиент-серверном режимах и не ломается при переходе на веб-клиент.
Что важно запомнить
Сохранение в 1С строится на методах Записать() для конкретных типов объектов. Для интерактивного выбора пути используйте асинхронный НачатьПолучениеФайла, для серверных задач — прямую запись с проверкой прав и обработкой исключений. Всегда проверяйте результат: существование файла, размер и, для структурированных форматов, возможность повторного чтения.
Частые вопросы
Как сохранить табличный документ в PDF с защитой от редактирования?
Используйте объект ПараметрыЗаписиPDF: в нём задаются параметры защиты и стандарт документа. Объект передаётся в метод Записать() табличного документа вместе с типом файла PDF.
Почему НачатьПолучениеФайла не показывает диалог сохранения?
Диалог отображается только если четвёртый параметр (Интерактивно) равен Истина. Также в веб-клиенте браузер может блокировать автоматическое скачивание — тогда файл уйдёт в стандартную папку загрузок без диалога, это поведение браузера, а не платформы.
Как сохранить файл в кодировке UTF-8 без BOM?
При записи через ТекстовыйДокумент или ЗаписьТекста укажите кодировку КодировкаТекста.UTF8 — она пишет BOM. Для записи без BOM используйте объект ЗаписьТекста с параметром, отключающим запись сигнатуры, либо преобразуйте текст в двоичные данные через ПолучитьДвоичныеДанныеИзСтроки и запишите их.
Можно ли сохранить файл на клиенте, минуя диалог, в тонком клиенте?
Только в заранее согласованные каталоги при наличии соответствующих настроек безопасности, и это считается плохой практикой. Штатный безопасный путь — диалог выбора файла или стандартная загрузка через браузер в веб-клиенте.
Что делать, если при записи большого файла возникает ошибка нехватки памяти?
Не загружайте весь файл в память целиком: используйте потоковые объекты (ЗаписьXML, ЗаписьТекста, потоки файлов) и пишите данные порциями. Для очень больших выгрузок разбивайте результат на несколько файлов.
Как программно предложить пользователю «Сохранить как» для уже открытого табличного документа?
Вызовите у табличного документа метод записи внутри обработчика, предварительно получив путь через ДиалогВыбораФайла в режиме Сохранение, либо поместите документ во временное хранилище и передайте его клиенту через НачатьПолучениеФайла.