Почему ссылка в макете 1С не работает через веб-клиент и как это исправить?

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

При разработке отчетов и редактировании печатных форм в системе 1С:Предприятие мы часто используем гиперссылки в макетах для быстрого перехода к другим объектам системы или дополнительным макетам. Однако многие разработчики сталкиваются с тем, что в тонком клиенте такие ссылки работают безупречно, а при запуске через веб-клиент (в браузере) нажатие на ссылку приводит к ошибке 404 Not Found или ошибке системы виртуальных ресурсов.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем механизмы работы ссылок в разных клиентах и изучим несколько способов решения: от корректного формирования URL до программного перехвата событий.

Выясним причину: почему браузер «не понимает» ссылки 1С

Проанализируем ситуацию. Когда мы работаем в тонком клиенте, 1С использует собственные внутренние протоколы, такие как v8config:// или e1cib/. Тонкий клиент — это полноценное приложение, которое знает, как интерпретировать эти запросы и обращаться к базе данных или ресурсам конфигурации напрямую.

Веб-клиент работает внутри браузера (Chrome, Firefox, Safari). Браузер строго ограничен правилами безопасности и стандартами HTTP. Он не знает, что такое v8config://. В некоторых случаях для корректной работы браузера требуется специальное расширение для передачи GUID клиента. Чтобы такая ссылка сработала, платформа 1С должна «на лету» преобразовать внутренний адрес в понятный веб-серверу URL. Если ссылка в макете прописана как относительная или использует внутренний идентификатор GUID, веб-сервер (IIS или Apache) при попытке перехода выдает HTTP: Not found, так как он ищет физический файл или зарегистрированный ресурс по указанному пути, которого не существует в контексте веб-публикации.

Способ 1. Использование правильного формата навигационных ссылок

Рассмотрим первый метод решения — приведение ссылок к абсолютному виду, который поддерживается платформой. Стандартный формат навигационной ссылки на объект информационной базы выглядит следующим образом:

e1c://server/ИмяСервера/ИмяБазы#e1cib/data/Справочник.ИмяСправочника?ref=Идентификатор

Однако для веб-клиента этого может быть недостаточно. Разберем по шагам, как получить ссылку программно, чтобы она была универсальной. Здесь важно учитывать, что такое форматированный документ, так как принципы работы с текстом и ссылками в нем схожи с механизмами макетов. Вместо того чтобы прописывать путь вручную, мы рекомендуем использовать встроенную функцию ПолучитьНавигационнуюСсылку().

Если нам нужно сослаться на общий макет, мы можем столкнуться с трудностями, так как прямая ссылка на макет в веб-клиенте часто требует указания префикса информационной базы. Посмотрим на пример кода, который помогает преобразовать внутренние ссылки типа v8config:// в рабочие HTTP-адреса.


&НаСервере
Функция ЗаменитьОтносительныеСсылкиНаАбсолютныеДляИБ(ТекстHTML)
    // Получаем базовый URL публикации нашей базы
    СтандартныйПрефикс = ПолучитьНавигационнуюСсылкуИнформационнойБазы() + "/";
    
    // Проверяем, запущено ли приложение в веб-клиенте
    ЭтоВебКлиент = СтрНайти(СтандартныйПрефикс, "http://") > 0 ИЛИ СтрНайти(СтандартныйПрефикс, "https://") > 0;
    
    Если ЭтоВебКлиент Тогда
        КодЛокализации = ТекущийКодЛокализации();
        // Добавляем код локализации, так как веб-сервер 1С часто ожидает его в пути
        СтандартныйПрефикс = СтандартныйПрефикс + КодЛокализации + "/";
    КонецЕсли;
    
    // Выполняем подмену внутреннего протокола на путь через сервис помощи веб-сервера
    ТекстHTML = СтрЗаменить(ТекстHTML, "v8config://", СтандартныйПрефикс + "e1cib/helpservice/topics/v8config/");
    
    Возврат ТекстHTML;
КонецФункции

Этот метод позволяет «обмануть» браузер, направляя запрос через стандартный сервис платформы helpservice, который умеет отдавать содержимое конфигурации по HTTP.

Способ 2. Программная обработка через расшифровку (Рекомендуемый)

Проанализируем альтернативный, более надежный подход. Вместо того чтобы полагаться на механизмы гиперссылок в ячейках Табличного документа, мы можем использовать механизм Расшифровки (параметр Details). Это решение является наиболее стабильным для веб-клиента, так как оно не зависит от настроек веб-сервера. Для реализации нестандартных интерфейсов в вебе также может пригодиться универсальный ввод на WEB клиенте с использованием возможностей HTML-документа.

Выполним следующие шаги для реализации этого метода:

  1. В макете (в конфигураторе) выделим ячейку, которая должна служить ссылкой.
  2. В свойстве Гиперссылка установим значение Ложь (чтобы не путать браузер), но в свойстве Расшифровка укажем уникальный идентификатор или структуру (например, "ОткрытьМакет_Архив2023").
  3. В форме, где отображается этот макет (через поле табличного документа), создадим обработчик события Выбор.

Разберем пример кода обработки нажатия:


&НаКлиенте
Процедура ПолеТабличногоДокументаВыбор(Элемент, Область, СтандартнаяОбработка)
    
    // Проверяем, что в расшифровке лежит наш идентификатор
    Если Область.Расшифровка = "ОткрытьМакет_Архив2023" Тогда
        // Отменяем штатный переход 1С
        СтандартнаяОбработка = Ложь; 
        
        // Вызываем процедуру открытия нужного нам макета или формы
        ОткрытьНужныйМакетПрограммно();
    КонецЕсли;
    
КонецПроцедуры

Важный момент: использование расшифровки гарантирует, что код будет выполнен на стороне клиента 1С (в контексте веб-клиента), и нам не придется беспокоиться о правильности формирования URL-адреса. Мы просто говорим системе, что нужно сделать при клике на ячейку.

Способ 3. Настройка веб-сервера и файла default.vrd

Иногда проблема кроется не в коде 1С, а в настройках публикации. Чтобы упростить этот процесс, можно использовать публикатор 1С, который позволяет управлять публикациями баз с комфортом. Если ссылка ведет на расширение или специфический внутренний ресурс, веб-сервер может блокировать такие запросы. Посмотрим на параметры файла default.vrd, который находится в папке публикации вашей информационной базы.

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

Нужно проверить наличие параметра publishExtensions в секции <point>. Если вы используете сложные ссылки на справочную систему или внутренние ресурсы макетов, веб-сервер должен иметь права на их трансляцию. Также в IIS (Internet Information Services) следует проверить модуль Request Filtering. Если URL содержит двойное эскепирование (спецсимволы в GUID), IIS может вернуть 404. В этом случае в настройках фильтрации запросов нужно установить Allow double escaping = True. Понимание работы веб-среды также можно расширить, изучив техдемо веб-приложения на базе http-сервисов.

Резюме и рекомендации

Мы рассмотрели несколько подходов к решению проблемы неработающих ссылок в веб-клиенте. Подведем итоги нашей совместной работы:

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

← На главную