Как программно определить, открыта ли нужная база 1С у текущего пользователя?

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

При интеграции различных конфигураций 1С, например, при связке устаревшей «Альфа-Авто 4.1» и современной «ERP 2» или «Комплексной автоматизации 2», часто возникает задача быстрого перехода пользователя из одного приложения в другое. Основная сложность заключается в том, что если база уже открыта, мы хотим просто переключиться на нужный объект, а если нет — выдать предупреждение или запустить клиентское приложение. Рассмотрим, как решить эту задачу программно, учитывая разницу платформ и механизмов взаимодействия.

Анализ проблемы взаимодействия разных версий платформ

Ранее для связи конфигураций часто использовался механизм OLE, однако он накладывает жесткие ограничения: обе базы должны работать на одной и той же версии платформы 1С. В ситуации, когда «Альфа-Авто 4.1» ограничена платформой 8.3.10, а современная ERP требует более высоких версий (8.3.20 и выше), OLE-взаимодействие становится невозможным. В этом случае мы переходим на использование COM-соединения (V83.COMConnector).

Для того чтобы понять, открыта ли база у конкретного пользователя, нам необходимо подключиться к целевой базе через COM под технической учетной записью (или под текущим пользователем) и проанализировать список активных соединений. Разберем этот процесс по шагам.

Решение через COM-соединение и анализ активных сеансов

Основным инструментом для нас будет метод ПолучитьСоединенияИнформационнойБазы(). Этот метод возвращает массив объектов СоединениеИнформационнойБазы, содержащих информацию о каждом активном сеансе.

Рассмотрим алгоритм реализации функции проверки:

  1. Создаем COM-соединение с целевой базой данных (ERP/КА2).
  2. Получаем GUID (уникальный идентификатор) пользователя в целевой базе, которого мы хотим проверить.
  3. Вызываем метод ПолучитьСоединенияИнформационнойБазы() через созданный COM-объект.
  4. Обходим массив соединений и ищем соответствие по GUID пользователя и типу приложения (например, "Тонкий клиент").

Проанализируем пример кода, реализующий эту логику:


Функция БазаКАОткрытаПользователем(Объект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/" + ИмяСервера + "/" + ИмяБазы + "#" + ПолучитьНавигационнуюСсылкуИнформационнойБазы(НужныйОбъект);
ЗапуститьПриложение(СсылкаНаОбъект);

Этот метод избавляет программиста от необходимости проверять «открыта ли база», так как платформа берет эту проверку на себя.

Использование HTTP-сервисов для проверки статуса

Разберем еще один продвинутый вариант. Если COM-соединение работает нестабильно из-за разрядности систем (32-битный клиент 1С и 64-битный сервер) или проблем с регистрацией comcntr.dll, можно использовать HTTP-сервисы.

В целевой базе (ERP) создается простой HTTP-сервис, который принимает имя пользователя. Внутри сервиса выполняется тот же поиск по активным соединениям под полными правами сервера. Преимущество этого метода в том, что «старая» база (Альфа-Авто) делает легкий запрос по протоколу HTTP и мгновенно получает ответ в формате JSON или простое «Да/Нет», не создавая тяжеловесных COM-объектов.

Дополнительная проверка через DataVersion

В процессе работы с COM-объектами вы можете столкнуться с полем DataVersion (Версия данных). Выясним, для чего оно нужно. Это поле типа RowVersion, которое изменяется при любой записи объекта. В контексте нашей задачи его можно использовать для проверки того, что ссылка, полученная из другой базы, актуальна и объект существует. Если при обращении к Объект.DataVersion через COM вы получаете значение, значит, объект успешно прочитан и база доступна для взаимодействия.

Резюмируем: Для простой проверки "здесь и сейчас" идеально подходит метод анализа сеансов через COM с использованием УникальныйИдентификатор пользователя. Однако для обеспечения лучшего пользовательского опыта рекомендуем сочетать этот метод с навигационными ссылками e1c://, которые автоматически обрабатывают фокус окна приложения.

← На главную