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

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

Как записать временный файл в 1С: пошаговое руководство с примерами

Разбираем, как создать и записать временный файл в 1С: ПолучитьИмяВременногоФайла, ЗаписьТекста, двоичные данные, очистка каталога Temp, типичные ошибки и примеры кода.

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

Основной инструмент — функция ПолучитьИмяВременногоФайла(), которая возвращает уникальное имя в каталоге временных файлов операционной системы (на Windows это обычно подкаталог внутри %TEMP% пользователя сеанса). Важно понимать: функция возвращает только имя, сам файл при этом не создаётся. Запись выполняется отдельно — через ЗаписьТекста, ЗаписьXML, объект ДвоичныеДанные или табличный документ.

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

Как работает ПолучитьИмяВременногоФайла и где лежат временные файлы

Функция ПолучитьИмяВременногоФайла(Расширение) генерирует уникальное имя файла в каталоге временных файлов текущего пользователя. Параметр Расширение необязателен: если его не указать, файл получит расширение .tmp. Если передать, например, "xml" или "xlsx", имя сразу будет с корректным расширением, что удобно при передаче файла внешним программам.

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

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

Запись текстового содержимого во временный файл

Самый частый сценарий — записать текст: CSV, лог, служебный файл для обмена. Для этого используется объект ЗаписьТекста. Минимальный рабочий пример:

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

Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

Запись.ЗаписатьСтроку("Первая строка данных");

Запись.ЗаписатьСтроку("Вторая строка данных");

Запись.Закрыть();

Обязательно указывайте кодировку явно. По умолчанию используется системная кодировка, и на разных машинах результат может отличаться: файл, корректно читаемый на одном сервере, на другом превратится в нечитаемые символы. Для обмена с внешними системами чаще всего подходит UTF-8.

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

Запись XML, JSON и табличных документов

Для XML удобнее использовать ЗаписьXML — он сам контролирует корректность структуры и открывающих/закрывающих тегов:

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

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");

ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");

ЗаписьXML.ЗаписатьТекст("Содержимое");

ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.Закрыть();

Если временный файл должен содержать табличный документ (например, отчёт для последующей отправки), используйте метод Записать табличного документа с указанием типа файла:

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

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

Для JSON в современных версиях платформы есть объект ЗаписьJSON, который работает аналогично: открываете файл, пишете структуру, закрываете. Ручная сборка JSON конкатенацией строк — плохая практика: легко получить невалидный документ из-за спецсимволов в данных.

Порядок записи временного файла
  1. 1
    Получите имя: ИмяФайла = ПолучитьИмяВременногоФайла("расширение")
  2. 2
    Создайте объект записи (ЗаписьТекста, ЗаписьXML или подготовьте ДвоичныеДанные)
  3. 3
    Запишите данные и обязательно закройте поток методом Закрыть()
  4. 4
    Используйте файл: передайте путь внешней системе, прочитайте или отправьте
  5. 5
    Удалите файл: УдалитьФайлы(ИмяФайла) в блоке с гарантированным выполнением

Запись двоичных данных и файлов из хранилища

Когда данные уже существуют в виде двоичных данных — например, картинка из реквизита справочника или файл из временного хранилища, — запись выполняется методом Записать объекта ДвоичныеДанные:

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

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ДвоичныеДанные.Записать(ИмяФайла);

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

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

Очистка: удаление временных файлов и защита от утечек

Платформа не гарантирует автоматическое удаление временных файлов, созданных вашим кодом. Если процедура выполняется часто — например, регламентным заданием каждые несколько минут, — каталог Temp на сервере будет неуклонно расти, пока не закончится место на диске. Это одна из самых частых причин «внезапных» падений сервера 1С и СУБД.

Правильный шаблон — удаление в блоке Попытка...Исключение с гарантированным выполнением:

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

Попытка

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

...

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

Исключение

Попытка

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

Исключение

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

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

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

Метод УдалитьФайлы вызывает исключение, если файл заблокирован другим процессом или уже удалён, поэтому обёртка во вложенную попытку защищает от «двойной» ошибки, которая замаскирует исходную проблему. Дополнительно полезно вести запись в журнал регистрации о неудалённых файлах — это упрощает поиск утечек.

Типичные ошибки и как их избежать

Первая распространённая ошибка — попытка читать файл сразу после ПолучитьИмяВременногоФайла, не записав в него данные. Функция возвращает только имя; файл появится на диске только после фактической записи. Проверить существование можно методом объекта Файл: Новый Файл(ИмяФайла).Существует().

Вторая ошибка — использование фиксированных имён вроде "C:\Temp\obmen.xml" вместо уникальных. При параллельной работе пользователей или фоновых заданий один сеанс перезапишет файл другого, и в обмен уйдут чужие данные. Это не только техническая, но и потенциально конфиденциальная проблема.

Третья группа проблем связана с правами доступа: учётная запись агента сервера может не иметь прав на запись в произвольные каталоги, а антивирус — блокировать создание исполняемых или скриптовых файлов в Temp. Если запись «молча» не работает, проверяйте журнал регистрации и права на каталог.

Типичные ошибки при работе с временными файлами
01
Чтение файла сразу после ПолучитьИмяВременногоФайла — файл ещё не создан, возникает ошибка открытия
02
Отсутствие Закрыть() у ЗаписьТекста или ЗаписьXML — данные остаются в буфере, файл пустой или неполный
03
Фиксированное имя файла вместо уникального — параллельные сеансы перезаписывают данные друг друга
04
Запись на сервере и попытка открыть файл на клиенте — это разные компьютеры
05
Отсутствие УдалитьФайлы — переполнение диска сервера при регулярных операциях
06
Неуказанная кодировка — на другой машине текст читается с искажёнными символами

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

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

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

ВызватьИсключение "Временный файл не был создан";

КонецЕсли;

Если Файл.Размер() = 0 Тогда

ВызватьИсключение "Временный файл пуст — запись не выполнена";

КонецЕсли;

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

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

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

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

Файл(ИмяФайла).Существует() возвращает Истина

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

Ложь — запись не выполнялась или поток не закрыт

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

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

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

Нулевой размер — данные не записаны или остались в буфере

Читаемость структуры
Норма

XML/JSON открывается соответствующим объектом чтения без исключений

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

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

Очистка
Норма

После УдалитьФайлы файл отсутствует на диске

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

Файл остаётся — утечка дискового пространства

FAQ: частые вопросы о временных файлах в 1С

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

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

Удаляет ли платформа временные файлы автоматически?

Нет, за файлами, созданными вашим кодом, платформа не следит. Автоматически очищаются только данные временного хранилища при завершении сеанса. Файлы на диске нужно удалять явно методом УдалитьФайлы, иначе каталог Temp будет расти.

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

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

Почему ПолучитьИмяВременногоФайла вызывает ошибку в фоновом задании?

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

Чем временный файл отличается от временного хранилища?

Временный файл — это физический файл на диске, доступный внешним программам по пути. Временное хранилище — механизм платформы для передачи данных между клиентом и сервером по адресу вида «e1cib/tempstorage/...», без создания видимого файла. Для обмена между клиентом и сервером чаще подходит хранилище, для взаимодействия с внешними программами — файл.

Безопасно ли хранить во временных файлах персональные данные?

Рискованно. Каталог Temp доступен другим процессам той же учётной записи, а неудалённые файлы могут попасть в резервные копии или руки третьих лиц. Если данные чувствительны, минимизируйте время жизни файла, удаляйте его сразу после использования и по возможности ограничивайте права на каталог.

Итог

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

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