При интеграции двух информационных баз 1С:Предприятие часто возникает необходимость вызывать интерактивные формы одной базы из другой. Типичный сценарий — обработка входящих звонков в CTI-системе (IP-телефонии), когда при вызове менеджеру необходимо одновременно видеть справочники, документы или карточки клиентов из сторонней базы данных в нескольких независимых окнах.
Разберем распространенную ошибку, когда формы внешней базы открываются исключительно в модальном режиме через методы ОткрытьМодально() или DoModal(), блокируя дальнейшую работу пользователя, а стандартный метод Открыть() просто не отображает окно на экране.
Проанализируем работу системы 1С:Предприятие в качестве Automation-сервера. Когда мы создаем объект V83.Application, запускается полноценный экземпляр клиентского приложения. Главное различие между обычной работой и COM-соединением заключается в режиме отображения пользовательского интерфейса.
Посмотрим на ошибочный фрагмент кода, при котором возникает проблема:
Если ВременноеХранилище = Неопределено Тогда
БазаИсточник = Новый COMОбъект("V83.Application");
БазаИсточник.Connect("File=""D:\БазаДанных"";Usr=""Администратор"";");
БазаИсточник.visible = false; // Главное окно скрыто!
Структура = Новый Структура("Объект", БазаИсточник);
ВременноеХранилище = ПоместитьВоВременноеХранилище(Структура, Новый УникальныйИдентификатор());
Иначе
БазаИсточник = ПолучитьИзВременногоХранилища(ВременноеХранилище).Объект;
КонецЕсли;
Документ = БазаИсточник.Справочники.Контрагенты;
Документ.ПолучитьФормуСписка().ОткрытьМодально();
Ключевая причина: в коде явно задано свойство БазаИсточник.visible = false;. В этом режиме внешнее приложение работает как фоновый процесс без отображения основного графического интерфейса.
Когда приложение скрыто (Visible = False):
Открыть() выполняет создание и открытие формы в графическом контексте скрытого приложения, из-за чего пользователь физически не видит открытое окно на своем рабочем столе.ОткрытьМодально() насильно приостанавливает исполнение кода и выводит модальный диалог поверх остальных окон, но при этом блокирует родительский поток и интерфейс, не позволяя параллельно открывать другие формы или нажимать кнопки в исходной базе.Чтобы немодальные формы корректно отображались и пользователь мог открывать сразу несколько окон параллельно, необходимо активировать видимость самого приложения V83.Application.
Рассмотрев правильную последовательность действий, внесем изменения в код:
// Инициализация COM-соединения
БазаИсточник = Новый COMОбъект("V83.Application");
БазаИсточник.Connect("File=""D:\Кочеров\ИнфБазы\Бух(демо)"";Usr=""Любимов (администратор)"";");
// Обязательно включаем видимость главного окна внешнего приложения!
БазаИсточник.Visible = True;
// Получаем и открываем форму в немодальном режиме
ФормаСписка = БазаИсточник.Справочники.Контрагенты.ПолучитьФормуСписка();
ФормаСписка.Открыть();
Установка свойства Visible = True делает рабочее окно целевой базы видимым. После этого метод Открыть() создает немодальные формы, с которыми пользователь может работать одновременно, не блокируя работу основного сеанса.
Использование V83.Application для решения задачи многооконного интерфейса имеет ряд существенных недостатков, о которых важно помнить при проектировании системы:
V83.Application с параметром Visible = True инициализирует полноценный клиентский процесс (1cv8.exe) и задействует отдельную клиентскую лицензию 1С.Разберем более эффективные альтернативы для задач автоматизации CTI и взаимодействия между базами:
e1c://... и запустить ее через команду ЗапуститьПриложение(). Это активирует уже запущенный клиент целевой базы и откроет нужный объект без создания новых COM-процессов.V83.COMConnector вместо V83.Application. Он работает в разы быстрее и не требует запуска внешнего графического клиента.