Внешняя компонента симуляции нажатий клавиатуры и мыши (в т.ч. сворачивание/разворачивание динамических списков)

13.12.17

Разработка - Разработка внешних компонент

Данная ВК позволяет использовать в ОС Windows начиная с 2000 функцию WinApi - SendInput(). А прилагающаяся обертка на 1С под нее позволяет делать это комфортно и просто. Внешняя компонента была написана, прежде всего, для сворачивания/разворачивания группировок в динамических списках.

Скачать файлы

Наименование Файл Версия Размер
Архив со всем необходимым
.rar 542,30Kb
12
.rar 0.1 542,30Kb 12 Скачать

Краткая предистория:

В свое время очень мучал вопрос сворачивания/разворачивания динамических списков. Ситуацию обостряло тысяча подобных вопросов в гугле и не одного толкового ответа (по крайней мере я не видел).

Проблема тогда была решена здоровенным костылем: запуском скомпилированного скрипта AHK на сочетание Ctrl+Shift+Num-/Num+

Душа терзалась столь неизящным решением и вот наконец дошли руки сделать это чуть лучше и вдобавок слегка расширить функционал 1с.

 

Функционал:

Не буду долго тянуть, вк использует функцию Win Api - SendInput() для симуляции нажатий клавиш клавиатуры/мыши по виртуальным кодам.

Также в вк для удобства добавлена функция паузы и свойство определяющее продолжительность зажатия клавиши.

Для удобства в 1с создана обертка над вк, позволяющая использовать её весьма интуитивно, понятно и максимально просто.

Можно вызывать нажатие клавиши по её имени. Тестировал на Win Server 2012 R2 с Qwerty клавиатурой на 1с 8.3.10.2561. 

 

Примеры использования:

Передаваемые в функции параметры довольно подробно описаны в общем модуле в сопровождении к функциям.
Конфигуратор подскажет, что писать.

Клавиатура.Пауза()

Клавиатура.Свернуть()

Клавиатура.Развернуть()

Клавиатура.ВыполнитьНажатие()

 
 Спойлер

 

Листинг основного функционала общего модуля:

 
 Спойлер

 

Листинг вспомогательного функционала общего модуля:

 
 Спойлер

 

Послесловие:

Во вложении будет архив, в нем: тестовая конфигурация с примерами использования, утилитой для определения кодов клавиш, текстовый файл с ссылкой на вирустотал, xls документ с используемыми соответсвиями названиями и кодами клавиш, листинг общего модуля и собственно сама подключаемая библиотека. Надеюсь хоть комуто смог помочь, также прошу прощения за очепятки и абшибки. Повторюсь, компонента только для OS Windows начиная с 2000 , тоесть, по сути, должна работать только на любой современной Windows оси, в процессе использования она сама откидывает линь, мак, мобильное приложение и браузер, функции возвращают Ложь, вместо Истина. Возможно будет работать через Wine, такого Я не пробывал, не знаю.

ЕСЛИ У ВАС ВОЗНИКЛИ ВОПРОСЫ, С УДОВОЛЬСТВИЕМ ОТВЕЧУ В КОММЕНТАРИЯХ ИЛИ ЛС 

 

UPD 17.10.19

Как мне подсказал в комментариях Сергей Лесовой, для сворачивания/разворачивания дин. списка можно применить более изящное решение:

// Развернуть
Элементы.дСписок.Развернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"), Истина);
// Свернуть 
Элементы.дСписок.Свернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка")); 

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

Компонента, Я полагаю, имеет право продолжать жить для других задач по автоматизации.

 

 

общий модуль клиент внешняя компонента вк библиотека клавиатура динамические списки эмуляция симуляция c++ 1с8

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52120    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26254    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44990    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35092    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    54007    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30846    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4045    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4790    starik-2005    32    

39
Отзывы
12. 🅵🅾️🆇 522 19.10.17 16:31 Сейчас в теме
(10) Протестировал, спасибо, действительно такой код будет много изящнее:

// Развернуть
Элементы.дСписок.Развернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"), Истина);

// Свернуть
Элементы.дСписок.Свернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"));


