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

13.12.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Архив со всем необходимым
.rar 542,30Kb ver:0.1
13
13 Скачать (1 SM) Купить за 1 850 руб.

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

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

Проблема тогда была решена здоровенным костылем: запуском скомпилированного скрипта 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

См. также

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

Внешняя компонента в виде библиотеки (.dll файл), позволяющая посылать команды и получать ответы по протоколу WebSocket из 1С. Компонента работает только на стороне "клиента".

4440 руб.

22.06.2020    18133    18    33    

22

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

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

2400 руб.

04.05.2018    46803    122    66    

66

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

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

3000 руб.

12.05.2020    28234    138    100    

90

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

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    3399    2    0    

4

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

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

1500 руб.

17.09.2018    36484    113    127    

114

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

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

26.01.2024    6791    starik-2005    32    

44

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

Пример взаимодействия 1С с Apach Kafka посредством внешней компоненты, разработанной на основе официальной библиотеки librdkafka (the Apache Kafka C/C++ client library).

22.11.2023    4378    87    ivan1703    26    

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

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

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


Сейчас добавлю в темку.
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. eugeniezheludkov 45 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. 🅵🅾️🆇 524 19.10.17 09:25 Сейчас в теме
3. bulpi 217 19.10.17 11:47 Сейчас в теме
(1)
WshShellW.SendKeys(Команда);
работает не на всех системах, увы.
4. 🅵🅾️🆇 524 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 45 20.10.17 02:28 Сейчас в теме
(3) компонента автора так же работает не на всех системах , поэтому я и привел пример с сендкейсом, более того я не вчитывался какую проблему решал автор, каюсь.
(4) эх тоже хотелось бы всех этих ООП штучек в 1С, но тогда будет риск превращения 1С в Microsoft Dynamics AX. по слухам бизнес, что успел подсесть на аксапта избавляется от нее и переводят учет на 1С по причинам: 1. В Аксапте разработка фич ведется дольше чем в 1С. 2. Дорогостоящие и труднонаходимые специалисты по сравнению с адынесниками
🅵🅾️🆇; +1 Ответить
5. Synoecium 786 19.10.17 13:54 Сейчас в теме
Что-то не понял насчет сворачивания/разворачивания, чем вариант вызвать такой код не подошел:
Элементы.Список.Развернуть(Элементы.Список.ТекущаяСтрока,Истина);
Элементы.Список.Свернуть(Элементы.Список.ТекущаяСтрока);
6. 🅵🅾️🆇 524 19.10.17 13:58 Сейчас в теме
(5)
Я может чего и упускаю, но это работает только для обычных таблиц, но никак не для динамических списков.

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


Собственно я тогда был мал, глуп и неопытен :3
24. andryandry 100 21.02.19 08:57 Сейчас в теме
(23) ну ВК написать - не так мал ))
25. unknown181538 158 27.04.20 23:18 Сейчас в теме
(23) Кажется, что так разворачивается только корень, а не все подчиненные, как ВК делала.
Только вот что-то ВК не подключается в 8.3.16, кажется... Или ее нужно вручную регистрировать?
26. unknown181538 158 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) - "-" на нумпаде
Оставьте свое сообщение