При интеграции различных конфигураций 1С, например, при связке устаревшей «Альфа-Авто 4.1» и современной «ERP 2» или «Комплексной автоматизации 2», часто возникает задача быстрого перехода пользователя из одного приложения в другое. Основная сложность заключается в том, что если база уже открыта, мы хотим просто переключиться на нужный объект, а если нет — выдать предупреждение или запустить клиентское приложение. Рассмотрим, как решить эту задачу программно, учитывая разницу платформ и механизмов взаимодействия.
Ранее для связи конфигураций часто использовался механизм OLE, однако он накладывает жесткие ограничения: обе базы должны работать на одной и той же версии платформы 1С. В ситуации, когда «Альфа-Авто 4.1» ограничена платформой 8.3.10, а современная ERP требует более высоких версий (8.3.20 и выше), OLE-взаимодействие становится невозможным. В этом случае мы переходим на использование COM-соединения (V83.COMConnector).
Для того чтобы понять, открыта ли база у конкретного пользователя, нам необходимо подключиться к целевой базе через COM под технической учетной записью (или под текущим пользователем) и проанализировать список активных соединений. Разберем этот процесс по шагам.
Основным инструментом для нас будет метод ПолучитьСоединенияИнформационнойБазы(). Этот метод возвращает массив объектов СоединениеИнформационнойБазы, содержащих информацию о каждом активном сеансе.
Рассмотрим алгоритм реализации функции проверки:
ПолучитьСоединенияИнформационнойБазы() через созданный COM-объект.Проанализируем пример кода, реализующий эту логику:
Функция БазаКАОткрытаПользователем(ОбъектCOM) Экспорт
Если ОбъектCOM <> Неопределено Тогда
// 1. Находим идентификатор пользователя в целевой базе
// Предположим, у нас есть связь между справочниками пользователей в двух базах
ПользовательВЦелевойБазе = НайтиЭлементСправочникаВ_КА(ПараметрыСеанса.ТекущийПользователь, "Пользователи");
// Получаем строковое представление GUID пользователя ИБ
GUIDПользователяИБ = ОбъектCOM.XMLСтрока(ПользовательВЦелевойБазе.ИдентификаторПользователяИБ);
// 2. Получаем список всех активных соединений
МассивСоединений = ОбъектCOM.ПолучитьСоединенияИнформационнойБазы();
// 3. Перебор соединений для поиска нужного сеанса
Для Каждого Соединение Из МассивСоединений Цикл
// Проверяем GUID пользователя
Если ОбъектCOM.XMLСтрока(Соединение.Пользователь.УникальныйИдентификатор) = GUIDПользователяИБ Тогда
// Проверяем, что это интерактивный клиент (Тонкий или Толстый)
ИмяПриложения = ОбъектCOM.ПредставлениеПриложения(Соединение.ИмяПриложения);
Если Найти(НРег(ИмяПриложения), "клиент") > 0 Тогда
Возврат Истина; // База открыта пользователем
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
Важное замечание: Метод ПолучитьСоединенияИнформационнойБазы() требует наличия административных прав. Если обычный пользователь не обладает правом "Администрирование", вызов метода через COM вернет ошибку. Для обхода этого ограничения рекомендуется в целевой базе (ERP) создать общий модуль с признаком Привилегированный и вызывать функцию получения соединений через него.
Если ваша задача — не просто проверить статус, а открыть конкретный документ в уже запущенной базе, мы можем воспользоваться механизмом Навигационных ссылок. Это более надежный и современный способ, который не требует сложной работы с COM-объектами для управления окнами.
Рассмотрим, как работает протокол e1c://. Когда вы вызываете команду открытия такой ссылки в операционной системе, 1С сама анализирует запущенные процессы:
Пример формирования ссылки для перехода:
// Пример структуры: e1c://server/ИмяСервера/ИмяБазы#e1cib/data/Документ.РеализацияТоваровУслуг?ref=GUID
СсылкаНаОбъект = "e1c://server/" + ИмяСервера + "/" + ИмяБазы + "#" + ПолучитьНавигационнуюСсылкуИнформационнойБазы(НужныйОбъект);
ЗапуститьПриложение(СсылкаНаОбъект);
Этот метод избавляет программиста от необходимости проверять «открыта ли база», так как платформа берет эту проверку на себя.
Разберем еще один продвинутый вариант. Если COM-соединение работает нестабильно из-за разрядности систем (32-битный клиент 1С и 64-битный сервер) или проблем с регистрацией comcntr.dll, можно использовать HTTP-сервисы.
В целевой базе (ERP) создается простой HTTP-сервис, который принимает имя пользователя. Внутри сервиса выполняется тот же поиск по активным соединениям под полными правами сервера. Преимущество этого метода в том, что «старая» база (Альфа-Авто) делает легкий запрос по протоколу HTTP и мгновенно получает ответ в формате JSON или простое «Да/Нет», не создавая тяжеловесных COM-объектов.
В процессе работы с COM-объектами вы можете столкнуться с полем DataVersion (Версия данных). Выясним, для чего оно нужно. Это поле типа RowVersion, которое изменяется при любой записи объекта. В контексте нашей задачи его можно использовать для проверки того, что ссылка, полученная из другой базы, актуальна и объект существует. Если при обращении к Объект.DataVersion через COM вы получаете значение, значит, объект успешно прочитан и база доступна для взаимодействия.
Резюмируем: Для простой проверки "здесь и сейчас" идеально подходит метод анализа сеансов через COM с использованием УникальныйИдентификатор пользователя. Однако для обеспечения лучшего пользовательского опыта рекомендуем сочетать этот метод с навигационными ссылками e1c://, которые автоматически обрабатывают фокус окна приложения.