Работа с временными файлами в 1С:Предприятие — рутинная задача для разработчиков, но часто возникают ситуации, когда нужно не просто создать файл, а получить его полный путь для дальнейшей обработки. Например, при генерации отчётов в PDF, экспорте данных в Excel или обмене с внешними системами через JSON/XML. Платформа 1С не всегда предоставляет прямой доступ к имени временного файла, что вынуждает искать обходные пути.

В этой статье разберём 5 проверенных способов получить имя временного файла в различных сценариях: от стандартных методов встроенного языка до низкоуровневых обходов через COM-объекты и WScript.Shell. Особое внимание уделим нюансам работы в режиме тонкого клиента, веб-клиента и на сервере 1С, где доступ к файловой системе ограничен. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.20+ и актуальны для конфигураций УТ 11, БП 3.0, ЗУП 3.1.

1. Стандартный метод: Получение имени через «ПоместитьФайл»

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

Пример кода для сохранения табличного документа во временный файл и получения его имени:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Вывести("Пример текста");

// Сохраняем во временный файл и получаем его имя

ИмяФайла = ПоместитьФайл(ТабДок.Сохранить(), КаталогВременныхФайлов());

Сообщить(ИмяФайла);

  • 📁 КаталогВременныхФайлов() — возвращает путь к стандартной временной папке 1С (обычно %TEMP%\1C\1Cv8).
  • 🔄 Файл автоматически удаляется при закрытии сеанса, если не использовать ЗафиксироватьВременныйФайл().
  • ⚡ Подходит для Excel, PDF, TXT и других форматов, поддерживаемых 1С.
💡

Если нужно сохранить файл на постоянной основе, используйте ЗафиксироватьВременныйФайл(ИмяФайла) — это перенесёт его из временной папки в каталог пользователя.

2. Обходной путь: Использование COM-объекта «WScript.Shell»

В режиме толстого клиента или на сервере можно воспользоваться COM-объектом WScript.Shell для генерации уникального имени временного файла по правилам Windows. Этот метод полезен, если нужно создать файл до его фактического сохранения.

Пример кода:

Попытка

WScript = Новый COMОбъект("WScript.Shell");

ВременныйФайл = WScript.ExpandEnvironmentStrings("%TEMP%") + "\1C_Temp_" + Строка(ТипЗнчЧисло(ТекущаяДата(), "ЧЧММСС")) + ".tmp";

Сообщить(ВременныйФайл);

Исключение

Сообщить("Ошибка: " + ОписаниеОшибки());

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

⚠️ Внимание: В тонком клиенте и веб-клиенте доступ к WScript.Shell заблокирован по умолчанию. Используйте этот метод только в толстом клиенте или на сервере 1С.
  • 🔧 Генерация имени по шаблону 1C_Temp_ЧЧММСС.tmp гарантирует уникальность.
  • 📂 Путь %TEMP% автоматически развернётся в системную временную папку (например, C:\Users\AppData\Local\Temp).
  • 🚫 Не работает в Linux-версиях 1С (требуется альтернатива через mktemp).

3. Работа с временными файлами на сервере 1С

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

Пример для серверного контекста:

ИмяФайла = КаталогВременныхФайлов() + "TempData_" + УникальныйИдентификатор() + ".json";

// Запись данных в файл

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

Данные.ЗаписатьСтроку("{\"test\": \"data\"}");

Данные.Закрыть();

Метод Работает в Требует прав Ограничения
КаталогВременныхФайлов() Толстый клиент, Сервер, Тонкий клиент* Нет В тонком клиенте путь может отличаться
WScript.Shell Толстый клиент, Сервер (Windows) Да (администратор) Не работает в Linux и веб-клиенте
ПоместитьФайл() Все режимы Нет Файл должен быть создан заранее
📊 Какой режим 1С вы используете чаще?
Толстый клиент
Тонкий клиент
Веб-клиент
Сервер 1С

4. Альтернативный способ: Генерация уникального имени вручную

Если стандартные методы недоступны (например, в веб-клиенте), можно сгенерировать уникальное имя самостоятельно, используя:

  • 🕒 Текущее время (миллисекунды): ТекущаяДата().Миллисекунда().
  • 🆔 GUID: Новый УникальныйИдентификатор().
  • 📊 Случайное число: Цел(СлучайноеЧисло() * 1000000).

