При доработке справочника Номенклатура в типовых конфигурациях на обычных формах (например, в УПП) часто возникает задача хранения дополнительных ссылок на графические файлы или электронные документы PDF. Пользователю требуется не просто хранить текстовый путь, но и быстро открывать этот файл по клику, а также удобно выбирать его через стандартное диалоговое окно операционной системы.
Разберем детально, как решить обе задачи: настроить интерактивный выбор пути к файлу и реализовать его открытие в браузере или специализированном просмотрщике.
Рассмотрим по шагам, как настроить колонку табличного поля, чтобы пользователь мог нажать кнопку выбора и указать файл на диске или в сетевой папке.
В свойствах колонки табличного поля включим свойство КнопкаВыбора и назначим для элемента управления событие НачалоВыбора. В модуле формы опишем логику работы с объектом ДиалогВыбораФайла.
Процедура ТабличнаяЧастьИзображенияИ_ИзображениеНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы изображений и PDF (*.jpg;*.jpeg;*.pdf)|*.jpg;*.jpeg;*.pdf|Все файлы (*.*)|*.*";
Диалог.Заголовок = "Выберите файл для прикрепления";
Диалог.ПредварительныйПросмотр = Истина;
Диалог.ПроверятьСуществованиеФайла = Истина;
Если Не Диалог.Выбрать() Тогда
Возврат;
КонецЕсли;
// Записываем полученный путь в текущую строку табличной части
Элемент.Значение = Диалог.ПолноеИмяФайла;
КонецПроцедуры
Проанализируем этот код. Свойство СтандартнаяОбработка = Ложь отключает базовое поведение платформы, не позволяя открывать стандартный диалог ввода строки. Конструктор Новый ДиалогВыбораФайла создает объект диалога Windows, где мы задаем маску разрешенных расширений и включаем встроенную проверку существования файла перед закрытием окна.
Выясним, как обеспечить открытие файла. Самый удобный способ для пользователя в обычном интерфейсе — добавление кнопки открытия (с пиктограммой лупы) прямо в ячейку табличного поля.
Для этого в свойствах колонки активируем флажок КнопкаОткрытия и перейдем к обработчику события Открытие. Главная ошибка, с которой часто сталкиваются разработчики, — попытка передать имя переменной внутрь строкового литерала или отсутствие экранирования пробелов в путях.
Разберем базовый вариант открытия файла в ассоциированной программе операционной системы (просмотрщик Windows, Adobe Acrobat Reader и т.д.):
Процедура ТабличнаяЧастьИзображенияИ_ИзображениеОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПутьКФайлу = СокрЛП(Элемент.Значение);
Если ПустаяСтрока(ПутьКФайлу) Тогда
Возврат;
КонецЕсли;
ПроверяемыйФайл = Новый Файл(ПутьКФайлу);
Если Не ПроверяемыйФайл.Существует() Тогда
Предупреждение("Файл не найден по указанному пути: " + Символы.ПС + ПутьКФайлу);
Возврат;
КонецЕсли;
// Экранируем путь двойными кавычками на случай наличия пробелов в каталогах
КомандаЗапуска = """" + ПроверяемыйФайл.ПолноеИмя + """";
ЗапуститьПриложение(КомандаЗапуска);
КонецПроцедуры
Посмотрим на особенности этого метода. Вызов процедуры ЗапуститьПриложение() с путем к файлу запускает то приложение, которое назначено в Windows по умолчанию для данного типа файлов (JPG, PNG или PDF). Это избавляет от необходимости жестко прописывать путь к конкретному исполняемому файлу программы.
Если стоит жесткое требование открыть картинку или PDF-документ именно в веб-браузере, проанализируем доступные варианты реализации.
ПутьКБраузеру = "C:\Program Files (x86)\Internet Explorer\iexplore.exe";
ПараметрЗапуска = """" + СокрЛП(Элемент.Значение) + """";
ЗапуститьПриложение("""" + ПутьКБраузеру + """ " + ПараметрЗапуска);
ЗапуститьПриложение() ссылку, начинающуюся с префикса file:///, операционная система автоматически передаст этот адрес браузеру по умолчанию без привязки к конкретному файлу программы:
Путь = СокрЛП(Элемент.Значение);
ПутьДляБраузера = СтрЗаменить(Путь, "\", "/");
ЗапуститьПриложение("file:///" + ПутьДляБраузера);
Рассмотрим подробнее тонкости, о которых необходимо помнить при реализации такого функционала в многопользовательской базе:
C:\Images\photo.jpg), этот файл откроется только на его личном рабочем месте. Для работы в коллективе файлы должны размещаться в общей сетевой папке в формате UNC (\\ServerName\ShareFolder\photo.jpg), а всем пользователям в домене должны быть выданы права на чтение этой директории.ДиалогВыбораФайла и ЗапуститьПриложение() работают исключительно на клиенте. Их невозможно вызывать в серверных модулях или регламентных заданиях.Новый Файл().Существует() при обращении к медленному или временно недоступному сетевому ресурсу может приводить к кратковременному зависанию интерфейса платформы на время таймаута операционной системы.