Разработка и Конфигурация · 11 мин
Как получить временный файл в 1С
Как получить временный файл в 1С: функция ПолучитьИмяВременногоФайла, работа с каталогом временных файлов, примеры кода, типичные ошибки и очистка файлов.
Временные файлы в 1С используются при обмене данными, формировании отчётов во внешние форматы, выгрузке печатных форм, передаче данных между клиентом и сервером. Платформа предоставляет встроенные средства для получения пути к временному файлу, и правильное их применение избавляет от конфликтов имён, утечек дискового пространства и ошибок прав доступа.
Основной инструмент — функция ПолучитьИмяВременногоФайла(), которая возвращает уникальное имя файла в каталоге временных файлов операционной системы. Помимо неё существуют функции КаталогВременныхФайлов() и ПолучитьИмяВременногоФайлаАсинх() для асинхронного режима, а также тип ФайловыйПоток для работы с содержимым. Выбор зависит от контекста выполнения: тонкий клиент, веб-клиент, сервер или внешнее соединение.
Важно понимать: платформа создаёт только уникальное имя, а не сам файл. Запись, чтение и удаление — ответственность разработчика. Ниже разобраны все рабочие сценарии с примерами кода и ограничениями.
Функция ПолучитьИмяВременногоФайла: синтаксис и поведение
Функция ПолучитьИмяВременногоФайла(Расширение) доступна на тонком клиенте, толстом клиенте, сервере и во внешнем соединении. Параметр «Расширение» необязателен: если его не указать, файл получит расширение .tmp. Если передать, например, "xml" или "xlsx", имя будет сформировано с нужным расширением — это удобно, когда файл дальше открывается внешней программой.
Функция генерирует уникальное имя внутри каталога временных файлов. Уникальность гарантируется в пределах текущего сеанса работы платформы, поэтому конфликты имён между параллельными вызовами исключены. Однако сам файл на диске при этом не создаётся — возвращается только строка пути.
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку("<данные>пример</данные>");
Текст.Закрыть();
// ... использование файла ...
УдалитьФайлы(ИмяФайла);Если вызов завершился ошибкой или файл не удалось создать позже, проверяйте его существование через Файл.Существует() перед чтением. Это защитит от падения обработки при нехватке места на диске или ограничениях прав.
Получение каталога временных файлов
Функция КаталогВременныхФайлов() возвращает путь к каталогу, который операционная система использует для временных данных. На Windows это обычно подкаталог профиля пользователя (переменная окружения TEMP), на Linux — каталог, заданный переменной TMPDIR или /tmp. В клиент-серверном режиме при вызове на сервере возвращается каталог сервера, при вызове на клиенте — каталог клиентского компьютера.
Эту функцию применяют, когда нужно самостоятельно организовать структуру временных данных: создать подкаталог для пакета файлов, разместить несколько связанных документов или контролировать место хранения. Возвращаемый путь уже содержит разделитель на конце, поэтому имя файла присоединяется напрямую.
Каталог = КаталогВременныхФайлов();
ИмяПодкаталога = Каталог + "obmen_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss");
СоздатьКаталог(ИмяПодкаталога);
// далее файлы формируются внутри ИмяПодкаталогаВременные файлы в клиент-серверном режиме
Главная ловушка при работе с временными файлами — различие файловых систем клиента и сервера. Код, выполняемый в серверной процедуре, видит только диски сервера 1С. Если обработка формирует файл на сервере, а пользователь ожидает получить его на своём компьютере, потребуется передача через временное хранилище.
Типовая схема: на сервере файл создаётся функцией ПолучитьИмяВременногоФайла(), заполняется данными, затем помещается в хранилище через ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), АдресХранилища). На клиенте данные извлекаются по адресу и сохраняются через ПолучитьФайл() или диалог сохранения. После этого серверный временный файл удаляется.
- 1На сервере получите имя: ПолучитьИмяВременногоФайла() и запишите данные в файл
- 2Поместите файл в хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), Адрес)
- 3Удалите серверный временный файл через УдалитьФайлы()
- 4На клиенте получите данные из хранилища и сохраните через ПолучитьФайл() или диалог
- 5Проверьте, что файл открылся и содержит ожидаемые данные
В веб-клиенте прямой доступ к локальной файловой системе ограничен: без расширения работы с файлами сохранение возможно только через диалог браузера, а получение пути к локальному временному каталогу недоступно. Поэтому в тонком и веб-клиенте файловые операции на клиенте обычно оформляют асинхронно.
Асинхронные варианты и веб-клиент
В асинхронной модели, обязательной для веб-клиента и рекомендуемой для тонкого, синхронные файловые вызовы заменяются асинхронными аналогами. Для получения имени временного файла используется ПолучитьИмяВременногоФайлаАсинх(), для создания каталога — СоздатьКаталогАсинх(), для удаления — УдалитьФайлыАсинх(). Результат приходит в описание оповещения.
При разработке под управляемое приложение с режимом использования модальности «Не использовать» и включённым асинхронным режимом синхронные вызовы могут быть запрещены настройками конфигурации. Проверьте свойства конфигурации: «Режим использования синхронных вызовов расширений платформы и внешних компонент».
&НаКлиенте
Процедура СформироватьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПолученияИмени", ЭтотОбъект);
НачатьПолучениеИмениВременногоФайла(Оповещение, "xml");
КонецПроцедурыРабота с содержимым: запись, чтение, двоичные данные
После получения имени файл заполняется подходящим объектом. Для текстовых данных — ЗаписьТекста и ЧтениеТекста с указанием кодировки. Для XML — ЗаписьXML, для JSON — ЗаписьJSON, для произвольных бинарных данных — ДвоичныеДанные и файловые потоки. Табличный документ сохраняется методом Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX).
Частая задача — выгрузка данных из базы во временный файл и последующая загрузка в другой системе. Здесь важно явно указывать кодировку (UTF-8 — безопасный выбор для обмена) и закрывать объект записи до передачи файла дальше: незакрытый поток может держать файл занятым, и его не удастся ни прочитать внешней программой, ни удалить.
Как проверить результат
Файл.Существует() возвращает Истина, размер больше нуля
Файла нет или размер 0 байт — запись не выполнялась или поток не закрыт
Файл открывается целевой программой без ошибок формата
Ошибка разбора XML/JSON или кракозябры — неверная кодировка
После завершения обработки временные файлы удалены
В каталоге TEMP копятся файлы — удаление не вызывается
Удаление временных файлов и типичные ошибки
Платформа не гарантирует автоматическое удаление файлов, созданных по имени из ПолучитьИмяВременногоФайла(). Если обработка массово формирует файлы и не чистит за собой, каталог TEMP на сервере разрастается, что в конечном счёте приводит к нехватке дискового пространства и сбоям всего сервера 1С. Удаляйте файлы сразу после использования через УдалитьФайлы(ИмяФайла), а при пакетной работе — весь созданный подкаталог.
Надёжный приём — оборачивать работу с файлом в конструкцию Попытка/Исключение с удалением в блоке обработки ошибки, чтобы файл не остался даже при падении кода.
Альтернативы временным файлам
Не каждая задача требует файла на диске. Если данные нужны только для передачи между клиентом и сервером в рамках одного сеанса, достаточно временного хранилища: ПоместитьВоВременноеХранилище() работает с двоичными данными, табличными документами и другими значениями без обращения к диску. Это быстрее и не требует очистки.
Для обмена между сеансами или фоновыми заданиями подходят хранилище значения в реквизите объекта или регистре сведений. Файл на диске оправдан, когда данные передаются внешней программе, архивируются, отправляются по почте как вложение или когда объём настолько велик, что держать его в памяти нерационально.
Сравнение вариантов
Подходит для передачи данных внешним программам и больших выгрузок; требует ручного удаления файла
Оптимально для передачи между клиентом и сервером в сеансе; данные живут ограниченное время, диск не используется
Для обмена между сеансами и фоновыми заданиями; увеличивает размер базы, требует регламентной очистки
Быстрая обработка без диска для данных умеренного объёма; ограничена доступной памятью
Что важно запомнить
ПолучитьИмяВременногоФайла() возвращает только уникальный путь: создание, заполнение и удаление файла — задача разработчика. В клиент-серверном режиме передавайте файл через временное хранилище, а удаление оборачивайте в обработку исключений, чтобы не переполнить диск сервера.
FAQ
Чем ПолучитьИмяВременногоФайла отличается от КаталогВременныхФайлов?
Первая функция возвращает полный путь к уникальному несуществующему файлу, вторая — только путь к каталогу. Если нужен один файл, используйте ПолучитьИмяВременногоФайла; если планируете создать собственную структуру подкаталогов для пакета файлов — берите каталог и формируйте имена внутри него.
Почему файл, созданный на сервере, не открывается на клиенте?
Потому что сервер и клиент — разные компьютеры с разными файловыми системами. Путь вида C:\Windows\Temp на сервере указывает на диск сервера. Передайте содержимое через ПоместитьВоВременноеХранилище с двоичными данными файла, а на клиенте сохраните его заново.
Удаляет ли платформа временные файлы автоматически?
Нет, гарантированной автоматической очистки созданных вами файлов нет. Операционная система может периодически чистить каталог TEMP, но рассчитывать на это нельзя — особенно на сервере. Всегда вызывайте УдалитьФайлы после использования.
Как получить временный файл в веб-клиенте?
Используйте асинхронные методы: НачатьПолучениеИмениВременногоФайла с описанием оповещения. Учтите, что без расширения работы с файлами доступ к локальной файловой системе в веб-клиенте ограничен — чаще файл формируют на сервере и отдают пользователю через диалог сохранения браузера.
Какое расширение указывать, если файл промежуточный?
Если файл не открывается внешними программами, параметр можно не передавать — получится стандартное расширение .tmp. Если файл дальше открывается Excel, браузером или другой системой, укажите осмысленное расширение (xlsx, xml, html), чтобы целевая программа корректно определила формат.
Безопасно ли хранить во временных файлах пароли или персональные данные?
Нежелательно: каталог TEMP может быть доступен другим процессам и пользователям сервера, а файлы часто забывают удалять. Чувствительные данные держите в памяти или временном хранилище, а если файл неизбежен — удаляйте его сразу после использования и ограничивайте права на каталог.