Как в 1С скопировать файл в директорию пользователя, открыть его для редактирования и затем удалить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в среде 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. Рабочий каталог: БСП создает специальный подкаталог для пользователя, где хранятся рабочие копии файлов.
  2. Контроль редактирования: Система помечает файл как «занят», если кто-то другой уже открыл его на редактирование. Это решает проблему «хитроумных юзеров», о которой упоминал автор темы.
  3. Автоматическая очистка: БСП умеет очищать локальный кэш файлов по расписанию или при закрытии программы.
  4. Версионирование: Если пользователь внес изменения, система предложит сохранить новую версию файла в базу данных.

Для программиста вызов выглядит максимально просто:


// Пример вызова открытия файла через БСП
ПараметрыОткрытия = РаботаСФайламиКлиент.ПараметрыОткрытияФайла();
ПараметрыОткрытия.РежимОткрытия = РежимОткрытияФайлаПлатформой.Редактирование;
РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ПараметрыОткрытия);

Очистка временных файлов после просмотра

Выясним причину, по которой файлы могут накапливаться в системе. Когда мы вызываем ЗапуститьПриложение(), 1С передает управление внешней программе (например, Adobe Reader) и «забывает» о файле. Если мы удалим файл командой УдалитьФайлы() сразу после запуска, внешнее приложение может выдать ошибку, так как оно еще не успело прочитать данные с диска.

Рассмотрим несколько стратегий удаления:

  1. При закрытии формы: Мы можем хранить список путей к созданным временным файлам в массиве и при закрытии окна обработки или документа вызывать команду удаления.
  2. Обработчик ожидания: Можно запустить ПодключитьОбработчикОжидания, который через 30–60 секунд проверит, не закрыто ли внешнее приложение (если это возможно) и удалит файл.
  3. Использование временных хранилищ платформы: Платформа 1С старается сама удалять файлы, созданные через ПолучитьИмяВременногоФайла(), при штатном завершении сеанса.

Ограничения при работе в веб-клиенте

Проанализируем ситуацию, если ваш пользователь работает через браузер. В этом случае прямой доступ к диску C:\ или папке %temp% ограничен политиками безопасности браузера. Платформа 1С не сможет «тихо» положить файл в папку и запустить его без участия пользователя.

Для полноценной работы в веб-клиенте необходимо:

Резюме

Подводя итог, можно сказать, что для решения задачи копирования и очистки файлов наиболее эффективным является путь использования Библиотеки стандартных подсистем. Если же вы пишете решение «с нуля», всегда используйте КаталогВременныхФайлов() и ПолучитьИмяВременногоФайла() для обеспечения уникальности и кроссплатформенности. Помните о переходе на асинхронные методы работы с файлами, чтобы обеспечить комфортную работу пользователей в современных интерфейсах.

← На главную