Разработка и Конфигурация · 11 мин
Как сохранить временный файл в 1С
Как сохранить временный файл в 1С: ПолучитьИмяВременногоФайла, КаталогВременныхФайлов, запись на диск и удаление. Примеры кода, ошибки и проверка результата.
Временные файлы в 1С нужны при выгрузке данных, формировании отчётов, обмене с внешними системами и промежуточной обработке табличных документов. Платформа предоставляет встроенные механизмы: функцию ПолучитьИмяВременногоФайла(), каталог временных файлов операционной системы и методы записи табличных документов, двоичных данных и текстов.
Главная ошибка новичков — сохранять «временные» файлы в произвольные папки и забывать их удалять. Это приводит к переполнению диска на сервере, особенно в клиент-серверном режиме, где код выполняется под служебной учётной записью агента сервера 1С. Правильный подход — использовать системный временный каталог и явно удалять файл после использования.
Ниже разобраны основные способы создания и сохранения временных файлов, примеры кода для тонкого клиента и сервера, а также типичные ошибки и способы проверки результата.
Что такое временный файл в контексте 1С
Временный файл — это файл, который создаётся программой на время выполнения операции и не предназначен для долговременного хранения. В 1С такие файлы появляются при выгрузке XML, сохранении табличного документа в Excel, формировании печатной формы для отправки по почте, распаковке архивов и обмене данными через промежуточные форматы.
Платформа 1С не имеет отдельного «объекта временного файла». Разработчик получает путь к файлу в системном временном каталоге и работает с ним обычными средствами встроенного языка. Очистка каталога — зона ответственности операционной системы и самого кода: Windows периодически чистит %TEMP%, но в серверных сценариях рассчитывать на это нельзя.
Получение имени временного файла
Базовая функция — ПолучитьИмяВременногоФайла(Расширение). Параметр необязателен, но указывать расширение рекомендуется: от него зависит, как файл откроется внешними программами и как его обработают методы платформы.
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
// Результат: C:\Users\User\AppData\Local\Temp\1cv8XXXX.tmp.xml
// (точный вид зависит от ОС и настроек)
Обратите внимание: функция только генерирует уникальное имя, физически файл на диске не появляется. Если нужно узнать сам каталог без создания файла, используйте КаталогВременныхФайлов() — она вернёт путь к папке, где можно организовать собственную структуру подкаталогов.
В веб-клиенте прямая работа с файловой системой ограничена: там применяется механизм НачатьПомещениеФайла / НачатьПолучениеФайлов и временное хранилище, о котором речь пойдёт ниже.
Запись данных во временный файл
Табличный документ
Самый частый сценарий — сохранить сформированный табличный документ (отчёт, печатную форму) во временный файл, например для последующей отправки по электронной почте:
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Метод Записать табличного документа поддерживает форматы MXL, XLSX, PDF, HTML, ODS и другие. Тип файла должен соответствовать расширению, иначе внешняя программа не сможет корректно открыть результат.
Текстовые и двоичные данные
Для текстов используется объект ЗаписьТекста с явным указанием кодировки:
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Строка данных");
Запись.Закрыть();
Двоичные данные (картинки, архивы, содержимое из хранилища значений) записываются методом Записать объекта ДвоичныеДанные:
ДвоичныеДанные = ХранилищеЗначения.Получить();
ИмяФайла = ПолучитьИмяВременногоФайла("zip");
ДвоичныеДанные.Записать(ИмяФайла);
- 1Получите путь: ИмяФайла = ПолучитьИмяВременногоФайла(Расширение)
- 2Запишите данные подходящим методом: Записать, ЗаписьТекста или ДвоичныеДанные.Записать
- 3Используйте файл: передайте в отправку почты, чтение, обмен
- 4Удалите файл после завершения: УдалитьФайлы(ИмяФайла) в блоке Исключение/после обработки
- 5Проверьте, что каталог не накапливает файлы при массовых операциях
Особенности работы на сервере и на клиенте
Ключевой момент, который часто упускают: в клиент-серверном режиме код, выполняемый на сервере, создаёт временный файл на диске сервера 1С, а не на компьютере пользователя. Если файл нужен пользователю, его необходимо передать на клиент через временное хранилище.
Типовая схема передачи выглядит так: на сервере файл создаётся, считывается в двоичные данные и помещается во временное хранилище функцией ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы). Клиент получает из хранилища данные и сохраняет их у себя через ПолучитьФайл или диалог сохранения.
// Серверная процедура
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Данные = Новый ДвоичныеДанные(ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
УдалитьФайлы(ИмяФайла);
Ещё одно отличие касается прав доступа. На сервере код работает под учётной записью агента сервера 1С (обычно USR1CV8), поэтому попытка записать файл в произвольную папку может завершиться ошибкой доступа. Системный временный каталог в этом смысле безопаснее — права на него у служебной учётной записи есть.
Удаление временных файлов
Удаление — обязательная часть сценария. Используйте метод УдалитьФайлы(Путь), который не вызывает исключения, если файл уже отсутствует (при отсутствии маски и подходящих файлов). Чтобы гарантировать очистку даже при ошибке, помещайте удаление после блока обработки или в конструкцию Попытка...Исключение с повторным удалением.
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
Попытка
// запись и использование файла
...
УдалитьФайлы(ИмяФайла);
Исключение
УдалитьФайлы(ИмяФайла);
ВызватьИсключение;
КонецПопытки;
Учтите, что файл нельзя удалить, пока он занят другим процессом: например, открыт в Excel или используется объектом ЧтениеXML, для которого не вызван метод Закрыть(). Если УдалитьФайлы завершается ошибкой «файл занят», проверьте, что все объекты чтения/записи закрыты явно.
Альтернатива: временное хранилище без файла
Во многих задачах файл на диске вообще не нужен. Если данные требуется только передать между сервером и клиентом или между вызовами в рамках одной формы, достаточно временного хранилища: двоичные данные помещаются туда функцией ПоместитьВоВременноеХранилище и извлекаются по адресу функцией ПолучитьИзВременногоХранилища.
Сравнение вариантов
Подходит, когда файл нужен внешней программе, почтовому вложению или обмену. Требует явного удаления и прав на каталог.
Подходит для передачи данных между сервером и клиентом без диска. Живёт ограниченное время или до закрытия формы, файлы не засоряют сервер.
Подходит для промежуточной обработки данных в одном вызове кода. Не доступен внешним программам, но самый быстрый вариант.
Выбор зависит от потребителя данных: если результат должен открыть пользователь или внешняя система — нужен файл; если данные обрабатываются только внутри 1С — хранилище или поток в памяти будут чище и быстрее.
Проверка результата и диагностика
После записи файла полезно убедиться, что он действительно создан и не пуст. Для этого используется объект Файл с методом Существует() и свойством Размер():
Проверка = Новый Файл(ИмяФайла);
Если Проверка.Существует() И Проверка.Размер() > 0 Тогда
// файл записан корректно
КонецЕсли;
Как проверить результат
Объект Файл.Существует() возвращает Истина
Файл не создан — проверьте права на каталог и корректность пути
Размер больше нуля и соответствует ожидаемому объёму данных
Размер 0 — данные не записаны, возможно не вызван Закрыть() у объекта записи
Excel, Word или просмотрщик PDF открывают файл без ошибок
Ошибка формата — расширение не соответствует типу записи
После завершения обработки временный файл удалён
Файлы накапливаются — удаление не выполняется или файл занят процессом
Если код выполняется на сервере, помните, что искать файл нужно на сервере, а не на компьютере пользователя. Для отладки удобно временно выводить путь в журнал регистрации через ЗаписьЖурналаРегистрации, чтобы понять, где именно создаётся файл.
Что важно запомнить
Путь к временному файлу получают через ПолучитьИмяВременногоФайла, запись выполняют методом, соответствующим типу данных, а после использования файл обязательно удаляют. В клиент-серверном режиме различайте файловую систему сервера и клиента, а для передачи данных без диска применяйте временное хранилище.
Частые вопросы
Где физически находится временный файл, созданный в 1С?
В системном временном каталоге операционной системы. На клиенте это обычно папка %TEMP% пользователя, на сервере — временный каталог учётной записи агента сервера 1С. Точный путь возвращает функция КаталогВременныхФайлов().
Почему ПолучитьИмяВременногоФайла не создаёт файл?
Так задумано: функция генерирует только уникальное имя. Файл появится после вызова метода записи — Записать у табличного документа или двоичных данных, ЗаписьТекста и т.п. Это позволяет получить имя заранее и передать его в другую процедуру.
Как передать временный файл с сервера на клиент?
Считайте файл в двоичные данные, поместите их во временное хранилище с привязкой к уникальному идентификатору формы, верните адрес хранилища на клиент и сохраните данные через ПолучитьФайл или диалог сохранения. Серверный файл после этого удалите.
Что делать, если УдалитьФайлы выдаёт ошибку «файл занят»?
Файл удерживает открытый объект: незакрытые ЗаписьТекста, ЧтениеXML, ЧтениеДанных или внешняя программа вроде Excel. Вызовите Закрыть() у всех объектов работы с файлом и повторите удаление. Если файл открыт пользователем вручную, удалить его сможет только он.
Можно ли обойтись без временного файла при обмене данными?
Часто да. Для передачи данных между сервером и клиентом используйте временное хранилище, а для промежуточной обработки в одном вызове — ПотокВПамяти. Файл на диске оправдан, только когда его должен получить внешний потребитель: почтовое вложение, сторонняя программа, обмен через каталог.
Работает ли ПолучитьИмяВременногоФайла в веб-клиенте?
В веб-клиенте прямой доступ к файловой системе ограничен, и типовые файловые операции требуют расширения работы с файлами либо асинхронных методов (НачатьПолучениеФайлов, НачатьПомещениеФайла). Предпочтительный путь — формировать данные на сервере и передавать их через временное хранилище.