В процессе разработки или поддержки типовых конфигураций на платформе 1С:Предприятие 8.3 мы часто сталкиваемся с удобным механизмом оповещения пользователей. Типовой функционал при сохранении печатных форм в файл выдает всплывающее окно с текстом «Сохранение успешно завершено» и предлагает быстро перейти в папку с файлом, нажав на это сообщение. Однако программисты часто обнаруживают неприятную особенность: если файл сохранен на локальный диск, переход работает идеально, но если выбрана сетевая папка (UNC-путь), при нажатии на оповещение ничего не происходит или возникает системная ошибка.
В рамках данной статьи мы проанализируем причины такого поведения системы, разберем программный код типовых конфигураций и найдем универсальное решение, которое позволит вашим пользователям открывать сетевые каталоги так же легко, как и локальные.
Для начала проанализируем, как формируется навигационная ссылка в стандартных механизмах 1С. В типовых конфигурациях, таких как Управление торговлей 11 или Бухгалтерия предприятия 3.0, вызов оповещения реализован через процедуру ПоказатьОповещениеПользователя. Рассмотрим пример кода, который вызывает проблему:
ПоказатьОповещениеПользователя(
НСтр("ru = 'Сохранение успешно завершено'"),
"file:///" + Папка,
НСтр("ru = 'в папку:'") + " " + Папка,
БиблиотекаКартинок.Информация32
);
Проблема кроется во втором параметре — строке навигационной ссылки. Здесь к пути переменной Папка жестко добавляется префикс file:/// (с тремя слешами). Выясним причину, почему это критично для сетевых путей:
C:\Reports, то итоговая ссылка становится file:///C:/Reports. Согласно стандартам URI, три слеша означают обращение к локальному хосту (localhost), и операционная система Windows корректно отрабатывает такой запрос.\\Server\Share\Reports, то при добавлении префикса мы получаем file:///\\Server\Share\Reports. Такая конструкция является некорректной с точки зрения синтаксиса навигационных ссылок. Операционная система не может распознать этот путь, так как он одновременно пытается указать на локальный хост и на удаленный сервер.Как показывают практические опыты и обсуждения специалистов, решение заключается в правильном формировании префикса в зависимости от типа пути. Рассмотрим подробнее несколько вариантов обхода этой ошибки.
Вариант 1: Использование двух слешей для UNC-путей.
Для сетевых путей стандарт требует использования формата file://Server/Share. Таким образом, если путь начинается с двойного обратного слеша, нам нужно убрать один лишний слеш из префикса. Как только мы приводим ссылку к виду file://Server/Share, платформа 1С успешно передает управление операционной системе, и проводник открывает нужный каталог.
Вариант 2: Специфический метод «пяти слешей».
В некоторых случаях, особенно при работе в определенных версиях Windows или использовании браузеров в веб-клиенте, срабатывает необычная конструкция file://///Server/Share. Здесь первые два слеша определяют протокол, а последующие три помогают системе корректно интерпретировать начало сетевого пути. Однако для тонкого клиента 1С этот метод чаще является избыточным, и достаточно стандартных двух слешей.
Чтобы решение было универсальным и не ломало открытие локальных папок, нам необходимо добавить проверку типа пути перед вызовом оповещения. Посмотрим на пример функции, которую можно интегрировать в ваш программный модуль:
&НаКлиенте
Процедура ВыполнитьОповещениеОСохранении(ИмяКаталога)
Префикс = "file:///"; // По умолчанию для локальных путей
// Проверяем, является ли путь сетевым (UNC)
Если Лев(ИмяКаталога, 2) = "\\" Тогда
// Для сетевых путей используем два слеша вместо трех
Префикс = "file://";
// Также рекомендуется заменить обратные слеши на прямые для соответствия стандарту URI
ПутьДляСсылки = СтрЗаменить(ИмяКаталога, "\", "/");
Иначе
ПутьДляСсылки = ИмяКаталога;
КонецЕсли;
НавигационнаяСсылка = Префикс + ПутьДляСсылки;
ПоказатьОповещениеПользователя(
НСтр("ru = 'Файлы сохранены'"),
НавигационнаяСсылка,
ИмяКаталога,
БиблиотекаКартинок.Информация32
);
КонецПроцедуры
В данном коде мы динамически определяем, какой префикс использовать. Если ИмяКаталога начинается с символов \\, система понимает, что это сетевой ресурс, и формирует корректную ссылку.
Если вы работаете в современной конфигурации, построенной на базе БСП (Библиотека стандартных подсистем), рекомендуется использовать штатные методы работы с файловой системой. Разберем, как это реализовано в последних версиях БСП.
Вместо прямой конкатенации строк с префиксом file:///, лучше использовать возможности модуля ФайловаяСистемаКлиент. В частности, метод ФайловаяСистемаКлиент.ОткрытьПроводник берет на себя все сложности по определению типа пути и корректному вызову системных команд. Посмотрим на пример того, как это можно сделать через обработку нажатия в оповещении:
Вместо того чтобы передавать навигационную ссылку вторым параметром в ПоказатьОповещениеПользователя, вы можете передать объект ОписаниеОповещения. Тогда при нажатии на окно оповещения сработает ваша процедура, в которой вы выполните следующий код:
&НаКлиенте
Процедура ПослеНажатияНаОповещение(ДополнительныеПараметры) Экспорт
Папка = ДополнительныеПараметры.ПутьКПапке;
// Используем штатный метод БСП, который надежнее протокола file:///
ФайловаяСистемаКлиент.ОткрытьПроводник(Папка);
КонецПроцедуры
Этот способ является наиболее «чистым» с точки зрения архитектуры 1С, так как он избавляет разработчика от необходимости вручную считать слеши и следить за стандартами формирования URI. Метод ОткрытьПроводник внутри себя использует команду ЗапуститьПриложение, которая на уровне Windows отрабатывает UNC-пути без каких-либо дополнительных префиксов.
При реализации данного функционала важно помнить:
file:/// будет заблокирован политиками безопасности браузера. Это сделано для того, чтобы сайты не могли получить доступ к локальным файлам пользователя. В этом случае навигационная ссылка в оповещении просто не будет работать, независимо от количества слешей.\ в путях, стандарт URI требует прямых слешей /. При программном формировании ссылки file:// хорошим тоном считается замена всех знаков \ на / с помощью функции СтрЗаменить.Таким образом, мы выяснили, что проблема «неработающей ссылки» в сетевую папку — это результат избыточного префикса в типовом коде. Исправив алгоритм формирования строки или перейдя на использование методов БСП, вы обеспечите стабильную работу системы и комфорт для конечных пользователей.