Работа с временными файлами в 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 и веб-клиенте |
ПоместитьФайл() |
Все режимы | Нет | Файл должен быть создан заранее |
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С, а не на машине пользователя. Чтобы с ними работать:
- Используйте серверные процедуры для генерации файлов.
- Передавайте путь к файлу клиенту через
HTTPСервисилиWeb-расширения. - Для скачивания файла пользователем применяйте
ПолучитьФайл()в HTTP-запросе.
Для надёжной работы с временными файлами всегда проверяйте их существование перед использованием (НайтиФайлы()) и удаляйте после завершения операций (УдалитьФайлы()).