Сейчас добавлю в темку.
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. eugeniezheludkov 43 19.10.17 02:42 Сейчас в теме
Я за альтернативу и разнообразие.
Вот еще решение от 1С) (сценарное тестирование 2)

WshShellW = Новый COMОбъект("WScript.Shell");
WshShellW.AppActivate(ПолучитьЗаголовокСистемы());

// Команда может состоять из одной буквы
ПозицияОткрывающейСкобки = Найти(ПередаваемыеДанные.СочетаниеКлавиш, "{");
ПозицияЗакрывающейСкобки = Найти(ПередаваемыеДанные.СочетаниеКлавиш, "}");
Если ПозицияОткрывающейСкобки <> 0 Тогда
Если ПозицияЗакрывающейСкобки - ПозицияОткрывающейСкобки - 1 = 1 Тогда
Буква = Сред(ПередаваемыеДанные.СочетаниеКлавиш, ПозицияОткрывающейСкобки + 1, 1);
Буква = ИСТП_ПреобразоватьБуквуВСоответствииСРаскладкой(Буква);
Команда = Сред(ПередаваемыеДанные.СочетаниеКлавиш, 1,ПозицияОткрывающейСкобки) + Буква + Сред(ПередаваемыеДанные.СочетаниеКлавиш, ПозицияЗакрывающейСкобки);
Иначе
Команда =ПередаваемыеДанные.СочетаниеКлавиш;
КонецЕсли;
Иначе
// скобок может и не быть
Команда = ПередаваемыеДанные.СочетаниеКлавиш;
ЕстьКТРЛ = Ложь;
ЕстьАЛЬТ = Ложь;
ЕстьШИФТ = Ложь;
Если Найти(Команда, "^") > 0 Тогда
Команда = СтрЗаменить(Команда, "^", "");
ЕстьКТРЛ = Истина;
КонецЕсли;
Если Найти(Команда, "%") > 0 Тогда
Команда = СтрЗаменить(Команда, "%", "");
ЕстьАЛЬТ = Истина;
КонецЕсли;
Если Найти(Команда, "+") > 0 Тогда
Команда = СтрЗаменить(Команда, "+", "");
ЕстьШИФТ = Истина;
КонецЕсли;

Если СтрДлина(Команда) = 1 Тогда
Команда = ИСТП_ПреобразоватьБуквуВСоответствииСРаскладкой(Команда);

Если ЕстьШИФТ Тогда
Команда = "+" + Команда;
КонецЕсли;

Если ЕстьАЛЬТ Тогда
Команда = "%" + Команда;
КонецЕсли;

Если ЕстьКТРЛ Тогда
Команда = "^" + Команда;
КонецЕсли;
Иначе
Команда = ПередаваемыеДанные.СочетаниеКлавиш;
КонецЕсли;
КонецЕсли;

WshShellW.SendKeys(Команда);
Показать
🅵🅾️🆇; user761890; +2 Ответить
2. 🅵🅾️🆇 522 19.10.17 09:25 Сейчас в теме
3. bulpi 215 19.10.17 11:47 Сейчас в теме
(1)
WshShellW.SendKeys(Команда);
работает не на всех системах, увы.
4. 🅵🅾️🆇 522 19.10.17 12:21 Сейчас в теме
(3) https://ru.wikipedia.org/wiki/Windows_Script_Host

Естественно. Его Я тоже пробывал, но писечка в том, что оно не подошло, тк не скумекал как им симулировать нажатия Num- и Num+, а значит и не смог свернуть динамический список.

Вполне допускаю, что это возможно и хотелось бы услышать ответ от разобравшихся.

Вообще у меня к 1с есть несколько основных притензий:
1) У динамических списков нет родной кнопки и метода для свернуть/развернуть группировки, хотя это можно делать сочетанием клавиш.
2) На управляемых формах можно строить неплохой адаптивный интерфейс, но нельзя нормально в процентном отношении задавать размер элементов.
3) Модуль объекта не существует на клиенте (уж хотяб для обработок можно былоб сделать).
4) У объектов нельзя создавать собственный конструктор и деструктор.
Приходиться делать так а = Обработка.Создать(); а.Конструктор(параметры);
5) Очень хотелось бы увидеть инкремент и декримент хотяб.
А то Счетчик = Счетчик + 1; - не комильфо писать :3
Это очень странно, тк С++ вполне позволяет использовать перегрузки.
6) Из общего модуля клиента нельзя нормально вызывать модуль сервера.

