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

Разработка и Конфигурация · 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. 1
    Получите путь: ИмяФайла = ПолучитьИмяВременногоФайла(Расширение)
  2. 2
    Запишите данные подходящим методом: Записать, ЗаписьТекста или ДвоичныеДанные.Записать
  3. 3
    Используйте файл: передайте в отправку почты, чтение, обмен
  4. 4
    Удалите файл после завершения: УдалитьФайлы(ИмяФайла) в блоке Исключение/после обработки
  5. 5
    Проверьте, что каталог не накапливает файлы при массовых операциях

Особенности работы на сервере и на клиенте

Ключевой момент, который часто упускают: в клиент-серверном режиме код, выполняемый на сервере, создаёт временный файл на диске сервера 1С, а не на компьютере пользователя. Если файл нужен пользователю, его необходимо передать на клиент через временное хранилище.

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

// Серверная процедура

ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");

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

Данные = Новый ДвоичныеДанные(ИмяФайла);

Адрес = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);

УдалитьФайлы(ИмяФайла);

Ещё одно отличие касается прав доступа. На сервере код работает под учётной записью агента сервера 1С (обычно USR1CV8), поэтому попытка записать файл в произвольную папку может завершиться ошибкой доступа. Системный временный каталог в этом смысле безопаснее — права на него у служебной учётной записи есть.

Удаление временных файлов

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

ИмяФайла = ПолучитьИмяВременногоФайла("xml");

Попытка

// запись и использование файла

...

УдалитьФайлы(ИмяФайла);

Исключение

УдалитьФайлы(ИмяФайла);

ВызватьИсключение;

КонецПопытки;

Учтите, что файл нельзя удалить, пока он занят другим процессом: например, открыт в Excel или используется объектом ЧтениеXML, для которого не вызван метод Закрыть(). Если УдалитьФайлы завершается ошибкой «файл занят», проверьте, что все объекты чтения/записи закрыты явно.

Типичные ошибки
01
Сохранение в фиксированную папку вроде C:\Temp — конфликт имён при параллельной работе пользователей и риск отсутствия прав
02
Отсутствие удаления файла — переполнение диска сервера при регулярных операциях
03
Несоответствие расширения и типа файла — внешняя программа не открывает результат
04
Забытый Закрыть() у ЗаписьТекста или ЧтениеXML — файл остаётся пустым или заблокированным
05
Ожидание файла на клиенте, когда он создан на сервере — пользователь не видит результат

Альтернатива: временное хранилище без файла

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

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

Временный файл на диске

Подходит, когда файл нужен внешней программе, почтовому вложению или обмену. Требует явного удаления и прав на каталог.

Временное хранилище

Подходит для передачи данных между сервером и клиентом без диска. Живёт ограниченное время или до закрытия формы, файлы не засоряют сервер.

Потоки в памяти (ПотокВПамяти)

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

Выбор зависит от потребителя данных: если результат должен открыть пользователь или внешняя система — нужен файл; если данные обрабатываются только внутри 1С — хранилище или поток в памяти будут чище и быстрее.

Проверка результата и диагностика

После записи файла полезно убедиться, что он действительно создан и не пуст. Для этого используется объект Файл с методом Существует() и свойством Размер():

Проверка = Новый Файл(ИмяФайла);

Если Проверка.Существует() И Проверка.Размер() > 0 Тогда

// файл записан корректно

КонецЕсли;

Контрольные точки

Как проверить результат

Существование файла
Норма

Объект Файл.Существует() возвращает Истина

Тревожный признак

Файл не создан — проверьте права на каталог и корректность пути

Размер файла
Норма

Размер больше нуля и соответствует ожидаемому объёму данных

Тревожный признак

Размер 0 — данные не записаны, возможно не вызван Закрыть() у объекта записи

Открытие внешней программой
Норма

Excel, Word или просмотрщик PDF открывают файл без ошибок

Тревожный признак

Ошибка формата — расширение не соответствует типу записи

Состояние каталога после операции
Норма

После завершения обработки временный файл удалён

Тревожный признак

Файлы накапливаются — удаление не выполняется или файл занят процессом

Если код выполняется на сервере, помните, что искать файл нужно на сервере, а не на компьютере пользователя. Для отладки удобно временно выводить путь в журнал регистрации через ЗаписьЖурналаРегистрации, чтобы понять, где именно создаётся файл.

Итог

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

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

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

Где физически находится временный файл, созданный в 1С?

В системном временном каталоге операционной системы. На клиенте это обычно папка %TEMP% пользователя, на сервере — временный каталог учётной записи агента сервера 1С. Точный путь возвращает функция КаталогВременныхФайлов().

Почему ПолучитьИмяВременногоФайла не создаёт файл?

Так задумано: функция генерирует только уникальное имя. Файл появится после вызова метода записи — Записать у табличного документа или двоичных данных, ЗаписьТекста и т.п. Это позволяет получить имя заранее и передать его в другую процедуру.

Как передать временный файл с сервера на клиент?

Считайте файл в двоичные данные, поместите их во временное хранилище с привязкой к уникальному идентификатору формы, верните адрес хранилища на клиент и сохраните данные через ПолучитьФайл или диалог сохранения. Серверный файл после этого удалите.

Что делать, если УдалитьФайлы выдаёт ошибку «файл занят»?

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

Можно ли обойтись без временного файла при обмене данными?

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

Работает ли ПолучитьИмяВременногоФайла в веб-клиенте?

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