Как обеспечить корректное отображение окон при работе через OLE-соединение в 1С:Предприятие 8

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

При интеграции различных конфигураций 1С, например, Альфа-Авто и УПП, часто возникает необходимость открывать карточки справочников или документы из одной базы в другой. Использование OLE-соединения (COM-технологии) является классическим методом для решения этой задачи. Однако разработчики часто сталкиваются с тем, что открываемые формы "теряются": они либо открываются внутри свернутого главного окна вызываемой базы, либо не отображаются в панели задач (трее), что крайне неудобно для конечного пользователя. Разберем подробно, как решить эти проблемы и добиться того, чтобы формы открывались поверх всех окон и имели собственный значок в панели задач.

Выбор типа подключения: Application против COMConnector

Прежде всего, проанализируем разницу в способах подключения. Для работы с интерфейсом (открытия форм) необходимо использовать объект V82.Application (или V83.Application). В отличие от V82.COMConnector, который предназначен для фоновой работы с данными без создания графического интерфейса, Application запускает полноценный экземпляр программы. Рассмотрим стандартный код инициализации соединения:


СтрокаПодключения = "File=""C:\1C\Base""; usr=""Администратор"";";
База = Новый COMОбъект("V82.Application");
База.Connect(СтрокаПодключения);

Важный момент: если мы устанавливаем свойство База.Visible = Ложь;, то всё главное окно приложения становится невидимым. Это приводит к тому, что любые дочерние окна (формы справочников), открытые в этой сессии, также не будут иметь своего значка в панели задач Windows, так как их родитель скрыт.

Решение проблемы отсутствия значка в панели задач

Выясним причину, почему значок пропадает. В операционной системе Windows отображение в панели задач обычно привязано к главному окну приложения. Если вы хотите, чтобы пользователь видел открытый элемент, нельзя просто скрыть всю базу. Рассмотрим альтернативный подход: вместо Visible = Ложь мы сделаем главное окно видимым, но минимизируем его или переместим за пределы видимости экрана.

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

Как вывести форму поверх всех окон

Часто программисты пытаются использовать методы Форма.Активизировать() или свойство Форма.Visible, но получают ошибку "Поле объекта не обнаружено". Это происходит из-за особенностей проксирования объектов через COM. У объекта типа "Форма" в обычном приложении 1С 8.2/8.3 при обращении через OLE нет свойства Visible. Управление видимостью осуществляется методами Открыть() и Закрыть().

Проанализируем ситуацию: даже если мы вызвали Открыть(), окно может оказаться на заднем плане за окном Альфа-Авто. Чтобы принудительно "поднять" его, воспользуемся объектом WScript.Shell и методом AppActivate. Разберем по шагам, как это реализовать:


// Получаем форму в удаленной базе
Форма = База.Справочники.Контрагенты.НайтиПоКоду("001").ПолучитьФорму();
Форма.Открыть();

// Используем системный скрипт для активации окна по заголовку
Shell = Новый COMОбъект("WScript.Shell");
// В заголовке окна обычно пишется имя элемента и название программы
Shell.AppActivate(Форма.Заголовок); 

Проблема модальных окон при OLE-соединении

Рассмотрим использование метода ОткрытьМодально(). Хотя он и заставляет окно появиться поверх других, его использование в OLE-сессиях крайне рискованно. Если в вызываемой базе произойдет какая-либо ошибка или появится системное предупреждение, модальное окно заблокирует выполнение кода в Альфа-Авто. Пользователь может даже не увидеть это окно, если оно "моргнуло" и ушло на задний план, а основная программа зависнет в ожидании ответа. Поэтому рекомендуем использовать обычный метод Открыть() в сочетании с методами активации окна.

Обход ограничений через WinAPI

Если стандартные средства 1С и WScript.Shell не помогают сделать окно активным (это часто случается в новых версиях Windows из-за защиты от "кражи фокуса"), можно использовать вызов функции SetForegroundWindow. Для этого в 1С можно подключить внешнюю компоненту или использовать возможности скриптовых языков для вызова WinAPI функций. Это гарантированно выведет окно на передний план, даже если оно было свернуто или перекрыто другими приложениями.

Итоги и рекомендации

Для качественной реализации открытия форм через OLE придерживайтесь следующих правил:

  1. Всегда используйте V82.Application, если требуется визуальное взаимодействие.
  2. Не устанавливайте Visible = Ложь для всего COM-объекта, если вам нужно наличие значка в панели задач. Лучше программно управлять видимостью конкретных форм.
  3. Для активации окна используйте WScript.Shell и метод AppActivate, передавая туда точный заголовок формы.
  4. Помните, что через COM-соединение некоторые свойства объектов могут быть недоступны напрямую, поэтому всегда используйте конструкцию Попытка...Исключение при обращении к методам интерфейса.
  5. Проанализируйте возможность использования внешних ссылок (e1cib). В современных версиях это более надежный способ: вы просто формируете навигационную ссылку и запускаете её через ЗапуститьПриложение(). Система сама найдет открытый экземпляр 1С или предложит запустить новый с открытием конкретного объекта.

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

← На главную