Прошу прощения, за то, что излил свою попаболь)))
14. eugeniezheludkov 43 20.10.17 02:28 Сейчас в теме
(3) компонента автора так же работает не на всех системах , поэтому я и привел пример с сендкейсом, более того я не вчитывался какую проблему решал автор, каюсь.
(4) эх тоже хотелось бы всех этих ООП штучек в 1С, но тогда будет риск превращения 1С в Microsoft Dynamics AX. по слухам бизнес, что успел подсесть на аксапта избавляется от нее и переводят учет на 1С по причинам: 1. В Аксапте разработка фич ведется дольше чем в 1С. 2. Дорогостоящие и труднонаходимые специалисты по сравнению с адынесниками
🅵🅾️🆇; +1 Ответить
5. Synoecium 778 19.10.17 13:54 Сейчас в теме
Что-то не понял насчет сворачивания/разворачивания, чем вариант вызвать такой код не подошел:
Элементы.Список.Развернуть(Элементы.Список.ТекущаяСтрока,Истина);
Элементы.Список.Свернуть(Элементы.Список.ТекущаяСтрока);
6. 🅵🅾️🆇 522 19.10.17 13:58 Сейчас в теме
(5)
Я может чего и упускаю, но это работает только для обычных таблиц, но никак не для динамических списков.

Если ошибаюсь или чегот добавили - был бы благодарен за предоставленный пример. Я не представляю, как можно получить "Идентификатор строки таблицы." у динамического списка. У него же нельзя перебирать содержимое, а значит не выйдет перебрать все и все свернуть. Самый максимум, что позволяет - по клику сворачивать текущую группировку.

Опять же, поправьте если не прав и ошибаюсь.
8. Synoecium 778 19.10.17 14:29 Сейчас в теме
(6) ну вот те строки кода, которые написал в (5), это доработка для конфигурации ITIL, там список задач сделан через динамический список с запросом, и этот код позволяет сворачивать/разворачивать подчиненные задачи. Возможно не сработает если в динамическом списке не указана основная таблица, особо не ковырялся в этом направлении.
Прикрепленные файлы:
9. 🅵🅾️🆇 522 19.10.17 14:35 Сейчас в теме
(8) Тоесть, чтоб свернуть такой список

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

Вам надо: (a) тыкнуть на "Задачи", а затем (б) нажать кнопку которая вызовет ваш код (ну или разместить код в "ПриАктивизацииСтроки/Поля/Ячейки") и это свернет только данную группировку. Это не есть очень удобно, к томуже у вас может быть не 1 родительская группировка, а несколько.

Попробуйте погуглить по "свернуть динамический список 1с", увидите насколько остро стоит проблема у многих людей.
10. Synoecium 778 19.10.17 16:15 Сейчас в теме
(9) Ну если нужно свернуть все задачи, то достаточно передать пустую ссылку в метод Свернуть(), даже активизировать ничего не нужно. В принципе можно даже сворачивать на любое количество уровней вверх, при условии что у вас в динамическом списке основной назначена таблица с иерархией. Набросал пример для 1С:Документооборот ну или любой конфигурации, где есть справочник ПапкиФайлов, в нем продемонстрировано то, о чем писал.
Прикрепленные файлы:
тестСвернутьРазвернуть.epf
🅵🅾️🆇; +1 Ответить
11. 🅵🅾️🆇 522 19.10.17 16:25 Сейчас в теме
(10)
Сейчас детально посмотрю, в коде не обязательно ломиться на сервер:
Элементы.ДинСписок.Развернуть(ПолучитьПустуСсылкуНаСервере(),Истина);

Должно быть достаточно:
Элементы.ДинСписок.Развернуть(ПредопределенноеЗначение("Справочник.ПапкиФайлов.ПустаяСсылка"),Истина);
12. 🅵🅾️🆇 522 19.10.17 16:31 Сейчас в теме
(10) Протестировал, спасибо, действительно такой код будет много изящнее:

// Развернуть
Элементы.дСписок.Развернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"), Истина);

