В процессе интеграции различных конфигураций 1С часто возникает необходимость оперативного перехода к объекту в другой информационной базе. Традиционно для этих целей использовались механизмы COM или OLE. Однако при работе баз на разных версиях платформы (например, переход с версии 8.3.10 на 8.3.20) или при использовании разных типов клиентов (обычные и управляемые формы) эти механизмы становятся нестабильными или вовсе перестают работать. В данной статье мы разберем, как организовать открытие документов и справочников в другой базе, используя возможности командной строки и навигационные ссылки.
Основная проблема COM-соединения заключается в его чувствительности к версии платформы: на сервере и клиенте версии должны совпадать с точностью до релиза. Кроме того, создание COM-объекта — это ресурсоемкая операция, которая требует времени на инициализацию. Если ваша задача — просто показать пользователю форму документа в целевой базе (например, в КА 2.4 из Альфа-Авто), использование внешнего запуска через командную строку является более надежным и быстрым способом.
Наиболее современный и эффективный способ — запуск целевой базы с параметром /URL. Этот ключ указывает платформе, какой именно объект нужно открыть сразу после авторизации. Рассмотрим структуру команды запуска:
Пример строки запуска:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S "ServerName\BaseName" /URL "e1cib/data/Документ.РеализацияТоваровУслуг?ref=80cc0050568d6b1711e95b9eabf5385b"
Здесь важно правильно сформировать навигационную ссылку. Она состоит из типа объекта (метаданных) и уникального идентификатора (GUID).
Проблема заключается в том, что стандартное строковое представление GUID в 1С отличается от того, которое используется в навигационных ссылках (так называемый Navigator GUID). Чтобы ссылка сработала, байты идентификатора нужно переставить в определенном порядке. Проанализируем программный код для преобразования GUID в формат, пригодный для навигационной ссылки:
Процедура СформироватьПутьОбъекта(ТипОбъекта, ГуидОбъекта)
// ТипОбъекта - строка, например "Документ.ЗаказПокупателя"
// ГуидОбъекта - строка стандартного GUID (UUID)
Если ПустаяСтрока(ТипОбъекта) Или ПустаяСтрока(ГуидОбъекта) Тогда
Возврат;
КонецЕсли;
// Перестановка сегментов GUID для формата 1С e1cib
НавигационныйГУИД = Сред(ГуидОбъекта, 20, 4)
+ Сред(ГуидОбъекта, 25, 12)
+ Сред(ГуидОбъекта, 15, 4)
+ Сред(ГуидОбъекта, 10, 4)
+ Сред(ГуидОбъекта, 1, 8);
ПутьОбъектаВИБ = "e1cib/data/" + ТипОбъекта + "?ref=" + НавигационныйГУИД;
// Формируем команду запуска
СтрокаЗапуска = "ENTERPRISE /S " + ИмяСервераИБазы + " /URL " + ПутьОбъектаВИБ;
ЗапуститьПриложение(ПутьК1cestart + " " + СтрокаЗапуска);
КонецПроцедуры
Этот метод позволяет "пробросить" пользователя сразу в нужную форму. Если сеанс в целевой базе уже открыт, то при определенных настройках ОС (регистрация протокола e1c) объект может открыться в текущем окне, не создавая новый сеанс.
Если конфигурация в целевой базе не позволяет напрямую открывать объекты через /URL или требуется дополнительная логика обработки, можно использовать параметр /C (ПараметрЗапуска). Рассмотрим этот алгоритм:
/C "ТипОбъекта;GUID".ПриНачалеРаботыСистемы) пишем код обработки параметра.Код в целевой базе (Управляемые формы):
Процедура ПриНачалеРаботыСистемы(Отказ)
Если ЗначениеЗаполнено(ПараметрЗапуска) Тогда
// Допустим, мы передали "Справочник.Номенклатура;80cc0050..."
ЧастиПараметра = СтрРазделить(ПараметрЗапуска, ";");
ТипОбъекта = ЧастиПараметра[0];
ГуидСтрокой = ЧастиПараметра[1];
СсылкаНаОбъект = Справочники[ТипОбъекта].ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидСтрокой));
ПоказатьЗначение(, СсылкаНаОбъект);
КонецЕсли;
КонецПроцедуры
Если база-источник работает на обычных формах, вы можете столкнуться с трудностями при использовании методов, предназначенных для управляемого интерфейса. Например, функция РеквизитФормыВЗначение не будет работать. Рассмотрим, как программно извлечь вспомогательную обработку из макета и запустить её в обычном приложении:
Процедура ОткрытьВБазеИсточнике()
// Получаем макет внешней обработки, которая умеет открывать ссылки
ОбработкаМакет = ЭтотОбъект.ПолучитьМакет("ВспомогательнаяОбработка");
ПутьКФайлу = КаталогВременныхФайлов() + "OpenObject.epf";
ОбработкаМакет.Записать(ПутьКФайлу);
// Формируем параметры запуска через /Exec
ПараметрыЗапуска = "ENTERPRISE /S " + ПутьКБазе + " /Exec " + ПутьКФайлу + " /C " + ДанныеОбъекта;
ЗапуститьПриложение(ПутьК1cestart + " " + ПараметрыЗапуска);
КонецПроцедуры
Важный нюанс: при использовании ЗапуститьПриложение программа может потребовать ввод логина и пароля. Чтобы этого избежать, добавьте в строку запуска параметры /N "ИмяПользователя" и /P "Пароль" или используйте ключ /WA+ для Windows-авторизации.
Проанализируем ситуацию, когда целевая база опубликована на веб-сервере. В этом случае задача значительно упрощается. Навигационная ссылка превращается в обычный URL-адрес, который можно открыть любым системным браузером:
http://myserver/mybase/ru_RU/e1cib/data/Справочник.Контрагенты?ref=80cc0050...
Это избавляет от необходимости знать путь к исполняемому файлу 1cestart.exe на локальном компьютере пользователя. Достаточно вызвать ЗапуститьПриложение(СформированнаяСсылка), и операционная система сама откроет браузер по умолчанию.
Выясним причины, по которым следует выбрать тот или иной метод:
Подведем итог: Отказ от COM-соединения в пользу навигационных ссылок и параметров командной строки делает вашу систему более устойчивой к обновлениям платформы 1С и снижает нагрузку на клиентские рабочие станции. Рассмотрим внедрение этих методов как стандарт для интеграции современных решений 1С.