Пример кода для веб-клиента:

ИмяФайла = "TempFile_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + "_" + Цел(СлучайноеЧисло() * 1000) + ".csv";

// Результат: TempFile_20260515_143022_456.csv

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

Чтобы узнать, поддерживается ли метод ПолучитьИмяВременногоФайлаНаСервере() в вашей конфигурации, откройте синтакс-помощник (F1 в конфигураторе) и поищите его в разделе "Глобальный контекст" или "Серверные процедуры". Если метода нет, используйте обходные пути из этой статьи.

5. Работа с временными файлами в обменах данными (XML, JSON)

При обмене данными через XML или JSON часто требуется сохранить промежуточный файл для отладки или логирования. Например, при интеграции с 1С:EDT или внешними системами через REST API.

Пример сохранения JSON-данных во временный файл:

ДанныеJSON = Новый Структура("Имя, Значение", "Тест", 123);

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

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьJSON(ДанныеJSON);

// Получаем временный файл

ИмяФайла = ПоместитьФайл(ЗаписьJSON.Закрыть(), КаталогВременныхФайлов());

Сообщить("Файл сохранён: " + ИмяФайла);

  • 📄 Для XML используйте ЗаписьXML вместо ЗаписьJSON.
  • 🔗 Временный файл можно передать в HTTPЗапрос для отправки на сервер.
  • 🗑️ Не забывайте удалять файлы после использования: УдалитьФайлы(ИмяФайла).

Проверить права доступа к папке %TEMP%|Убедиться, что диск не переполнен|Зафиксировать файл, если он нужен после сеанса|Удалить файл после использования (если не нужен)-->

6. Нюансы работы в Linux-версиях 1С

В 1С:Предприятие для Linux временные файлы создаются в каталоге /tmp/1C/, а доступ к WScript.Shell отсутствует. Вместо него можно использовать:

  • 🐧 Команду mktemp через ВыполнитьКомандуСистемы():
ИмяФайла = СокрЛП(ВыполнитьКомандуСистемы("mktemp /tmp/1C_Temp_XXXXXX.json"));

Сообщить(ИмяФайла);

  • 📁 Проверку существования каталога /tmp/1C/ и создание при необходимости.
⚠️ Внимание: В Linux права на запись во временные папки могут отличаться. Убедитесь, что пользователь, под которым работает сервер 1С, имеет доступ к /tmp/.

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

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

Да, но только обходными путями:

  • В толстом клиенте — через WScript.Shell (см. раздел 2).
  • На сервере — сгенерировать имя вручную (раздел 4).
  • В веб-клиенте — использовать УникальныйИдентификатор().

Стандартные методы 1С (например, ПоместитьФайл()) требуют, чтобы файл уже существовал.

Как узнать путь к временной папке 1С в тонком клиенте?

В тонком клиенте путь к временным файлам может отличаться от стандартного %TEMP%. Чтобы его получить:

Сообщить(КаталогВременныхФайлов()); // Например: C:\Users\AppData\Local\1C\1Cv8\ТонкийКлиент\Temp\

Этот путь зависит от настроек 1С:Предприятия и прав пользователя.

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

Файлы, созданные через ПоместитьФайл(), помечаются как временные и автоматически удаляются при:

  • Завершении сеанса 1С.
  • Очистке временных файлов системой (например, при перезагрузке ПК).

Чтобы сохранить файл, используйте ЗафиксироватьВременныйФайл(ИмяФайла).

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

В веб-клиенте временные файлы создаются на сервере 1С, а не на машине пользователя. Чтобы с ними работать:

  1. Используйте серверные процедуры для генерации файлов.
  2. Передавайте путь к файлу клиенту через HTTPСервис или Web-расширения.
  3. Для скачивания файла пользователем применяйте ПолучитьФайл() в HTTP-запросе.
💡

Для надёжной работы с временными файлами всегда проверяйте их существование перед использованием (НайтиФайлы()) и удаляйте после завершения операций (УдалитьФайлы()).