// Свернуть
Элементы.дСписок.Свернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"));


Сейчас добавлю в темку.
13. Synoecium 778 19.10.17 16:45 Сейчас в теме
(12) ну я не парился с качеством, просто показал принцип :)
а так да, лучше лишний раз на сервер не нырять
🅵🅾️🆇; +1 Ответить
7. nytlenc 19.10.17 14:24 Сейчас в теме
15. lunjio 66 20.02.18 13:38 Сейчас в теме
Компонента по какой технологии написано, ответьте пожалуйста.
16. 🅵🅾️🆇 522 20.02.18 14:30 Сейчас в теме
(15) Это внешняя компонента, написана на плюсах, за основу брал пример от 1с.
Использует Win Api.

Примеры использования в публикации, вроде, были.

Если вам очень хочется попробывать, но нет/жаль стартмани - пишите в ЛС, отдам за спасибо, Я не жадина)
Тоже касается и сорцев, если у Вас есть человек, который сечет во внешних компонентах и С++, там нет ничего сверхестественного.

Моя телега, на всякий: @FoxWithBox
17. lunjio 66 20.02.18 17:05 Сейчас в теме
Спасибо за ответ, изначально не увидел в текстах кода с инициализацией, потом нашел и вопрос отпал, она по технологии Native ) В компонентах сам секу, на C# могу писать, на C++ для меня трудно, времени нету изучить его, шаблон даже есть где-то внешней на C#, только вот по технологии com помоему, а мне Native нужна. ) Спасибо за отзывчивость.
18. unknown181538 151 07.08.18 01:33 Сейчас в теме
Что-то не работают оба варианта... у меня динамический список документов... вставляю разворот в процедуру ПриОткрытии() а открывается все равно свернуто...
19. 🅵🅾️🆇 522 07.08.18 11:15 Сейчас в теме
(18) Попробуй через обработчик ожидания.
"При открытии" подключи.

Но перед глазами сейчас 1с'ки нет.
20. unknown181538 151 09.08.18 16:23 Сейчас в теме
(19) Да, получилось в итоге с помощью ВК и обработчика ожидания.
21. 🅵🅾️🆇 522 09.08.18 18:37 Сейчас в теме
(20) Рад, что мои набитые шишки кому то помогают :3
22. andryandry 94 20.02.19 17:59 Сейчас в теме
Я разворачиваю все группы Динамического списка так

Для каждого стр из Элементы.ДинСписок.ВыделенныеСтроки цикл
Элементы.ДинСписок.Развернуть(стр, истина);
Конеццикла;
23. 🅵🅾️🆇 522 20.02.19 18:02 Сейчас в теме
(22)

Спасибо, собственно проблема была в том, чтоб развернуть и свернуть корень, а не выделенные строки.

Это решается таким способом:
// Развернуть
Элементы.дСписок.Развернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"), Истина);

// Свернуть
Элементы.дСписок.Свернуть(ПредопределенноеЗначение("Справочник.СпрИмя.ПустаяСсылка"));


Собственно я тогда был мал, глуп и неопытен :3
24. andryandry 94 21.02.19 08:57 Сейчас в теме
(23) ну ВК написать - не так мал ))
25. unknown181538 151 27.04.20 23:18 Сейчас в теме
(23) Кажется, что так разворачивается только корень, а не все подчиненные, как ВК делала.
Только вот что-то ВК не подключается в 8.3.16, кажется... Или ее нужно вручную регистрировать?
26. unknown181538 151 27.04.20 23:20 Сейчас в теме
(25) аа... наверное, к 64 разрядной платформе не подключается.
27. Amigo_0 06.08.21 14:59 Сейчас в теме
Всем привет))
Если вдруг кому-то пригодится. Программно развернуть / свернуть динамический список с группировкой

Работает на иерархическом списке:

Развернуть:
ОбъектShell = Новый COMОбъект("Wscript.Shell");
ОбъектShell.SendKeys("^+" + Символ(107)); // Символ(107) - "+" на нумпаде

Свернуть:
ОбъектShell = Новый COMОбъект("Wscript.Shell");
ОбъектShell.SendKeys("^+" + Символ(109)); // Символ(109) - "-" на нумпаде
Оставьте свое сообщение