Изначально разрабатывалась как составная часть инструмента тестирования прикладных решений Vanessa Automation, однако имеет самостоятельную ценность и может быть использована с составе других продуктов. Главным достоинством компоненты является возможность получения снимка любого открытого окна 1С, даже если оно перекрыто другими окнами приложений.
Внешняя компонента поддерживает как синхронный, так и асинхронный вызов. Далее по тексту все примеры будут приводиться для синхронных вызовов.
Пример асинхронного вызова внешней компоненты:
&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
ОписаниеОповещения = Новый ОписаниеОповещения("ПолученаВерсияКомпоненты", ЭтотОбъект);
ВнешняяКомпонента.НачатьПолучениеВерсия(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПолученаВерсияКомпоненты(Значение, ДополнительныеПараметры) Экспорт
Заголовок = "Управление окнами, версия " + Значение;
КонецПроцедуры
Для создания объекта экземпляра внешней компоненты используйте имя WindowsControl.
В прилагаемом примере файлы внешней компоненты хранятся в макете _1cWinCtrl.
Реквизит формы МестоположениеКомпоненты используется для передачи макета компоненты между сервером и клиентом.
Установка и подключения внешней компоненты:
&НаКлиенте
Перем ИдентификаторКомпоненты, ВнешняяКомпонента;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МакетКомпоненты = РеквизитФормыВЗначение("Объект").ПолучитьМакет("_1cWinCtrl");
МестоположениеКомпоненты = ПоместитьВоВременноеХранилище(МакетКомпоненты, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИдентификаторКомпоненты = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ВыполнитьПодключениеВнешнейКомпоненты(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПодключениеВнешнейКомпоненты(ДополнительныеПараметры) Экспорт
НачатьПодключениеВнешнейКомпоненты(Новый ОписаниеОповещения(
"ПодключениеВнешнейКомпонентыЗавершение", ЭтаФорма, ДополнительныеПараметры),
МестоположениеКомпоненты, ИдентификаторКомпоненты, ТипВнешнейКомпоненты.Native
);
КонецПроцедуры
&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
Если Подключение Тогда
ВнешняяКомпонента = Новый("AddIn." + ИдентификаторКомпоненты + ".WindowsControl");
ИначеЕсли ДополнительныеПараметры = Истина Тогда
НачатьУстановкуВнешнейКомпоненты(Новый ОписаниеОповещения(
"ВыполнитьПодключениеВнешнейКомпоненты", ЭтаФорма, Ложь), МестоположениеКомпоненты);
КонецЕсли;
КонецПроцедуры
Многие свойства и методы компоненты возвращают сложные типы данных, которые сериализованы в строку формата JSON. Поэтому рекомендуется объявить в вызывающем модуле универсальную функцию, которая будет использоваться ниже в примерах работы компоненты:
&НаКлиенте
Функция ПрочитатьСтрокуJSON(ТекстJSON)
Если ПустаяСтрока(ТекстJSON) Тогда
Возврат Новый Структура;
Иначе
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
Возврат ПрочитатьJSON(ЧтениеJSON);
КонецЕсли;
КонецФункции
Компонента преимущественно предназначена для управления окнами тонкого клиента «1С:Предприятие». Поскольку разрабатывалась она для работы в составе менеджера тестирования, имеется специальный метод для поиска запущенного экземпляра процесса клиента тестирования 1С по номеру порта подключения.
ТекстJSON = ВнешняяКомпонента.НайтиКлиентТестирования(ПортПодключения);
ДанныеJSON = ПрочитатьСтрокуJSON(ТекстJSON);
ИдентификаторПроцесса = ДанныеJSON .ProcessId;
Используя идентификатор процесса, получаем список открытых окон приложения и для каждого окна его снимок. Если формы 1С открываются в режиме «Блокировать окно владельца», то список окон имеет иерархическую структуру, и у каждого элемента списка есть ссылка на идентификатор родительского окна.
НаборСнимковОкон = Новый СписокЗначений;
ТекстJSON = ПолучитьСписокОкон(ИдентификаторПроцесса);
ДанныеJSON = ПрочитатьСтрокуJSON(ТекстJSON);
Для Каждого Стр из ДанныеJSON Цикл
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокОкна(Стр.window);
НаборСнимковОкон.Добавить(ДвоичныеДанные, Стр.title);
КонецЦикла;
В прилагаемом примере файлы внешней компоненты хранятся в макете _1cWinCtrl.
Реквизит формы МестоположениеКомпоненты используется для передачи макета компоненты между сервером и клиентом.
&НаКлиенте
Перем ИдентификаторКомпоненты, ВнешняяКомпонента;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МакетКомпоненты = РеквизитФормыВЗначение("Объект").ПолучитьМакет("_1cWinCtrl");
МестоположениеКомпоненты = ПоместитьВоВременноеХранилище(МакетКомпоненты, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИдентификаторКомпоненты = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ВыполнитьПодключениеВнешнейКомпоненты(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПодключениеВнешнейКомпоненты(ДополнительныеПараметры) Экспорт
НачатьПодключениеВнешнейКомпоненты(Новый ОписаниеОповещения(
"ПодключениеВнешнейКомпонентыЗавершение", ЭтаФорма, ДополнительныеПараметры),
МестоположениеКомпоненты, ИдентификаторКомпоненты, ТипВнешнейКомпоненты.Native
);
КонецПроцедуры
&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
Если Подключение Тогда
ВнешняяКомпонента = Новый("AddIn." + ИдентификаторКомпоненты + ".WindowsControl");
ИначеЕсли ДополнительныеПараметры = Истина Тогда
НачатьУстановкуВнешнейКомпоненты(Новый ОписаниеОповещения(
"ВыполнитьПодключениеВнешнейКомпоненты", ЭтаФорма, Ложь), МестоположениеКомпоненты);
КонецЕсли;
КонецПроцедуры
Подробная инструкция по работе с компонентой доступна на сайте: http://lintest.github.io