Skip to content
lintest edited this page Apr 15, 2020 · 1 revision

1cWinCtrl - внешняя компонента 1С

Предназначена для управления окнами Windows и Linux, разработана по технологии Native API.

Возможности компоненты:

  • Получение списка окон и списка процессов
  • Управление размерами и положением окна
  • Получение снимка окна и снимка экрана
  • Доступ к данным буфера обмена

Свойства

Методы

Работа с процессами:

Информация об окружении:

Управление окном приложения:

Захват изображения экрана:

Работа с буфером обмена:

Расширенный функционал работы с буфером обмена вынесен в объект ClipboardControl.

Общая информация

Внешняя компонента поддерживает как синхронный, так и асинхронный вызов. Для асинхронного вызова в полном соответствии с документацией Синтакс-помощника 1С:Предприятие применяются методы:

  • НачатьВызов<ИмяМетода>(<ОписаниеОповещения>, <Параметры>)
  • НачатьПолучение<ИмяСвойства>(<ОписаниеОповещения>)

Пример асинхронного вызова внешней компоненты:

&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
	ОписаниеОповещения = Новый ОписаниеОповещения("ПолученаВерсияКомпоненты", ЭтотОбъект);
	ВнешняяКомпонента.НачатьПолучениеВерсия(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПолученаВерсияКомпоненты(Значение, ДополнительныеПараметры) Экспорт
	Заголовок = "Управление окнами, версия " + Значение;
КонецПроцедуры	

Далее по тексту все примеры будут приводиться для синхронных вызовов. В публикуемом примере 1cWinCtrl.epf используются только асинхронные вызовы.

Многие свойства и методы компоненты возвращают сложные типы данных, которые сериализованы в строку формата JSON. Поэтому имеет смысл объявить в вызывающем модуле универсальную функцию, которая будет использоваться ниже в примерах работы компоненты:

Функция ПрочитатьСтрокуJSON(ТекстJSON)
	Если ПустаяСтрока(ТекстJSON) Тогда
		Возврат Неопределено;
	Иначе
		ПоляДаты = Новый Массив;
		ПоляДаты.Добавить("CreationDate");
		ЧтениеJSON = Новый ЧтениеJSON();
		ЧтениеJSON.УстановитьСтроку(ТекстJSON);
		Возврат ПрочитатьJSON(ЧтениеJSON, , ПоляДаты);
	КонецЕсли;
КонецФункции

Сборка проекта

Готовая сборка внешней компоненты находится в файле /Example/Templates/_1cWinCtrl/Ext/Template.bin

Порядок самостоятельной сборки внешней компоненты из исходников:

  1. Для сборки компоненты необходимо установить Visual Studio Community 2019
  2. Скачиваем и устанавливаем библиотеку boost
  3. Чтобы работала сборка примера обработки EPF надо установить OneScript версии 1.0.20 или выше
  4. Устанавливаем VirtualBox и разворачиваем в минимальной конфигурации Ubuntu 18.04 или CentOS 8
  5. Устанавливаем на Linux необходимые пакеты (см. ниже) и дополнения гостевой ОС
  6. Подключаем в VirtualBox общую папку с исходными текстами внешней компоненты
  7. В среде Linux для компиляции библиотек запустить ./build.sh
  8. В среде Window для завершения сборки запустить ./compile.bat

Сборка для Linux в CentOS 8:

yum -y group install "Development Tools"
yum -y install cmake glibc-devel.i686 glibc-devel libuuid-devel
yum -y install libstdc++-devel.i686 gtk2-devel.i686 glib2-devel.i686
yum -y install libstdc++-devel.x86_64 gtk2-devel.x86_64 glib2-devel.x86_64
git clone https://github.com/lintest/1cWinCtrl.git
cd 1cWinCtrl
./build.sh

Сборка для Linux в Ubuntu 18.04:

sudo apt update
sudo apt install -y build-essential cmake git
sudo apt install -y gcc-multilib g++-multilib
sudo apt install -y uuid-dev libx11-dev libxrandr-dev libpng-dev
git clone https://github.com/lintest/1cWinCtrl.git
cd 1cWinCtrl
./build.sh

Сборка библотеки boost для Windows

b2.exe toolset=msvc link=static threading=multi runtime-link=static release stage

Установка на VirtualBox дополнений гостевой ОС для Linux:

mkdir -p /media/cdrom
mount -r /dev/cdrom /media/cdrom
cd /media/cdrom
./VBoxLinuxAdditions.run
sudo usermod -a -G vboxsf "$USER"
reboot

Установка и подключение

Для создания объекта экземпляра внешней компоненты используйте имя WindowsControl. В прилагаемом примере файлы внешней компоненты хранятся в макете _1cWinCtrl, реквизит формы МестоположениеКомпоненты используется для передачи макета компоненты между сервером и клиентом. Для установки и подключения внешней компоненты рекомендуется использовать следующий программный код:

&НаКлиенте
Перем ИдентификаторКомпоненты, ВнешняяКомпонента;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	МакетКомпоненты = РеквизитФормыВЗначение("Объект").ПолучитьМакет("_1cWinCtrl");
	МестоположениеКомпоненты = ПоместитьВоВременноеХранилище(МакетКомпоненты, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ИдентификаторКомпоненты = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	ВыполнитьПодключениеВнешнейКомпоненты(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПодключениеВнешнейКомпоненты(ДополнительныеПараметры) Экспорт
	ОписаниеОповещения = Новый ОписаниеОповещения("ПодключениеВнешнейКомпонентыЗавершение", ЭтаФорма, ДополнительныеПараметры);
	НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, МестоположениеКомпоненты, ИдентификаторКомпоненты, ТипВнешнейКомпоненты.Native); 
КонецПроцедуры	

&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
	Если Подключение Тогда
		ВнешняяКомпонента = Новый("AddIn." + ИдентификаторКомпоненты + ".WindowsControl");
	ИначеЕсли ДополнительныеПараметры = Истина Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключениеВнешнейКомпоненты", ЭтаФорма, Ложь);
		НачатьУстановкуВнешнейКомпоненты(ОписаниеОповещения, МестоположениеКомпоненты);
	КонецЕсли;
КонецПроцедуры	

Свойства

Тип значения: Строка (только чтение)

  • Возвращает строку с текстом в формате JSON, при чтении которого получаем объект типа Структура с размерами экрана и рабочей области.

Тип значения: Строка (только чтение)

  • Возвращает строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с размерами дисплеев мониторов.

Тип значения: Строка (только чтение)

  • Возвращает строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с информацией об окнах верхнего уровня: дескриптор окна, диентификатор процесса, владелец, заголовок окна.

Тип значения: Целое число (только чтение)

  • Возвращает идентификатор основного процесса приложения 1С, в сеансе которого вызывается внешняя компонента.

Тип значения: Целое число (чтение и запись)

  • Дескриптор приоритетного окна (окна, с которым пользователь в настоящее время работает).

Тип значения: Строка (чтение и запись)

  • Предоставляет доступ к содержимому буфера обмена в текстовом формате.

Тип значения: Двоичные данные (чтение и запись)

  • Предоставляет доступ к содержимому буфера обмена в формате картинки PNG.
ПотокВПамяти = Новый ПотокВПамяти;
БиблиотекаКартинок.ДиалогИнформация.Записать(ПотокВПамяти);
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
ВнешняяКомпонента.КартинкаБуфераОбмена = ДвоичныеДанные;

Методы

Возвращает текст в формате JSON, при чтении которого получаем объект типа Структура, сотдержащий информацию о клиенте тестирования, найденному по номеру порта, который присутствует в командной строке экземпляра клиента тестирования.

Параметры функции:

  • НомерПорта (обязательный), Тип: Целое число

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Структура с подробной информацией о найденном процессе.
    • ProcessId - идентификатор процесса (Число)
    • CommandLine - командная строка процесса (Строка)
    • CreationDate - дата старта процесса (Дата)
    • Window - дескриптор основного окна (Число)
    • Title - заголовок основного окна (Строка)
ТекстJSON = ВнешняяКомпонента.НайтиКлиентТестирования(ПортПодключения);
СтруктураСвойствПроцесса = ПрочитатьСтрокуJSON(ТекстJSON);
Если СтруктураСвойствПроцесса <> Неопределено Тогда
	ИдентификаторПроцесса = СтруктураСвойствПроцесса.ProcessId;
	ДескрипторОкна = СтруктураСвойствПроцесса.Window;
КонецЕсли;

Получает список запущенных процессов с возможностью отбора только процессов 1С. Отбор производится по наименованию исполняемого файла на соответствие маске "1cv8*".

Параметры функции:

  • ИспользоватьОтбор (обязательный), Тип: Булево

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем типа Массив из элементов типа Структура информацией о процессах.
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокПроцессов(Истина);
Для каждого Стр из ПрочитатьСтрокуJSON(ТекстJSON) Цикл
	НоваяСтр = СписокПроцессов.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяСтр, Стр);
КонецЦикла;

По идентификатору процесса возвращает всю доступную информацию о процессе.

Параметры функции:

  • ИдентификаторПроцесса (обязательный), Тип: Целое число

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Структура с подробной информацией о процессе:
    • ProcessId - идентификатор процесса (Число)
    • CommandLine - командная строка процесса (Строка)
    • CreationDate - дата старта процесса (Дата)
ТекстJSON = ВнешняяКомпонента.ПолучитьСвойстваПроцесса(ИдентификаторПроцесса);
СтруктураСвойстваПроцесса = ПрочитатьСтрокуJSON(ТекстJSON);

Простейшая функция обмена данными по протоколу WebSocket. Может быть использована для интеграции с браузером Google Chrome.

Параметры функции:

  • Адрес (обязательный), Тип: Строка
  • Команда (обязательный), Тип: Строка

Тип возвращаемого значения: Строка

  • Содержит данные, полученные как ответ сервера WebSocket на отправленную команду.
	АдресВебСокет = "ws://localhost:9222/devtools/page/771BF9AF6EE6F712337EF74397960652";
	КомандаJSON = "{""id"":1,""method"":""Page.captureScreenshot"",""params"":{""format"":""png""}";
	ТекстJSON = ВнешняяКомпонента.ВебСокет(АдресВебСокет, КомандаJSON);
	ДанныеJSON = ПрочитатьСтрокуJSON(ТекстJSON);
	ДвоичныеДанные = Base64Значение(ДанныеJSON.result.data);

Подробная информация о Chrome DevTools Protocol доступна по адресу:

Приостанавливает выполнение программного кода на заданное количество миллисекунд.

ВнешняяКомпонента.Пауза(1000);

По дескриптору окна получает список дисплеев, на которых располагается окно или его части.

Параметры функции:

  • ДескрипторОкна (необязательный), Тип: Целое число Если параметр не задан, будет получена информация обо всех дисплеях.

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура со свойствами дисплея: координаты границ, высота и ширина, наименование дисплея, координаты и размер рабочей области дисплея.
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокДисплеев(ДескрипторОкна);
Для каждого ЭлементМассива из ПрочитатьСтрокуJSON(ТекстJSON) Цикл
	ЗаполнитьЗначенияСвойств(СписокДисплеев.Добавить(), ЭлементМассива);
КонецЦикла;

По дескриптору окна получает свойства дисплея, на котором располагается наибольшая часть окна.

Параметры функции:

  • ДескрипторОкна (необязательный), Тип: Целое число Если параметр не задан, будет получена информация для активного окна.

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Структура со свойствами дисплея: координаты границ, высота и ширина, наименование дисплея, координаты и размер рабочей области дисплея.
ТекстJSON = ВнешняяКомпонента.ПолучитьСвойстваДисплея(ДескрипторОкна);
СвойстваДисплея = ПрочитатьСтрокуJSON(ТекстJSON);
ВнешняяКомпонента.УстановитьПозициюОкна(ДескрипторОкна, СвойстваДисплея.Left, СвойстваДисплея.Top);

Возвращает текст в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с информацией об окнах, принадлежащих указанному процессу.

Параметры функции:

  • ИдентификаторПроцесса (обязательный), Тип: Целое число
    • Если параметр нулевой или не задан, возвращается список всех окон.

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с информацией о найденых окнах:
    • Window - дескриптор окна (Число)
    • ProcessId - идентификатор процесса (Число)
    • Class - идентификатор класса окна (Строка)
    • Title - заголовок окна (Строка)
    • Owner - окно владелец (Число)
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокОкон(ИдентификаторПроцесса);
МассивОкон = ПрочитатьСтрокуJSON(ТекстJSON);
ТаблицаОкон.Очистить();
Для каждого Стр из МассивОкон Цикл
	ЗаполнитьЗначенияСвойств(ТаблицаОкон.Добавить(), Стр);
КонецЦикла;

Возвращает текст в формате JSON, при чтении которого получаем объект типа Структура с информацией об основных свойставх окна:

Параметры функции:

  • ДескрипторОкна (обязательный), Тип: Целое число
    • Если параметр нулевой, будут получены свойства активного окна.

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Структура с информацией об основных свойствах окна:
    • Window - дескриптор окна (Число)
    • ProcessId - идентификатор процесса (Число)
    • Maximized - распахнуто, максимизировано (Булево)
    • Class - идентификатор класса окна (Строка)
    • Title - заголовок окна (Строка)
    • Owner - окно владелец (Число)
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокОкон(ИдентификаторПроцесса);
СвойстваОкна = ПрочитатьСтрокуJSON(ТекстJSON);
ЗаголовокОкна = СвойстваОкна.Title;

Возвращает текст в формате JSON, при чтении которого получаем объект объект типа Структура с информацией о размерах и позиции окна.

Параметры функции:

  • ДескрипторОкна (обязательный), Тип: Целое число
    • Если параметр нулевой, будут получены размеры активного окна.

Тип возвращаемого значения: Строка

  • Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Структура с информацией о размерах и позиции окна:
    • Left - левая граница (Число)
    • Top - верхняя граница (Число)
    • Right - правая граница (Строка)
    • Bottom - нижняя граница (Строка)
    • Width - ширина окна (Число)
    • Height - высота высота (Число)
    • Window - дескриптор окна (Число)

Активирует окно по дескриптору.

Параметры функции:

  • ДескрипторОкна (обязательный), Тип: Целое число
ВнешняяКомпонента.АктивироватьОкно(ДескрипторОкна);

Распахиват (максимизирует) окно, разворачивая его на всё рабочую область экрана.

Параметры функции:

  • ДескрипторОкна (обязательный), Тип: Целое число
ВнешняяКомпонента.РаспахнутьОкно(ДескрипторОкна);

Показывает окно в нормальном режиме отображения, если оно было свёрнуто или распахнуто.

Параметры функции:

  • ДескрипторОкна (обязательный), Тип: Целое число
ВнешняяКомпонента.РазвернутьОкно(ДескрипторОкна);

Перемещает позицию курсора (мышки) в указанную точку экрана.

Получает снимок экрана или активного окна, в зависимости от переданного параметра.

Параметры функции:

  • Режим (обязательный), Тип: Целое число
    • 0 - Чтобы сделать снимок всего экрана
    • 1 - Чтобы сделать снимок области активного окна

Тип возвращаемого значения: Двоичные данные

  • Возвращает картинку в формате PNG.
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокЭкрана(0);

Получает снимок произвольного окна по его дескриптору.

Параметры функции:

  • ДескрипторОкна (обязательный), Тип: Целое число
    • 0 - Чтобы сделать снимок активного окна

Тип возвращаемого значения: Двоичные данные

  • Возвращает картинку в формате PNG.
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокОкна(ДескрипторОкна);

Получает снимок верхнего окна экземпляра 1С:Предприятие по идентификатору процесса.

Параметры функции:

  • ИдентификаторПроцесса (обязательный), Тип: Целое число
    • Идентификатор процесса приложения 1С:Предприятие

Тип возвращаемого значения: Двоичные данные

  • Возвращает картинку в формате PNG.
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокПроцесса(ИдентификаторПроцесса);

Очищает буфер обмена.

ВнешняяКомпонента.ОчиститьБуферОбмена();

Внешняя компонента содержит также отдельный класс для работы с буфером обмена. Для создания объекта доступа к буферу обмена используйте имя ClipboardControl.

&НаКлиенте
Перем БуферОбмена;

&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
	БуферОбмена = Новый("AddIn." + ИдентификаторКомпоненты + ".ClipboardControl");
КонецПроцедуры	

Свойства

  • Текст / Text
  • Картинка / Image
  • Файлы / Files
  • Формат / Format
  • Версия / Version

Методы

  • ЗаписатьТекст / SetText
  • ЗаписатьФайлы / SetFiles
  • ЗаписатьКартинку / SetImage
  • Очистить / Empty

При разработке использовались библиотеки:

Clone this wiki locally