В процессе интеграции нескольких информационных систем на платформе 1С:Предприятие 8 часто возникает задача бесшовного перехода пользователя из одной базы в другую. Например, при работе в ERP-системе пользователю может потребоваться открыть связанный документ или карточку сотрудника в базе ЗУП. Для решения этой задачи используются внешние навигационные ссылки формата e1c://.
Однако при программной реализации такого перехода разработчики часто сталкиваются с тем, что стандартные методы не отрабатывают, а система ведет себя непредсказуемо. В этой статье мы подробно разберем, как устроен механизм внешних ссылок, почему он может не работать в устаревших конфигурациях и как настроить надежный переход несколькими альтернативными способами.
Разберем типичную проблему: при попытке вызвать переход программно ничего не происходит или система выдает ошибку, хотя ручной ввод ссылки через стандартное меню 1С («Перейти по ссылке») работает корректно. Выясним причину этого поведения.
Дело в том, что в платформе 1С поведение метода ПерейтиПоНавигационнойСсылке() напрямую зависит от установленного режима совместимости конфигурации:
e1cib/...). Внешние ссылки формата e1c:// в этом режиме программно не обрабатываются. Именно эта проблема часто возникает в базах, которые давно не обновлялись или сохраняют обратную совместимость.e1c://, находит нужную базу и выполняет переход.Поэтому первым делом при возникновении проблем с переходом проверим свойства конфигурации в конфигураторе. Если там установлен режим совместимости 8.2, то для использования простого платформенного решения потребуется либо обновить режим совместимости, либо использовать один из обходных путей, которые мы рассмотрим далее.
Прежде чем переходить к коду, проанализируем, как именно операционная система и платформа 1С взаимодействуют при получении ссылки вида e1c://server/serverZUP/ZupOf#e1cib/data/...:
e1c.1cestart.exe).Важное примечание для платформы версии 8.3.24 и выше: В некоторых новых релизах поведение сопоставления окон изменилось. Если передавать ссылку в «чистом» виде, система может не сопоставить ее с уже открытой базой и запустить дублирующее окно. Чтобы этого избежать, разработчики рекомендуют добавлять в ссылку закодированные пустые разделители данных перед символом решетки, например: e1c://server/serverZUP/ZupOf?Z=%2B%2C%2B#e1cib/data/....
Если ваша конфигурация работает без режима совместимости с 8.2, то самым простым и правильным решением будет вызов штатной функции платформы на клиенте. Рассмотрим пример реализации:
&НаКлиенте
Процедура ВыполнитьПереходПоВнешнейСсылке(Знач ИсходнаяСсылка)
// Проверим, что ссылка является внешней
Если Лев(ИсходнаяСсылка, 6) = "e1c://" Тогда
Попытка
ПерейтиПоНавигационнойСсылке(ИсходнаяСсылка);
Исключение
ПоказатьПредупреждение(, "Не удалось перейти по ссылке: " + ОписаниеОшибки());
КонецПопытки;
Иначе
ПоказатьПредупреждение(, "Переданная ссылка не является внешней ссылкой 1С.");
КонецЕсли;
КонецПроцедуры
Этот способ идеален своей лаконичностью. Платформа берет на себя все рутинные операции по поиску запущенных процессов 1С и передаче им фокуса управления.
В современных конфигурациях, использующих БСП, настоятельно рекомендуется избегать прямого обращения к платформенным методам перехода. Вместо этого лучше использовать функции общего модуля ФайловаяСистемаКлиент. Это гарантирует корректную работу кода в любых режимах работы клиента (включая веб-клиент) и предотвращает непредвиденные падения интерфейса.
Рассмотрим, как будет выглядеть вызов:
&НаКлиенте
Процедура ОткрытьДокументВДругойБазе(НавигационнаяСсылка)
// Используем безопасный метод БСП
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка);
КонецПроцедуры
Под капотом БСП сама выполнит все необходимые проверки доступности окружения и корректно обработает переход.
Что делать, если режим совместимости 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С. Обратитесь к системному администратору.");
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Данный подход полностью снимает головную боль с администрированием рабочих мест пользователей. Программа отрабатывает локально, используя уже установленный у пользователя дистрибутив платформы.
Если база-приемник опубликована на веб-сервере (например, под управлением IIS или Apache), мы можем полностью отказаться от проприетарного протокола e1c:// в пользу стандартных веб-ссылок. Это самый современный и бесконфликтный способ интеграции систем.
Внешняя веб-ссылка выглядит следующим образом: https://my-server.ru/ZupOf#e1cib/data/.... При вызове перехода по такой ссылке происходят следующие действия:
Этот метод не требует от системных администраторов никаких локальных манипуляций с реестром Windows и гарантирует работу даже на мобильных устройствах или компьютерах под управлением Linux.
Если вам все же необходимо использовать именно протокол e1c://, но делать это вручную на 600 компьютерах нереально, мы можем автоматизировать этот процесс. Достаточно написать процедуру, которая при старте основной информационной базы проверяет наличие необходимых записей в реестре Windows текущего пользователя и, в случае их отсутствия, прописывает их программно.
Для этого в модуле управляемого приложения при начале работы системы можно вызвать запись в ветку реестра HKEY_CURRENT_USER\Software\Classes\e1c. Данная ветка не требует прав локального администратора компьютера, так как относится к текущему активному пользователю. Это позволит автоматически настроить все рабочие места без привлечения службы технической поддержки.
Мы проанализировали основные способы реализации переходов между базами 1С. Наиболее предпочтительным и современным является переход на режим совместимости 8.3 и использование стандартных механизмов платформы или БСП. Если же вы ограничены старыми версиями или закрытой инфраструктурой, запуск стартера через ЗапуститьПриложение() с ключом /URL или публикация баз на веб-сервере станут надежной альтернативой.