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

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

При интеграции 1С с внешними системами часто возникает задача передать данные непосредственно в открытое окно пользователя (например, заполнить реквизиты открытого документа или активировать форму при звонке из софтфона/сканировании). В среде Windows для многих офисных программ применяется COM-автоматизация через вызов GetObject(,"Application"), однако с 1С данный подход не работает. Выясним причину такого поведения платформы и разберем проверенные способы решения этой задачи.

Почему COM-соединение не подключается к активному процессу 1С

Проанализируем технические ограничения COM-технологии платформы 1С. При создании объекта через CreateObject("V83.Application") операционная система всегда запускает новый фоновый сеанс 1С со своим контекстом.

Интерактивные клиенты платформы (1cv8.exe или 1cv8c.exe) по умолчанию не регистрируют себя в таблице активных объектов Windows (Running Object Table — ROT). По этой причине подключиться к уже работающему интерфейсному процессу через стандартные системные механизмы OLE/COM невозможно. Кроме того, серверный контекст 1С не имеет прямого доступа к открытым формам конкретного пользователя на клиенте. Передать данные в форму можно только в рамках клиентского сеанса этого пользователя.

Решение 1. Использование внешней компоненты (Native API) и внешних событий

Классический и наиболее надежный путь для организации локального взаимодействия (по аналогии со сканерами штрихкодов и торговым оборудованием) — подключение внешней компоненты. Сторонняя программа связывается с компонентой (например, через локальный сокет или именованный пайп), а компонента генерирует внешнее событие в платформе 1С через интерфейс IExternalEvent.

Разберем по шагам процесс загрузки и подключения Native-компоненты из макета конфигурации:

  1. Помещаем архив с двоичными данными компоненты в макет конфигурации.
  2. Помещаем макет во временное хранилище и вызываем методы установки и подключения.
  3. Создаем экземпляр объекта компоненты.

Посмотрим на пример кода на встроенном языке 1С:


&НаКлиенте
Процедура ПодключитьКомпонентуНаКлиенте()
    МакетВК = ПолучитьМакетНаСервере("МакетКомпоненты");
    АдресВК = ПоместитьВоВременноеХранилище(МакетВК, Новый УникальныйИдентификатор);
    
    // Устанавливаем и подключаем компоненту
    Если УстановитьВнешнююКомпоненту(АдресВК) Тогда
        ИмяПодключения = "MyNetDriver";
        
        Если ПодключитьВнешнююКомпоненту(АдресВК, ИмяПодключения, ТипВнешнейКомпоненты.Native) Тогда
            // Инициализация объекта: AddIn.[ИмяПодключения].[ИмяКлассаИзКомпоненты]
            Попытка
                ПодключаемыйМодуль = Новый("AddIn." + ИмяПодключения + ".WebExtEvent");
                Сообщить("Компонента успешно подключена!");
            Исключение
                ВызватьИсключение "Ошибка создания объекта: " + ОписаниеОшибки();
            КонецПопытки;
        Иначе
            Сообщить("Не удалось подключить внешнюю компоненту.");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьМакетНаСервере(ИмяМакета)
    Возврат Обработки.ИнтеграцияВнешнихСобытий.ПолучитьМакет(ИмяМакета);
КонецФункции

Разбор частой ошибки: «Тип не определен (AddIn.Имя.Класс)»

При вызове конструктора Новый("AddIn...") крайне важно соблюдать строгое соответствие наименований. Шаблон вызова выглядит следующим образом: AddIn.[ИмяПодключения].[ИмяКласса]. Здесь ИмяПодключения — строка, переданная вторым параметром в метод ПодключитьВнешнююКомпоненту, а ИмяКласса — внутреннее имя класса, возвращаемое самой компонентой в методе GetClassNames(). Несовпадение регистра или имен приводит к ошибке неопределенного типа.

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


&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    // Проверяем источник события от нашей компоненты
    Если Источник = "MyNetDriver" Тогда
        // Обрабатываем входящие данные (например, распарсиваем JSON/текст и заполняем форму)
        ЗаполнитьРеквизитыФормыПоДанным(Данные);
    КонецЕсли;
КонецПроцедуры

Решение 2. HTTP-сервисы базы в связке с Системой взаимодействия

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

  1. Сторонняя программа отправляет HTTP POST-запрос на опубликованный HTTP-сервис базы 1С с необходимыми данными и идентификатором пользователя.
  2. Сервер 1С принимает запрос и отправляет сообщение через СистемаВзаимодействия.ОтправитьСообщение конкретному пользователю.
  3. На стороне тонкого клиента пользователя срабатывает обработчик сообщений Системы взаимодействия, который программно активирует нужную форму и подставляет переданные значения.

Данный способ исключает открытие локальных сетевых портов на рабочих станциях пользователей и работает стабильно даже через веб-клиент.

Решение 3. Использование навигационных ссылок (e1c/e1cib)

Платформа 1С регистрирует в операционной системе схему URL-протоколов e1c:// и e1cib://. Если стороннему приложению требуется открыть конкретный объект или выполнить команду в уже запущенном сеансе, достаточно выполнить системный вызов операционной системы с навигационной ссылкой.

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

Решение 4. Обходной вариант через регистр сведений и обработчик ожидания

Если нет возможности использовать внешние компоненты или публиковать HTTP-сервисы, рассмотрим простой вариант с буферизацией данных:

  1. Внешнее приложение через COM-соединение или прямой SQL-запрос записывает порцию данных в служебный регистр сведений базы с пометкой пользователя-получателя.
  2. На форме в 1С при открытии подключается фоновый опрос: ПодключитьОбработчикОжидания("ПроверитьВходящиеДанные", 2).
  3. Процедура формы периодически опрашивает регистр и при обнаружении новых записей считывает их в форму, после чего удаляет или помечает прочитанными.

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

← На главную