Разработка и Конфигурация · 13 мин
Как открыть временный файл в 1С
Как открыть временный файл в 1С: работа с ПолучитьИмяВременногоФайла, открытие через ЗапуститьПриложение, чтение данных, типичные ошибки и очистка файлов.
Временные файлы в 1С используются постоянно: при обмене данными, формировании отчётов во внешние форматы, выгрузке табличных документов, передаче файлов между клиентом и сервером. Задача «открыть временный файл» возникает в двух типичных ситуациях: разработчику нужно программно создать и открыть временный файл из кода, либо пользователю требуется найти и просмотреть файл, который 1С создала в системной папке временных файлов.
Оба сценария решаются штатными средствами платформы, без сторонних утилит. Важно понимать, что временный файл живёт ограниченное время: операционная система и сама платформа могут удалить его в любой момент, поэтому данные, которые нужны надолго, следует сразу сохранять в постоянное место.
Ниже разобраны практические способы: получение имени временного файла, запись и чтение данных, открытие файла внешним приложением, работа с каталогом временных файлов и типичные ошибки, из-за которых файл «не открывается».
Что такое временный файл в контексте 1С
Временный файл — это файл, который платформа или прикладной код создаёт в специальном каталоге операционной системы для промежуточного хранения данных. Типичные примеры: выгрузка табличного документа в Excel перед отправкой, XML-файл обмена, архив с печатными формами, файл выгрузки для банка-клиента.
Платформа 1С предоставляет два ключевых инструмента: функцию ПолучитьИмяВременногоФайла(), которая генерирует уникальное имя файла в каталоге временных файлов, и функцию КаталогВременныхФайлов(), возвращающую путь к этому каталогу. На клиенте и на сервере это разные каталоги — этот момент часто становится источником ошибок.
Важная особенность: ПолучитьИмяВременногоФайла() не создаёт файл, а лишь резервирует уникальное имя. Файл появится на диске только после того, как код явно запишет в него данные — через ТекстовыйДокумент, ЗаписьXML, метод Записать() табличного документа или другие средства.
Как программно создать и открыть временный файл
Стандартная последовательность выглядит так: получить имя файла, записать в него данные, затем открыть файл внешним приложением или прочитать его содержимое. Ниже пример для управляемого приложения с записью табличного документа и открытием результата.
&НаКлиенте
Процедура ОткрытьВременныйФайл(Команда)
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДокумент = СформироватьНаСервере();
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
ФайловаяСистемаКлиент.ОткрытьФайл(ИмяФайла);
КонецПроцедурыМетод ФайловаяСистемаКлиент.ОткрытьФайл() доступен в тонком и веб-клиенте начиная с современных версий платформы и открывает файл приложением, сопоставленным расширению в операционной системе. В толстом клиенте и в старом коде вместо него используется ЗапуститьПриложение(ИмяФайла) — он работает синхронно и блокирует интерфейс до завершения вызова.
Если файл нужно открыть не внешней программой, а прочитать внутри 1С, используйте соответствующий объект: ТекстовыйДокумент.Прочитать() для текстов, ЧтениеXML для XML, ТабличныйДокумент.Прочитать() для mxl и совместимых форматов. После чтения временный файл можно удалить методом УдалитьФайлы(ИмяФайла).
- 1Вызовите ПолучитьИмяВременногоФайла() с нужным расширением
- 2Запишите данные в файл подходящим объектом (ТабличныйДокумент, ТекстовыйДокумент, ЗаписьXML)
- 3Проверьте, что файл существует и имеет ненулевой размер
- 4Откройте файл через ФайловаяСистемаКлиент.ОткрытьФайл() или прочитайте его в коде
- 5Удалите временный файл после использования, если он больше не нужен
Открытие временного файла, созданного на сервере
Частая проблема клиент-серверной архитектуры: файл записан в серверной процедуре, а открыть его пытаются на клиенте. Клиент не видит файловую систему сервера, поэтому ЗапуститьПриложение() на клиенте завершится ошибкой «файл не найден».
Правильный подход — передать данные с сервера на клиент через временное хранилище. На сервере данные помещаются в хранилище функцией ПоместитьВоВременноеХранилище(), на клиенте извлекаются через ПолучитьИзВременногоХранилища() и записываются в локальный временный файл, который уже можно открыть.
&НаСервере
Функция СформироватьНаСервере()
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункцииАльтернатива для простых случаев — метод ПолучитьФайлССервера() или асинхронный вариант из библиотеки стандартных подсистем, если она внедрена в конфигурацию. Смысл тот же: сначала перенести файл на клиент, потом открывать.
Как найти и открыть временный файл вручную
Иногда файл уже создан — например, пользователь нажал «Сохранить» во внешнюю обработку, выгрузил отчёт или столкнулся с ошибкой, и теперь нужно найти этот файл на диске. Путь к каталогу временных файлов зависит от операционной системы и текущего пользователя.
В Windows каталог временных файлов обычно находится по пути вида C:\Users\ИмяПользователя\AppData\Local\Temp. Быстрый способ попасть туда — нажать Win+R и ввести %TEMP%. В Linux-серверных установках это чаще всего /tmp или каталог, заданный переменной окружения TMPDIR для пользователя, под которым работает агент сервера 1С.
Точный путь внутри сеанса 1С всегда можно узнать программно: функция КаталогВременныхФайлов() вернёт актуальный каталог для того контекста (клиент или сервер), в котором выполнена. Это надёжнее, чем зашивать путь константой, — на разных машинах и под разными пользователями пути различаются.
Проверьте, что вызван метод Записать() до открытия файла
Передавайте файл через временное хранилище
Укажите приложение явно или установите программу для этого формата
Копируйте нужные файлы в постоянный каталог сразу
Открытие временных файлов разных форматов
Способ открытия зависит от того, что лежит внутри файла. Расширение, переданное в ПолучитьИмяВременногоФайла(), определяет, какой программой операционная система попытается его открыть, поэтому важно указывать расширение, соответствующее реальному содержимому.
| Тип данных | Как записать | Как открыть |
|---|---|---|
| Табличный документ | ТабличныйДокумент.Записать() | ОткрытьФайл() — откроется в Excel/LibreOffice при расширении xlsx |
| Текст, CSV | ТекстовыйДокумент.Записать() | ОткрытьФайл() или ТекстовыйДокумент.Прочитать() |
| XML | ЗаписьXML | ЧтениеXML в коде или браузер/редактор |
| Двоичные данные, архив | ЗаписьДанных / ПолучитьИзВременногоХранилища | ОткрытьФайл() с расширением zip, pdf и т.п. |
Для PDF есть нюанс: если цель — просто показать документ пользователю, часто удобнее не создавать файл вовсе, а использовать метод табличного документа Показать() или вывести печатную форму штатными средствами. Временный файл оправдан, когда результат нужно передать дальше — в письмо, в обмен, во внешнюю систему.
Сравнение вариантов открытия
Современный способ для тонкого и веб-клиента, асинхронный. Требует актуальной версии платформы.
Работает в толстом клиенте и старом коде. Синхронный, в модальных сценариях может блокировать интерфейс.
Подходит, когда файл нужен для обработки, а не для показа пользователю. Не зависит от установленных программ.
Лучший вариант для печатных форм и отчётов: не создаёт мусорных файлов и не требует внешних приложений.
Очистка и управление временными файлами
Платформа не гарантирует автоматическое удаление временных файлов, созданных прикладным кодом. Если обработка массово формирует файлы и не удаляет их, каталог временных файлов разрастается, что на сервере может привести к переполнению диска и остановке работы.
Правило простое: кто создал файл, тот его и удаляет. После открытия файла внешним приложением удалять его сразу нельзя — приложение может держать файл открытым. В таких случаях файл оставляют до завершения сеанса, а системную очистку каталога настраивают административно: планировщиком задач Windows или cron в Linux с удалением файлов старше заданного срока.
Проверка результата и ограничения
После выполнения кода убедитесь, что файл действительно создан и открывается. Минимальная проверка — существование файла и его размер через объект Файл: конструктор Новый Файл(ИмяФайла), затем свойства Существует() и Размер(). Нулевой размер почти всегда означает, что запись не выполнялась или завершилась ошибкой.
Учитывайте ограничения веб-клиента: прямой доступ к файловой системе там ограничен, и для работы с файлами требуется расширение работы с файлами, которое браузер предложит установить. В мобильном клиенте возможности ещё уже — часть сценариев с внешними приложениями там недоступна в принципе.
Как проверить результат
Файл.Существует() возвращает Истина, размер больше нуля
Файл отсутствует или размер 0 байт — запись не выполнена
Приложение запускается и показывает корректные данные
Ошибка формата или пустое окно — расширение не соответствует содержимому
Количество файлов стабильно, старые файлы удаляются
Каталог растёт, диск заполняется — нет очистки
Если файл открывается, но данные в нём искажены — например, «кракозябры» вместо кириллицы в текстовом файле, — проблема в кодировке. Указывайте кодировку явно при записи: ТекстовыйДокумент.Записать(ИмяФайла, КодировкаТекста.UTF8). Для обмена с внешними системами UTF-8 — наиболее совместимый вариант.
Что важно запомнить
ПолучитьИмяВременногоФайла() даёт только имя — файл нужно записать явно. Открывайте файл на той стороне, где он создан: клиент не видит серверные файлы, используйте временное хранилище. Удаляйте временные файлы после использования и следите за очисткой каталога на сервере.
Частые вопросы
Чем ПолучитьИмяВременногоФайла() отличается от КаталогВременныхФайлов()?
Первая функция возвращает полное уникальное имя для нового файла, включая путь и расширение. Вторая возвращает только путь к каталогу, в котором размещаются временные файлы. Для создания файла используйте первую, для поиска уже созданных файлов или настройки очистки — вторую.
Почему ЗапуститьПриложение() не работает в тонком клиенте?
В тонком клиенте синхронные вызовы ограничены, и в новых версиях платформы вместо ЗапуститьПриложение() рекомендуется ФайловаяСистемаКлиент.ОткрытьФайл(). Если код унаследован от обычного приложения, его нужно адаптировать под асинхронную модель.
Можно ли указать свой каталог вместо системного временного?
Да. Вместо ПолучитьИмяВременногоФайла() сформируйте путь самостоятельно: задайте каталог и сгенерируйте имя, например через Новый УникальныйИдентификатор. Это удобно, когда файлы нужно складывать в контролируемое место с собственными правилами хранения и очистки.
Как открыть временный файл в веб-клиенте?
В веб-клиенте потребуется расширение работы с файлами — браузер предложит его установить при первом обращении. После этого работают те же механизмы: ФайловаяСистемаКлиент.ОткрытьФайл() и передача данных через временное хранилище. Часть сценариев может быть недоступна из-за ограничений браузера.
Кто удаляет временные файлы, созданные платформой автоматически?
Файлы, которые платформа создаёт для внутренних нужд, обычно удаляются при завершении сеанса или процесса. Файлы, созданные прикладным кодом через ПолучитьИмяВременногоФайла(), никто автоматически не удаляет — это ответственность разработчика. Дополнительно ОС может очищать каталог по своим правилам.
Что делать, если внешняя программа сообщает, что файл повреждён?
Чаще всего причина в несоответствии расширения содержимому или в незавершённой записи. Проверьте, что метод записи выполнен без исключений, расширение соответствует реальному формату, а файл не удалён и не изменён между записью и открытием. Для диагностики откройте файл текстовым редактором и посмотрите начало содержимого.