При интеграции различных конфигураций 1С, например, Альфа-Авто и УПП, часто возникает необходимость открывать карточки справочников или документы из одной базы в другой. Использование OLE-соединения (COM-технологии) является классическим методом для решения этой задачи. Однако разработчики часто сталкиваются с тем, что открываемые формы "теряются": они либо открываются внутри свернутого главного окна вызываемой базы, либо не отображаются в панели задач (трее), что крайне неудобно для конечного пользователя. Разберем подробно, как решить эти проблемы и добиться того, чтобы формы открывались поверх всех окон и имели собственный значок в панели задач.
Прежде всего, проанализируем разницу в способах подключения. Для работы с интерфейсом (открытия форм) необходимо использовать объект 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-сессиях крайне рискованно. Если в вызываемой базе произойдет какая-либо ошибка или появится системное предупреждение, модальное окно заблокирует выполнение кода в Альфа-Авто. Пользователь может даже не увидеть это окно, если оно "моргнуло" и ушло на задний план, а основная программа зависнет в ожидании ответа. Поэтому рекомендуем использовать обычный метод Открыть() в сочетании с методами активации окна.
Если стандартные средства 1С и WScript.Shell не помогают сделать окно активным (это часто случается в новых версиях Windows из-за защиты от "кражи фокуса"), можно использовать вызов функции SetForegroundWindow. Для этого в 1С можно подключить внешнюю компоненту или использовать возможности скриптовых языков для вызова WinAPI функций. Это гарантированно выведет окно на передний план, даже если оно было свернуто или перекрыто другими приложениями.
Для качественной реализации открытия форм через OLE придерживайтесь следующих правил:
Visible = Ложь для всего COM-объекта, если вам нужно наличие значка в панели задач. Лучше программно управлять видимостью конкретных форм.AppActivate, передавая туда точный заголовок формы.Попытка...Исключение при обращении к методам интерфейса.ЗапуститьПриложение(). Система сама найдет открытый экземпляр 1С или предложит запустить новый с открытием конкретного объекта.Соблюдение этих инструкций позволит сделать работу пользователей в связке нескольких информационных баз удобной и бесшовной, исключая ситуации с "потерянными" окнами в трее.