Как запустить внешнюю обработку в сторонней базе через COM-соединение

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

При интеграции различных информационных систем на базе 1С:Предприятие часто возникает задача не просто обменяться данными, а выполнить конкретный алгоритм, заложенный во внешнюю обработку (.epf), на стороне другой базы. Использование технологии COM-соединения (через v8.Application или v8.ComConnector) является стандартом для таких задач. Однако разработчики часто сталкиваются с ошибкой «Неизвестное имя формы» при попытке программно открыть окно обработки в удаленной сессии. В этой статье мы подробно разберем, как правильно реализовать этот механизм, избежав типичных ошибок.

Разбор архитектуры взаимодействия через COM

Для начала проанализируем ситуацию: у нас есть «Промежуточная» база (клиент) и «Рабочая» база (сервер COM). Нам нужно из клиентской базы инициировать подключение, загрузить файл обработки в память удаленной базы и вывести его форму на экран пользователя.

Важно различать два типа COM-объектов:

  1. V83.COMConnector — легкий объект, предназначенный для работы с данными на сервере. Он не имеет интерфейса (GUI), поэтому запуск форм через него невозможен.
  2. V83.Application — полноценный запуск клиента 1С. Именно этот объект позволяет работать с формами и интерактивными окнами.

Рассмотрим пример функции инициализации подключения, предоставленный в обсуждении:


Функция СоздатьПодключениеApplication() Экспорт
    СтрокаПодключения = "File=""C:\Base1C"";Usr=""Администратор"";Pwd=""123"";";
    мСоединениеА = Новый COMОбъект("v83.Application");
    Попытка
        Результат = мСоединениеА.Connect(СтрокаПодключения);
        мСоединениеА.Visible = Истина; // Обязательно для работы с формами
    Исключение
        Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    Возврат мСоединениеА;
КонецФункции

Обратите внимание на свойство Visible = Истина. Если вы планируете открывать формы, удаленное приложение должно быть видимым, иначе вызов методов открытия окон может быть проигнорирован системой или вызвать исключение.

Подключение внешней обработки: Создать или Подключить?

Выясним причину основной ошибки автора сообщения. В платформе 1С существует два метода для работы с внешними файлами обработок через объект ВнешниеОбработки:

1. Метод Создать(). Он возвращает объект обработки. Если база-источник и база-приемник имеют одинаковую архитектуру форм (например, обе на обычных формах), это работает. Но при попытке передать объект формы через границу COM из управляемого приложения в обычное, возникает конфликт типов.

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

Проанализируем типичную ошибку в коде:


// ОШИБОЧНЫЙ ВАРИАНТ
мСоединениеА.ВнешниеОбработки.Подключить(ПутьКФайлу);
Форма = мСоединениеА.ПолучитьФорму("ВнешняяОбработка.ВыгрузкаДокументов.Форма.Форма");

Почему это не работает? Потому что после выполнения метода Подключить, 1С присваивает обработке внутреннее имя, например, ВнешняяОбработка1. Старое имя из конфигуратора (в данном случае ВыгрузкаДокументов) в контексте сеанса становится неактуальным.

Правильный алгоритм открытия формы

Рассмотрим правильный подход по шагам. Сначала мы должны получить имя, которое платформа присвоила подключенному файлу, а затем сконструировать строку пути к форме.


// ПРАВИЛЬНЫЙ ВАРИАНТ
// 1. Регистрируем файл во временном хранилище или подключаем напрямую
ИмяОбработкиВСеансе = мСоединениеА.ВнешниеОбработки.Подключить(ПутьКФайлу);

// 2. Формируем полное имя формы, используя возвращенное имя
// Шаблон: ВнешняяОбработка.[ИмяИзМетодаПодключить].Форма.[ИмяФормыВКонфигураторе]
ПолноеИмяФормы = "ВнешняяОбработка." + ИмяОбработкиВСеансе + ".Форма.ФормаВыгрузки";

// 3. Получаем форму через COM-соединение
ФормаОбработки = мСоединениеА.ПолучитьФорму(ПолноеИмяФормы);

// 4. Открываем форму
ФормаОбработки.Открыть();

Особенности работы с Управляемыми Формами (УФ)

Если удаленная база работает в режиме управляемого приложения, метод ПолучитьФорму может вести себя специфично. Выясним, как обойти возможные ограничения. В управляемом интерфейсе 1С рекомендует использовать глобальный метод ОткрытьФорму().

Посмотрим, как вызвать его через COM-объект Application:


// В удаленной базе (через COM) вызываем глобальный контекст
мСоединениеА.ОткрытьФорму("ВнешняяОбработка." + ИмяОбработкиВСеансе + ".Форма.ФормаВыгрузки");

Важный нюанс: Передача параметров. Если вам нужно передать данные в открываемую форму, используйте структуру. Помните, что типы данных в структуре должны быть примитивными (строка, число, дата) или ссылками, которые существуют в обеих базах, иначе COM-прокси не сможет их сериализовать.


ПараметрыФормы = мСоединениеА.NewObject("Структура");
ПараметрыФормы.Вставить("Организация", СсылкаНаОрганизациюВУдаленнойБазе);

мСоединениеА.ОткрытьФорму("ВнешняяОбработка." + ИмяОбработкиВСеансе + ".Форма.Имя", ПараметрыФормы);

Безопасность и защита от опасных действий

Начиная с версии платформы 8.2.19 и выше, были введены механизмы защиты. Если вы программно создаете объект внешней обработки, 1С может выдать предупреждение безопасности, которое заблокирует выполнение кода в COM-сессии.

Проанализируем пример использования UnsafeOperationProtectionDescription для обхода таких ситуаций (если это допустимо политикой безопасности):


ОписаниеЗащиты = мСоединениеА.NewObject("UnsafeOperationProtectionDescription");
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;

// Используем описание защиты при создании
ВнешняяОбработка = мСоединениеА.ВнешниеОбработки.Создать(ПутьКФайлу, Ложь, ОписаниеЗащиты);

Рекомендации по отладке

Если форма все равно не открывается, проверьте следующие моменты:

  1. Права доступа. Пользователь, под которым устанавливается COM-соединение, должен иметь право «Интерактивное открытие внешних обработок».
  2. Модальность. Если в конфигурации-приемнике запрещены модальные окна, вызов ОткрытьФормуМодально() приведет к критической ошибке. Используйте обычное Открыть().
  3. Владелец формы. При вызове ПолучитьФорму(Имя, Владелец) в качестве владельца нельзя передавать ЭтаФорма из локальной базы. Владелец должен быть либо Неопределено, либо формой из той же удаленной базы.
  4. Инициализация окружения. Иногда форма внешней обработки обращается к экспортным переменным глобального модуля. При COM-запуске они могут быть не инициализированы. Попробуйте перед открытием формы вызвать любую пустую экспортную процедуру из общего модуля удаленной базы, чтобы принудительно инициализировать контекст.

Таким образом, запуск внешней обработки через COM — это мощный инструмент, требующий внимательного отношения к именованию объектов и режимам работы клиентского приложения. Использование возвращаемого значения метода Подключить() является ключом к решению большинства проблем с «невидимыми» формами.

← На главную