Разработка и Конфигурация · 11 мин
Как сохранить файл из 1С программно
Способы программного сохранения файлов из 1С: Записать(), ПолучитьФайл, НачатьПолучениеФайла, работа с двоичными данными. Примеры кода, ошибки и проверка результата.
Программное сохранение файлов — одна из самых частых задач при доработке конфигураций 1С: выгрузка отчётов в Excel, сохранение печатных форм в PDF, экспорт данных обмена, запись вложений на диск. В зависимости от того, где хранятся данные (табличный документ, двоичные данные, хранилище значения, временное хранилище), применяются разные методы встроенного языка.
Ключевое различие, которое нужно понимать перед написанием кода, — где выполняется сохранение: на сервере или на клиенте. Директивы &НаСервере и &НаКлиенте определяют, какие методы доступны и куда физически попадёт файл. Ошибка в выборе контекста — причина большинства проблем «файл сохранился, но его нигде нет».
Ниже разобраны основные сценарии: запись табличного документа, работа с объектом «ТекстовыйДокумент» и «ДвоичныеДанные», передача файла с сервера на клиент через временное хранилище, а также типовые ошибки и способы проверить результат.
Выбор метода в зависимости от типа данных
В 1С нет единого универсального метода «сохранить файл»: каждый тип данных имеет собственный механизм записи. Табличный документ сохраняется методом Записать() с указанием типа файла, текст — через объект ТекстовыйДокумент, произвольные бинарные данные — через ДвоичныеДанные и их метод Записать().
Если данные хранятся в базе (например, в реквизите с типом «ХранилищеЗначения»), сначала их нужно извлечь методом Получить(), и только потом записывать на диск. Попытка записать хранилище значения напрямую приведёт к ошибке типа.
Сравнение способов сохранения
Подходит для отчётов и печатных форм. Поддерживает форматы MXL, XLSX, PDF, HTML и др. Не работает с произвольными бинарными данными.
Для текстовых файлов: CSV, XML, JSON, логи. Можно задать кодировку. Не подходит для бинарного содержимого.
Универсальный способ для любых файлов: картинки, архивы, документы Word. Требует, чтобы данные уже были получены в виде двоичных данных.
Клиентский метод для сохранения файла из временного хранилища на компьютер пользователя в тонком/веб-клиенте. Требует асинхронного описания оповещения.
Сохранение табличного документа (отчёт, печатная форма)
Самый распространённый сценарий — сохранить сформированный отчёт или печатную форму в файл. Метод Записать() табличного документа принимает путь к файлу и тип сохраняемого файла.
ТабДок = Новый ТабличныйДокумент;
// ... формирование табличного документа ...
ТабДок.Записать("C:\Отчеты\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);
// или в PDF:
ТабДок.Записать("C:\Отчеты\Отчет.pdf", ТипФайлаТабличногоДокумента.PDF);
Доступные типы файлов задаются системным перечислением ТипФайлаТабличногоДокумента: MXL, XLSX, XLS, PDF, HTML, ODS, TXT и другие. Расширение в имени файла должно соответствовать выбранному типу — платформа не проверяет это автоматически, и при несовпадении файл может не открыться в целевой программе.
Если файл с таким именем уже существует, он будет перезаписан без предупреждения. Если каталог не существует, возникнет ошибка — каталог нужно создать заранее методом СоздатьКаталог().
- 1Сформируйте табличный документ и заполните его данными
- 2Проверьте существование каталога: СоздатьКаталог(ПутьККаталогу) — метод безопасен, если каталог уже есть
- 3Вызовите ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX)
- 4Проверьте результат: Файл = Новый Файл(ПолноеИмяФайла); Файл.Существует()
Сохранение текстовых и бинарных файлов
Текстовый документ
Для текстовых файлов (CSV, XML, JSON, логи обмена) используется объект ТекстовыйДокумент. Метод Записать() позволяет указать кодировку, что критично при обмене с внешними системами.
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Артикул;Наименование;Цена");
Текст.ДобавитьСтроку("001;Товар;1000");
Текст.Записать("C:\Обмен\выгрузка.csv", КодировкаТекста.UTF8);
Если кодировку не указать, используется системная кодировка по умолчанию, и кириллица может отображаться некорректно при открытии файла в другой программе. Для обмена с веб-сервисами и большинством внешних систем стандартом де-факто является UTF-8.
Двоичные данные
Картинки, архивы, документы Word и другие бинарные файлы сохраняются через объект ДвоичныеДанные. Получить двоичные данные можно из файла, из хранилища значения или из временного хранилища.
// Извлечение из хранилища значения в реквизите объекта
ДвоичныеДанные = Объект.ДанныеФайла.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
ДвоичныеДанные.Записать("C:\Файлы\документ.docx");
КонецЕсли;
Проверка на Неопределено обязательна: если хранилище пустое, метод Получить() вернёт именно его, и вызов Записать() вызовет ошибку выполнения.
Передача файла с сервера на клиент в управляемых формах
В управляемых формах код формирования файла часто выполняется на сервере, а сохранить его нужно на компьютере пользователя. Прямой вызов Записать() в серверном контексте запишет файл на диск сервера 1С, где пользователь его не увидит. Правильный механизм — временное хранилище.
&НаСервере
Функция ПодготовитьФайлНаСервере()
ТабДок = Новый ТабличныйДокумент;
// ... формирование ...
ИмяВременного = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяВременного, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременного);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
УдалитьФайлы(ИмяВременного);
Возврат Адрес;
КонецФункции
&НаКлиенте
Процедура СохранитьФайл(Команда)
Адрес = ПодготовитьФайлНаСервере();
НачатьПолучениеФайла(Новый ОписаниеОповещения("ПослеПолучения", ЭтотОбъект),
Адрес, "Отчет.xlsx", Истина);
КонецПроцедуры
Параметр Истина в НачатьПолучениеФайла() открывает диалог выбора места сохранения. Если передать Ложь и указать полный путь, файл сохранится без диалога — но для этого в тонком клиенте должно быть установлено расширение работы с файлами.
Сохранение в фоне и без диалогов
При регламентных заданиях и фоновых операциях интерактивные диалоги недоступны: вызов НачатьПолучениеФайла() или ДиалогВыбораФайла в фоновом задании приведёт к ошибке. В таких сценариях файл сохраняется либо на сервер в заранее настроенный каталог, либо в сетевую папку, либо помещается в базу.
Для сохранения на сервер убедитесь, что у учётной записи, под которой работает сервер 1С (обычно USR1CV8), есть права записи в целевой каталог. Это самая частая причина ошибки «Ошибка доступа к файлу» в фоновых заданиях: разработчик тестирует под своей учётной записью, где права есть, а серверный процесс их не имеет.
Проверка результата и типичные ошибки
После записи файла результат нужно проверить, а не предполагать, что всё прошло успешно. Минимальная проверка — существование файла и его размер: нулевой размер обычно означает, что данные не были сформированы.
Файл = Новый Файл(ПолноеИмяФайла);
Если Файл.Существует() И Файл.Размер() > 0 Тогда
// файл сохранён успешно
Иначе
ВызватьИсключение "Файл не создан или пуст: " + ПолноеИмяФайла;
КонецЕсли;
Как проверить результат
Файл.Существует() возвращает Истина
Файла нет — проверяйте путь, права и контекст выполнения
Размер больше нуля и соответствует ожидаемому объёму данных
Нулевой размер — данные не были сформированы или извлечены
Файл открывается в целевой программе без ошибок, кириллица читается
Ошибка формата или кракозябры — неверный тип файла или кодировка
Файл находится на компьютере пользователя
Файл на сервере — значит, запись выполнялась в серверном контексте
Часто задаваемые вопросы
Как сохранить файл в PDF из 1С программно?
Используйте метод Записать() табличного документа с типом ТипФайлаТабличногоДокумента.PDF. Сформируйте табличный документ (макет, печатная форма или отчёт), затем вызовите ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.PDF). Дополнительные настройки PDF (защита, вложения) доступны через объект ПараметрыЗаписиPDF, передаваемый третьим параметром.
Почему файл сохраняется, но пользователь его не видит?
Код выполняется в серверном контексте (&НаСервере или в модуле объекта), поэтому файл пишется на диск сервера 1С, а не на компьютер пользователя. Передайте файл через временное хранилище: ПоместитьВоВременноеХранилище на сервере, затем НачатьПолучениеФайла на клиенте.
Как сохранить файл без диалога выбора в тонком клиенте?
Вызовите НачатьПолучениеФайла с параметром интерактивного режима Ложь и укажите полный путь к файлу. На компьютере пользователя должно быть установлено расширение работы с файлами, иначе метод завершится с ошибкой. Проверить наличие расширения можно через ПодключитьРасширениеРаботыСФайлами().
Что делать с ошибкой «Ошибка доступа к файлу» в регламентном задании?
У учётной записи службы сервера 1С нет прав на запись в целевой каталог. Предоставьте ей права записи на папку (для сетевых путей — с учётом того, что служба обращается к сети от имени компьютерного объекта), либо сохраняйте файл в каталог внутри служебных папок сервера. Проверить доступ можно попыткой создания тестового файла из кода.
Как сохранить картинку или файл из базы на диск?
Извлеките данные из реквизита типа ХранилищеЗначения методом Получить() — получите ДвоичныеДанные. Проверьте результат на Неопределено, затем вызовите ДвоичныеДанные.Записать(Путь). Если файл хранится в справочнике присоединенных файлов БСП, используйте функцию РаботаСФайлами.ДвоичныеДанныеФайла().
Можно ли сохранить файл напрямую на сетевой диск?
Да, если указать UNC-путь вида \\Сервер\ОбщаяПапка\файл.xlsx. Для серверного контекста учётная запись службы 1С должна иметь доступ к сетевому ресурсу. Буквы подключённых дисков (Z:\) в серверном коде ненадёжны — сетевые диски подключаются в контексте конкретного пользователя и могут быть недоступны службе.
Что важно запомнить
Тип данных определяет метод: Записать() у табличного документа, ТекстовыйДокумент или ДвоичныеДанные. Контекст выполнения определяет место сохранения: серверный код пишет на сервер, для клиента нужны временное хранилище и НачатьПолучениеФайла. Всегда указывайте кодировку для текстов, проверяйте извлечение из хранилища на Неопределено и контролируйте результат по существованию и размеру файла.