Как в 1С организовать выбор и открытие файлов изображений или PDF из табличной части

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

При доработке справочника Номенклатура в типовых конфигурациях на обычных формах (например, в УПП) часто возникает задача хранения дополнительных ссылок на графические файлы или электронные документы PDF. Пользователю требуется не просто хранить текстовый путь, но и быстро открывать этот файл по клику, а также удобно выбирать его через стандартное диалоговое окно операционной системы.

Разберем детально, как решить обе задачи: настроить интерактивный выбор пути к файлу и реализовать его открытие в браузере или специализированном просмотрщике.

Организация выбора файла в табличной части

Рассмотрим по шагам, как настроить колонку табличного поля, чтобы пользователь мог нажать кнопку выбора и указать файл на диске или в сетевой папке.

В свойствах колонки табличного поля включим свойство КнопкаВыбора и назначим для элемента управления событие НачалоВыбора. В модуле формы опишем логику работы с объектом ДиалогВыбораФайла.


Процедура ТабличнаяЧастьИзображенияИ_ИзображениеНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр = "Файлы изображений и PDF (*.jpg;*.jpeg;*.pdf)|*.jpg;*.jpeg;*.pdf|Все файлы (*.*)|*.*";
    Диалог.Заголовок = "Выберите файл для прикрепления";
    Диалог.ПредварительныйПросмотр = Истина;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    
    Если Не Диалог.Выбрать() Тогда
        Возврат;
    КонецЕсли;
    
    // Записываем полученный путь в текущую строку табличной части
    Элемент.Значение = Диалог.ПолноеИмяФайла;
    
КонецПроцедуры

Проанализируем этот код. Свойство СтандартнаяОбработка = Ложь отключает базовое поведение платформы, не позволяя открывать стандартный диалог ввода строки. Конструктор Новый ДиалогВыбораФайла создает объект диалога Windows, где мы задаем маску разрешенных расширений и включаем встроенную проверку существования файла перед закрытием окна.

Настройка открытия файла по нажатию кнопки

Выясним, как обеспечить открытие файла. Самый удобный способ для пользователя в обычном интерфейсе — добавление кнопки открытия (с пиктограммой лупы) прямо в ячейку табличного поля.

Для этого в свойствах колонки активируем флажок КнопкаОткрытия и перейдем к обработчику события Открытие. Главная ошибка, с которой часто сталкиваются разработчики, — попытка передать имя переменной внутрь строкового литерала или отсутствие экранирования пробелов в путях.

Разберем базовый вариант открытия файла в ассоциированной программе операционной системы (просмотрщик Windows, Adobe Acrobat Reader и т.д.):


Процедура ТабличнаяЧастьИзображенияИ_ИзображениеОткрытие(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ПутьКФайлу = СокрЛП(Элемент.Значение);
    Если ПустаяСтрока(ПутьКФайлу) Тогда
        Возврат;
    КонецЕсли;
    
    ПроверяемыйФайл = Новый Файл(ПутьКФайлу);
    Если Не ПроверяемыйФайл.Существует() Тогда
        Предупреждение("Файл не найден по указанному пути: " + Символы.ПС + ПутьКФайлу);
        Возврат;
    КонецЕсли;
    
    // Экранируем путь двойными кавычками на случай наличия пробелов в каталогах
    КомандаЗапуска = """" + ПроверяемыйФайл.ПолноеИмя + """";
    ЗапуститьПриложение(КомандаЗапуска);
    
КонецПроцедуры

Посмотрим на особенности этого метода. Вызов процедуры ЗапуститьПриложение() с путем к файлу запускает то приложение, которое назначено в Windows по умолчанию для данного типа файлов (JPG, PNG или PDF). Это избавляет от необходимости жестко прописывать путь к конкретному исполняемому файлу программы.

Принудительное открытие файла в веб-браузере

Если стоит жесткое требование открыть картинку или PDF-документ именно в веб-браузере, проанализируем доступные варианты реализации.

  1. Запуск конкретного исполняемого файла браузера. В этом случае к пути исполняемого файла добавляется параметр — путь к документу. Важно помнить о разделении строки пробелом и экранировании путей:
    
    ПутьКБраузеру = "C:\Program Files (x86)\Internet Explorer\iexplore.exe";
    ПараметрЗапуска = """" + СокрЛП(Элемент.Значение) + """";
    ЗапуститьПриложение("""" + ПутьКБраузеру + """ " + ПараметрЗапуска);
    
    Этот подход имеет существенный недостаток: расположение браузера на разных компьютерах пользователей (32- и 64-битные системы) может отличаться, а Internet Explorer отключен в современных ОС.
  2. Использование протокола file:/// для браузера по умолчанию. Если передать в процедуру ЗапуститьПриложение() ссылку, начинающуюся с префикса file:///, операционная система автоматически передаст этот адрес браузеру по умолчанию без привязки к конкретному файлу программы:
    
    Путь = СокрЛП(Элемент.Значение);
    ПутьДляБраузера = СтрЗаменить(Путь, "\", "/");
    ЗапуститьПриложение("file:///" + ПутьДляБраузера);
    
    Этот способ обеспечивает максимальную кроссплатформенность и совместимость с современными браузерами (Chrome, Edge, Яндекс.Браузер, Firefox).

Важные архитектурные нюансы при работе с путями

Рассмотрим подробнее тонкости, о которых необходимо помнить при реализации такого функционала в многопользовательской базе:

  1. Локальные и сетевые пути. Если пользователь укажет путь к локальному диску (например, C:\Images\photo.jpg), этот файл откроется только на его личном рабочем месте. Для работы в коллективе файлы должны размещаться в общей сетевой папке в формате UNC (\\ServerName\ShareFolder\photo.jpg), а всем пользователям в домене должны быть выданы права на чтение этой директории.
  2. Клиентский контекст. Методы ДиалогВыбораФайла и ЗапуститьПриложение() работают исключительно на клиенте. Их невозможно вызывать в серверных модулях или регламентных заданиях.
  3. Сетевые задержки. Проверка Новый Файл().Существует() при обращении к медленному или временно недоступному сетевому ресурсу может приводить к кратковременному зависанию интерфейса платформы на время таймаута операционной системы.
  4. Штатный механизм УПП. В типовой конфигурации УПП уже присутствует подсистема «Хранилище дополнительной информации». При промышленной эксплуатации рекомендуется использовать ее, так как она позволяет хранить файлы непосредственно в базе данных или на сервере, исключая риск потери файлов из-за случайного переименования папок на внешних дисках.
← На главную