В процессе разработки в среде 1С:Предприятие 8 часто возникает задача управления внешними файлами. Типичный сценарий: пользователь прикрепляет файл (например, PDF или скан документа) к объекту базы данных, файл сохраняется в хранилище на сервере, а затем другой пользователь должен иметь возможность открыть этот файл, отредактировать его во внешнем приложении и сохранить изменения. При этом важно обеспечить чистоту на локальном компьютере пользователя, не оставляя «мусорных» файлов в системных папках.
В этой статье мы подробно разберем, как реализовать механизм копирования файла в локальную директорию, обсудим современные стандарты работы через БСП (Библиотеку стандартных подсистем) и выясним, как автоматизировать очистку временных данных.
Разберем самый простой и быстрый способ, к которому пришел автор темы. Для того чтобы не гадать, где в конкретной операционной системе (Windows, Linux, macOS) находится папка временных файлов, в платформе предусмотрена функция КаталогВременныхФайлов(). Она возвращает путь к системной директории текущего пользователя.
Проанализируем пример кода, который позволяет получить уникальное имя файла во временном каталоге, чтобы избежать конфликтов при одновременном открытии нескольких документов с одинаковыми названиями:
// Получаем путь к временному каталогу пользователя
ПутьККаталогу = КаталогВременныхФайлов();
// Генерируем уникальное имя файла с нужным расширением
ИмяФайла = ПолучитьИмяВременногоФайла(".pdf");
// Теперь у нас есть полный путь, например: C:\Users\Admin\AppData\Local\Temp\v8_1234_5.pdf
Этот метод хорош тем, что ПолучитьИмяВременногоФайла() сразу резервирует имя в системе, и вы можете быть уверены, что не перезапишете чужой файл.
Рассмотрим ситуацию, когда файл хранится в базе данных (в виде объекта ДвоичныеДанные) или в томе на сервере. Чтобы пользователь мог его открыть, нам нужно передать эти данные на клиентскую машину. Для этого используются методы получения файлов.
В современных конфигурациях на управляемых формах (начиная с версии платформы 8.3.15) крайне рекомендуется использовать асинхронные вызовы. Это позволяет интерфейсу не «замирать» во время передачи данных.
Посмотрим на пример асинхронного получения файла:
&НаКлиенте
Асинхр Процедура ПолучитьФайлДляПросмотра(АдресВХранилище, ИмяФайла)
ПараметрыПолучения = Новый ПараметрыПолученияФайлаССервера;
// Указываем, куда сохранить файл локально
ПолныйПуть = КаталогВременныхФайлов() + ИмяФайла;
Ждать НачатьПолучениеФайлаССервера(АдресВХранилище, ПолныйПуть, ПараметрыПолучения);
// После получения файла его можно открыть
ЗапуститьПриложение(ПолныйПуть);
КонецПроцедуры
Если вы работаете в современной типовой конфигурации (например, 1С:ERP, 1С:УТ 11 или 1С:Бухгалтерия 3.0), вам не нужно изобретать велосипед. В составе БСП есть подсистема «Работа с файлами», которая берет на себя все сложности.
Разберем преимущества использования метода РаботаСФайламиКлиент.ОткрытьФайл():
Для программиста вызов выглядит максимально просто:
// Пример вызова открытия файла через БСП
ПараметрыОткрытия = РаботаСФайламиКлиент.ПараметрыОткрытияФайла();
ПараметрыОткрытия.РежимОткрытия = РежимОткрытияФайлаПлатформой.Редактирование;
РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ПараметрыОткрытия);
Выясним причину, по которой файлы могут накапливаться в системе. Когда мы вызываем ЗапуститьПриложение(), 1С передает управление внешней программе (например, Adobe Reader) и «забывает» о файле. Если мы удалим файл командой УдалитьФайлы() сразу после запуска, внешнее приложение может выдать ошибку, так как оно еще не успело прочитать данные с диска.
Рассмотрим несколько стратегий удаления:
ПодключитьОбработчикОжидания, который через 30–60 секунд проверит, не закрыто ли внешнее приложение (если это возможно) и удалит файл.ПолучитьИмяВременногоФайла(), при штатном завершении сеанса.Проанализируем ситуацию, если ваш пользователь работает через браузер. В этом случае прямой доступ к диску C:\ или папке %temp% ограничен политиками безопасности браузера. Платформа 1С не сможет «тихо» положить файл в папку и запустить его без участия пользователя.
Для полноценной работы в веб-клиенте необходимо:
Подводя итог, можно сказать, что для решения задачи копирования и очистки файлов наиболее эффективным является путь использования Библиотеки стандартных подсистем. Если же вы пишете решение «с нуля», всегда используйте КаталогВременныхФайлов() и ПолучитьИмяВременногоФайла() для обеспечения уникальности и кроссплатформенности. Помните о переходе на асинхронные методы работы с файлами, чтобы обеспечить комфортную работу пользователей в современных интерфейсах.