В учетных системах 1С часто требуется предоставить пользователю быстрый доступ к файлам на диске: сканам договоров, первичным документам или архивам. Удобным решением является кликабельная строка или ячейка в печатной форме либо отчете, при нажатии на которую открывается целевой каталог в проводнике операционной системы. Разберем по шагам, как реализовать эту функциональность с помощью механизма расшифровки табличного документа и системных команд 1С.
Для взаимодействия с операционной системой платформа 1С предоставляет метод ЗапуститьПриложение. Рассмотрим два варианта передачи команды:
explorer.exe <путь>. Если требуется не просто открыть каталог, а выделить в нем конкретный файл, используется специальный системный ключ: explorer.exe /select, "ПолныйПутьКФайлу".ЗапуститьПриложение передать путь к каталогу без явного вызова исполняемого файла проводника, операционная система автоматически откроет его в файловом менеджере по умолчанию. Этот способ работает как в Windows, так и в Linux.Проанализируем базовый пример кода для запуска проводника на клиенте:
&НаКлиенте
Процедура ОткрытьКаталогВПроводнике(ПутьККаталогу)
// Если путь содержит пробелы, обрамляем его в кавычки
СтрокаЗапуска = """" + ПутьККаталогу + """";
ЗапуститьПриложение(СтрокаЗапуска);
КонецПроцедуры
Чтобы строка табличного документа реагировала на нажатие, задействуем механизм расшифровки. При выводе области табличного документа необходимо заполнить свойство ячейки Расшифровка или использовать ПараметрРасшифровки в макете.
В расшифровку можно поместить как готовый строковый путь к каталогу, так и ссылку на элемент справочника (например, договор), из которого путь будет получен динамически. Чтобы визуально выделить кликабельную ячейку и изменить курсор мыши на указатель при наведении, свойству Гиперссылка соответствующей области присваивается значение Истина.
Посмотрим на пример формирования строки табличного документа в коде:
&НаСервере
Процедура ВывестиСтрокуТабличногоДокумента(ТабДок, Макет, ДоговорСсылка)
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Договор = ДоговорСсылка;
// Передаем ссылку в ячейку с расшифровкой
ОбластьЯчейки = ОбластьСтрока.Область("R1C2");
ОбластьЯчейки.Расшифровка = ДоговорСсылка;
ОбластьЯчейки.Гиперссылка = Истина;
ТабДок.Вывести(ОбластьСтрока);
КонецПроцедуры
Перехват нажатия на ячейку осуществляется в событии табличного документа на форме — ОбработкаРасшифровки. Разберем по шагам алгоритм работы этой процедуры:
СтандартнаяОбработка = Ложь.Расшифровка. Если в ячейку была помещена ссылка на справочник, получаем путь к каталогу отдельным серверным вызовом.Реализуем обработчик на форме и серверную функцию чтения реквизита:
&НаКлиенте
Процедура ПолеТабличногоДокументаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Расшифровка) Тогда
Возврат;
КонецЕсли;
// Отменяем стандартное действие платформы
СтандартнаяОбработка = Ложь;
// Получаем путь к папке из реквизита договора на сервере
ПутьКПапке = ПолучитьПутьКФайламНаСервере(Расшифровка);
Если ПустаяСтрока(ПутьКПапке) Тогда
ПоказатьПредупреждение(, "Для данного объекта путь к файлам не указан.");
Возврат;
КонецЕсли;
// Проверяем наличие каталога в файловой системе
КаталогНаДиске = Новый Файл(ПутьКПапке);
Если Не КаталогНаДиске.Существует() Тогда
ПоказатьПредупреждение(, "Указанный каталог не найден на диске: " + ПутьКПапке);
Возврат;
КонецЕсли;
// Открываем проводник с указанным каталогом
ЗапуститьПриложение("""" + ПутьКПапке + """");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПутьКФайламНаСервере(СсылкаНаДоговор)
// Безопасное чтение реквизита объекта без создания лишнего контекста
Возврат СсылкаНаДоговор.ПутьКФайлам;
КонецФункции
При реализации открытия внешних папок и файлов обратите внимание на следующие нюансы:
ЗапуститьПриложение должен вызываться исключительно на клиенте (директива &НаКлиенте), так как серверная служба 1С выполняется в изолированном контексте и не взаимодействует с графическим интерфейсом пользователя.ЗапуститьПриложениеАсинх, чтобы не блокировать интерфейс клиента.