При разработке современных интерфейсов на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с задачей максимально упростить взаимодействие пользователя с системой. Типичный сценарий: пользователю необходимо просмотреть файл (документ PDF, изображение или таблицу Excel), который хранится в базе или сформирован на сервере. По умолчанию методы работы с файлами часто инициируют диалоговое окно сохранения, что замедляет работу. Разберем, как реализовать открытие файла «в один клик».
Для начала проанализируем, почему система вообще предлагает пользователю выбрать путь. Это происходит в тех случаях, когда при вызове методов получения файла не указан целевой локальный путь на компьютере клиента. Если платформа «не знает», куда именно нужно положить файл перед открытием, она делегирует этот выбор пользователю. Наша задача — программно определить этот путь и передать его методу получения данных.
Важно понимать одно техническое ограничение: сторонние приложения (например, Adobe Reader или MS Excel) не могут работать с данными напрямую из оперативной памяти 1С или из Временного хранилища. Для их работы файл обязательно должен физически существовать на диске. Поэтому решение всегда будет состоять из двух этапов: сохранение во временный каталог и последующий запуск.
Рассмотрим, как правильно подготовить место для файла. Мы не должны заставлять пользователя думать о том, куда сохранится документ. Для этого идеально подходит временный каталог операционной системы. Используем функцию ПолучитьИмяВременногоФайла(). Нам обязательно нужно передать в неё расширение файла, чтобы операционная система знала, каким приложением его открывать.
Посмотрим на пример формирования пути:
// На клиенте определяем расширение и формируем путь
Расширение = ".pdf"; // Это значение можно получить из метаданных файла
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
Ранее в 1С использовался метод НачатьПолучениеФайлаССервера. В современных версиях платформы (начиная с 8.3.15) рекомендуется использовать асинхронные вызовы, которые возвращают объект Обещание. Основной секрет здесь заключается в правильном заполнении объекта ОписаниеПередаваемогоФайла или передаче конкретного пути в параметры метода.
Проанализируем ситуацию: если мы просто вызовем получение файла, указав только адрес хранилища, система откроет диалог. Чтобы этого не случилось, мы передаем подготовленный ПутьКФайлу.
Разберем реализацию с использованием метода ПолучитьФайлССервераАсинх:
&НаКлиенте
Асинх Процедура ОткрытьФайлБезДиалога(АдресХранилища, ИмяФайла)
// 1. Формируем путь во временной папке
Расширение = Сред(ИмяФайла, СтрНайти(ИмяФайла, ".", НаправлениеПоиска.СКонца));
ЛокальныйПуть = ПолучитьИмяВременногоФайла(Расширение);
// 2. Получаем файл с сервера напрямую по указанному пути
// Благодаря указанию локального пути, диалог выбора не появится
Попытка
Ждать ПолучитьФайлССервераАсинх(АдресХранилища, ЛокальныйПуть);
// 3. Запускаем приложение
Ждать ЗапуститьПриложениеАсинх(ЛокальныйПуть);
Исключение
Сообщить("Ошибка при получении или открытии файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если вы используете более ранние версии платформы или метод НачатьПолучениеФайлаССервера, вам потребуется объект ОписаниеПередаваемогоФайла. В нем свойство Хранение должно содержать полный путь к файлу на клиентском диске.
Выясним причину, по которой это работает: когда платформа видит, что целевой путь заполнен, она считает операцию «программной» и не требует интерактивного подтверждения от пользователя. Это и есть искомый способ избежать лишних движений.
Важно помнить о безопасности браузеров. Если ваша база работает через Веб-клиент, то автоматическое сохранение файла по произвольному пути может быть заблокировано политиками браузера. Для полноценной работы в веб-клиенте без диалогов необходимо выполнение двух условий:
В тонком клиенте (Windows/Linux) таких ограничений нет, и код будет работать «из коробки».
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), мы рекомендуем не изобретать велосипед, а использовать возможности подсистемы ПрисоединенныеФайлы. Разберем, как это реализовано там. В БСП существуют готовые процедуры в модуле ПрисоединенныеФайлыКлиент, такие как ОткрытьФайл. Они уже содержат в себе все необходимые проверки на тип клиента, наличие расширения для работы с файлами и механизмы очистки временных каталогов.
Работа через стандартные механизмы гарантирует, что временные файлы будут корректно удалены после закрытия сеанса или самой программы, что предотвращает «замусоривание» диска пользователя.
Подведем черту под вышесказанным. Чтобы открыть файл из временного хранилища без диалога, выполните следующие действия:
ПолучитьИмяВременногоФайла(".расширение") для генерации пути.ПолучитьФайлССервераАсинх (или в НачатьПолучениеФайлаССервера).ЗапуститьПриложениеАсинх, передавая туда тот же путь.Такой подход делает работу пользователя комфортной и профессиональной, избавляя его от необходимости подтверждать каждое действие в системе.