Как в 1С при нажатии на строку табличного документа открыть папку в проводнике Windows?

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

В учетных системах 1С часто требуется предоставить пользователю быстрый доступ к файлам на диске: сканам договоров, первичным документам или архивам. Удобным решением является кликабельная строка или ячейка в печатной форме либо отчете, при нажатии на которую открывается целевой каталог в проводнике операционной системы. Разберем по шагам, как реализовать эту функциональность с помощью механизма расшифровки табличного документа и системных команд 1С.

Вызов проводника и открытие каталога средствами 1С

Для взаимодействия с операционной системой платформа 1С предоставляет метод ЗапуститьПриложение. Рассмотрим два варианта передачи команды:

  1. Прямой запуск проводника Windows: для гарантированного открытия директории именно в проводнике Windows можно передать команду вида explorer.exe <путь>. Если требуется не просто открыть каталог, а выделить в нем конкретный файл, используется специальный системный ключ: explorer.exe /select, "ПолныйПутьКФайлу".
  2. Кроссплатформенный запуск: если в качестве параметра методу ЗапуститьПриложение передать путь к каталогу без явного вызова исполняемого файла проводника, операционная система автоматически откроет его в файловом менеджере по умолчанию. Этот способ работает как в Windows, так и в Linux.

Проанализируем базовый пример кода для запуска проводника на клиенте:


&НаКлиенте
Процедура ОткрытьКаталогВПроводнике(ПутьККаталогу)
    // Если путь содержит пробелы, обрамляем его в кавычки
    СтрокаЗапуска = """" + ПутьККаталогу + """";
    ЗапуститьПриложение(СтрокаЗапуска);
КонецПроцедуры

Связывание ячейки табличного документа с данными

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

В расшифровку можно поместить как готовый строковый путь к каталогу, так и ссылку на элемент справочника (например, договор), из которого путь будет получен динамически. Чтобы визуально выделить кликабельную ячейку и изменить курсор мыши на указатель при наведении, свойству Гиперссылка соответствующей области присваивается значение Истина.

Посмотрим на пример формирования строки табличного документа в коде:


&НаСервере
Процедура ВывестиСтрокуТабличногоДокумента(ТабДок, Макет, ДоговорСсылка)
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Договор = ДоговорСсылка;
    
    // Передаем ссылку в ячейку с расшифровкой
    ОбластьЯчейки = ОбластьСтрока.Область("R1C2");
    ОбластьЯчейки.Расшифровка = ДоговорСсылка;
    ОбластьЯчейки.Гиперссылка = Истина;
    
    ТабДок.Вывести(ОбластьСтрока);
КонецПроцедуры

Перехват клика по строке в обработчике расшифровки

Перехват нажатия на ячейку осуществляется в событии табличного документа на форме — ОбработкаРасшифровки. Разберем по шагам алгоритм работы этой процедуры:

  1. Отключаем стандартное поведение платформы (открытие карточки объекта или стандартного меню расшифровки), установив параметр СтандартнаяОбработка = Ложь.
  2. Анализируем значение параметра Расшифровка. Если в ячейку была помещена ссылка на справочник, получаем путь к каталогу отдельным серверным вызовом.
  3. Проверяем существование пути на диске перед запуском проводника, чтобы избежать системных ошибок.
  4. Вызываем открытие каталога на клиенте.

Реализуем обработчик на форме и серверную функцию чтения реквизита:


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

&НаСервереБезКонтекста
Функция ПолучитьПутьКФайламНаСервере(СсылкаНаДоговор)
    // Безопасное чтение реквизита объекта без создания лишнего контекста
    Возврат СсылкаНаДоговор.ПутьКФайлам;
КонецФункции

Важные особенности и рекомендации

При реализации открытия внешних папок и файлов обратите внимание на следующие нюансы:

  1. Контекст выполнения: метод ЗапуститьПриложение должен вызываться исключительно на клиенте (директива &НаКлиенте), так как серверная служба 1С выполняется в изолированном контексте и не взаимодействует с графическим интерфейсом пользователя.
  2. Асинхронные вызовы: в современных конфигурациях и при работе без модальных окон рекомендуется использовать метод ЗапуститьПриложениеАсинх, чтобы не блокировать интерфейс клиента.
  3. Пути с пробелами: если путь содержит пробелы (например, в названиях папок или путях локальной сети), строку пути обязательно следует обрамлять двойными кавычками, иначе операционная система воспримет часть пути как отдельный параметр командной строки.
  4. Ограничения веб-клиента: запуск внешних приложений и работа с локальной файловой системой из веб-браузера ограничены политиками безопасности. Для корректной работы в веб-клиенте потребуется установка специализированного расширения работы с файлами.
← На главную