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

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

Как получить временный файл в 1С

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

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

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

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

Функция ПолучитьИмяВременногоФайла: синтаксис и поведение

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

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

bsl
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку("<данные>пример</данные>");
Текст.Закрыть();
// ... использование файла ...
УдалитьФайлы(ИмяФайла);

Если вызов завершился ошибкой или файл не удалось создать позже, проверяйте его существование через Файл.Существует() перед чтением. Это защитит от падения обработки при нехватке места на диске или ограничениях прав.

Получение каталога временных файлов

Функция КаталогВременныхФайлов() возвращает путь к каталогу, который операционная система использует для временных данных. На Windows это обычно подкаталог профиля пользователя (переменная окружения TEMP), на Linux — каталог, заданный переменной TMPDIR или /tmp. В клиент-серверном режиме при вызове на сервере возвращается каталог сервера, при вызове на клиенте — каталог клиентского компьютера.

Эту функцию применяют, когда нужно самостоятельно организовать структуру временных данных: создать подкаталог для пакета файлов, разместить несколько связанных документов или контролировать место хранения. Возвращаемый путь уже содержит разделитель на конце, поэтому имя файла присоединяется напрямую.

bsl
Каталог = КаталогВременныхФайлов();
ИмяПодкаталога = Каталог + "obmen_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss");
СоздатьКаталог(ИмяПодкаталога);
// далее файлы формируются внутри ИмяПодкаталога

Временные файлы в клиент-серверном режиме

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

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

Передача файла с сервера на клиент
  1. 1
    На сервере получите имя: ПолучитьИмяВременногоФайла() и запишите данные в файл
  2. 2
    Поместите файл в хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), Адрес)
  3. 3
    Удалите серверный временный файл через УдалитьФайлы()
  4. 4
    На клиенте получите данные из хранилища и сохраните через ПолучитьФайл() или диалог
  5. 5
    Проверьте, что файл открылся и содержит ожидаемые данные

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

Асинхронные варианты и веб-клиент

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

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

bsl
&НаКлиенте
Процедура СформироватьФайл(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеПолученияИмени", ЭтотОбъект);
	НачатьПолучениеИмениВременногоФайла(Оповещение, "xml");
КонецПроцедуры

Работа с содержимым: запись, чтение, двоичные данные

После получения имени файл заполняется подходящим объектом. Для текстовых данных — ЗаписьТекста и ЧтениеТекста с указанием кодировки. Для XML — ЗаписьXML, для JSON — ЗаписьJSON, для произвольных бинарных данных — ДвоичныеДанные и файловые потоки. Табличный документ сохраняется методом Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX).

Частая задача — выгрузка данных из базы во временный файл и последующая загрузка в другой системе. Здесь важно явно указывать кодировку (UTF-8 — безопасный выбор для обмена) и закрывать объект записи до передачи файла дальше: незакрытый поток может держать файл занятым, и его не удастся ни прочитать внешней программой, ни удалить.

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

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

Файл создан
Норма

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

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

Файла нет или размер 0 байт — запись не выполнялась или поток не закрыт

Содержимое корректно
Норма

Файл открывается целевой программой без ошибок формата

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

Ошибка разбора XML/JSON или кракозябры — неверная кодировка

Очистка выполнена
Норма

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

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

В каталоге TEMP копятся файлы — удаление не вызывается

Удаление временных файлов и типичные ошибки

Платформа не гарантирует автоматическое удаление файлов, созданных по имени из ПолучитьИмяВременногоФайла(). Если обработка массово формирует файлы и не чистит за собой, каталог TEMP на сервере разрастается, что в конечном счёте приводит к нехватке дискового пространства и сбоям всего сервера 1С. Удаляйте файлы сразу после использования через УдалитьФайлы(ИмяФайла), а при пакетной работе — весь созданный подкаталог.

Надёжный приём — оборачивать работу с файлом в конструкцию Попытка/Исключение с удалением в блоке обработки ошибки, чтобы файл не остался даже при падении кода.

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

Альтернативы временным файлам

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

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

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

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

Подходит для передачи данных внешним программам и больших выгрузок; требует ручного удаления файла

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

Оптимально для передачи между клиентом и сервером в сеансе; данные живут ограниченное время, диск не используется

Хранилище значения в базе

Для обмена между сеансами и фоновыми заданиями; увеличивает размер базы, требует регламентной очистки

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

Быстрая обработка без диска для данных умеренного объёма; ограничена доступной памятью

Итог

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

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

FAQ

Чем ПолучитьИмяВременногоФайла отличается от КаталогВременныхФайлов?

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

Почему файл, созданный на сервере, не открывается на клиенте?

Потому что сервер и клиент — разные компьютеры с разными файловыми системами. Путь вида C:\Windows\Temp на сервере указывает на диск сервера. Передайте содержимое через ПоместитьВоВременноеХранилище с двоичными данными файла, а на клиенте сохраните его заново.

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

Нет, гарантированной автоматической очистки созданных вами файлов нет. Операционная система может периодически чистить каталог TEMP, но рассчитывать на это нельзя — особенно на сервере. Всегда вызывайте УдалитьФайлы после использования.

Как получить временный файл в веб-клиенте?

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

Какое расширение указывать, если файл промежуточный?

Если файл не открывается внешними программами, параметр можно не передавать — получится стандартное расширение .tmp. Если файл дальше открывается Excel, браузером или другой системой, укажите осмысленное расширение (xlsx, xml, html), чтобы целевая программа корректно определила формат.

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

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