Как программно перейти по внешней навигационной ссылке в другую базу 1С?

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

В процессе интеграции нескольких информационных систем на платформе 1С:Предприятие 8 часто возникает задача бесшовного перехода пользователя из одной базы в другую. Например, при работе в ERP-системе пользователю может потребоваться открыть связанный документ или карточку сотрудника в базе ЗУП. Для решения этой задачи используются внешние навигационные ссылки формата e1c://.

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

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

Разберем типичную проблему: при попытке вызвать переход программно ничего не происходит или система выдает ошибку, хотя ручной ввод ссылки через стандартное меню 1С («Перейти по ссылке») работает корректно. Выясним причину этого поведения.

Дело в том, что в платформе 1С поведение метода ПерейтиПоНавигационнойСсылке() напрямую зависит от установленного режима совместимости конфигурации:

  1. Режим совместимости 8.2 и ниже: Платформенный метод умеет работать исключительно с внутренними ссылками текущей информационной базы (начинающимися с e1cib/...). Внешние ссылки формата e1c:// в этом режиме программно не обрабатываются. Именно эта проблема часто возникает в базах, которые давно не обновлялись или сохраняют обратную совместимость.
  2. Режим совместимости 8.3 и выше (или при его отключении): Платформа получает полноценную нативную поддержку внешних ссылок. При вызове метода система сама распознает протокол e1c://, находит нужную базу и выполняет переход.

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

Как платформа обрабатывает внешнюю ссылку «под капотом»

Прежде чем переходить к коду, проанализируем, как именно операционная система и платформа 1С взаимодействуют при получении ссылки вида e1c://server/serverZUP/ZupOf#e1cib/data/...:

  1. При вызове такой ссылки операционная система ищет зарегистрированный протокол e1c.
  2. Запрос передается программе-стартеру 1С (1cestart.exe).
  3. Стартер анализирует переданную строку соединения с базой (сервер и имя базы).
  4. Выполняется поиск уже открытого сеанса данного пользователя с этой базой. Если активное окно найдено и в нем нет блокирующих модальных окон, платформа просто активирует его и открывает нужный объект внутри этого окна. Новое приложение при этом не запускается, что очень удобно для пользователя.
  5. Если запущенный сеанс не найден, стартер автоматически инициализирует запуск нового тонкого или толстого клиента, подключается к целевой базе и сразу позиционируется на указанном в ссылке объекте.

Важное примечание для платформы версии 8.3.24 и выше: В некоторых новых релизах поведение сопоставления окон изменилось. Если передавать ссылку в «чистом» виде, система может не сопоставить ее с уже открытой базой и запустить дублирующее окно. Чтобы этого избежать, разработчики рекомендуют добавлять в ссылку закодированные пустые разделители данных перед символом решетки, например: e1c://server/serverZUP/ZupOf?Z=%2B%2C%2B#e1cib/data/....

Способ 1. Использование стандартного метода ПерейтиПоНавигационнойСсылке()

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


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

Этот способ идеален своей лаконичностью. Платформа берет на себя все рутинные операции по поиску запущенных процессов 1С и передаче им фокуса управления.

Способ 2. Безопасный вызов через БСП (Библиотеку стандартных подсистем)

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

Рассмотрим, как будет выглядеть вызов:


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

Под капотом БСП сама выполнит все необходимые проверки доступности окружения и корректно обработает переход.

Способ 3. Программный запуск стартера (без регистрации протокола в ОС)

Что делать, если режим совместимости 8.2 изменить нельзя, а у системных администраторов нет возможности (или желания) регистрировать протокол e1c в реестре операционной системы Windows на сотнях пользовательских компьютеров?

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


&НаКлиенте
Процедура ОткрытьБазуЧерезСтартер(Знач ВнешняяСсылка)
    
    // Шаг 1. Определим стандартный путь к стартеру 1С на компьютере пользователя
    ПутьКСтартеру = "C:\Program Files\1cv8\common\1cestart.exe"; 
    
    // Шаг 2. Подготовим параметры запуска
    // Параметр /URL указывает стартеру, что нужно обработать внешнюю навигационную ссылку
    ПараметрыЗапуска = "/URL """ + ВнешняяСсылка + """";
    
    // Шаг 3. Запускаем приложение средствами ОС
    Попытка
        ЗапуститьПриложение(ПутьКСтартеру, , , ПараметрыЗапуска);
    Исключение
        // Если по стандартному пути x64 стартер не найден, попробуем альтернативный x86 путь
        АльтернативныйПуть = "C:\Program Files (x86)\1cv8\common\1cestart.exe";
        Попытка
            ЗапуститьПриложение(АльтернативныйПуть, , , ПараметрыЗапуска);
        Исключение
            ПоказатьПредупреждение(, "Не удалось запустить стартер 1С. Обратитесь к системному администратору.");
        КонецПопытки;
    КонецПопытки;
    
КонецПроцедуры

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

Способ 4. Переход через публикацию на веб-сервере (HTTP-ссылки)

Если база-приемник опубликована на веб-сервере (например, под управлением IIS или Apache), мы можем полностью отказаться от проприетарного протокола e1c:// в пользу стандартных веб-ссылок. Это самый современный и бесконфликтный способ интеграции систем.

Внешняя веб-ссылка выглядит следующим образом: https://my-server.ru/ZupOf#e1cib/data/.... При вызове перехода по такой ссылке происходят следующие действия:

Этот метод не требует от системных администраторов никаких локальных манипуляций с реестром Windows и гарантирует работу даже на мобильных устройствах или компьютерах под управлением Linux.

Способ 5. Автоматическая регистрация протокола при запуске системы

Если вам все же необходимо использовать именно протокол e1c://, но делать это вручную на 600 компьютерах нереально, мы можем автоматизировать этот процесс. Достаточно написать процедуру, которая при старте основной информационной базы проверяет наличие необходимых записей в реестре Windows текущего пользователя и, в случае их отсутствия, прописывает их программно.

Для этого в модуле управляемого приложения при начале работы системы можно вызвать запись в ветку реестра HKEY_CURRENT_USER\Software\Classes\e1c. Данная ветка не требует прав локального администратора компьютера, так как относится к текущему активному пользователю. Это позволит автоматически настроить все рабочие места без привлечения службы технической поддержки.

Резюме

Мы проанализировали основные способы реализации переходов между базами 1С. Наиболее предпочтительным и современным является переход на режим совместимости 8.3 и использование стандартных механизмов платформы или БСП. Если же вы ограничены старыми версиями или закрытой инфраструктурой, запуск стартера через ЗапуститьПриложение() с ключом /URL или публикация баз на веб-сервере станут надежной альтернативой.

← На главную