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