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

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 1C:Бухгалтерия Платные (руб)

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

3600 руб.

02.09.2010    77783    73    257    

191

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

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

3000 руб.

12.05.2020    29074    139    100    

92

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

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

1500 руб.

17.09.2018    37130    115    128    

116

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

Внешняя компонента для конвертации PDF файлов в картинки без использования дополнительных программ. Работает на сервере и в тонком клиенте.

2400 руб.

25.06.2024    1312    3    4    

3

Разработка внешних компонент Системный администратор Программист Стажер Бесплатно (free)

Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

14.01.2025    2633    bayselonarrend    14    

48

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

В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.

04.12.2024    5395    kovalevdmv    26    

77

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

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

26.01.2024    7835    starik-2005    40    

47
Отзывы
12. 🅵🅾️🆇 525 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. 🅵🅾️🆇 525 19.10.17 09:25 Сейчас в теме
3. bulpi 217 19.10.17 11:47 Сейчас в теме
(1)
WshShellW.SendKeys(Команда);
работает не на всех системах, увы.
4. 🅵🅾️🆇 525 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 787 19.10.17 13:54 Сейчас в теме
Что-то не понял насчет сворачивания/разворачивания, чем вариант вызвать такой код не подошел:
Элементы.Список.Развернуть(Элементы.Список.ТекущаяСтрока,Истина);
Элементы.Список.Свернуть(Элементы.Список.ТекущаяСтрока);
6. 🅵🅾️🆇 525 19.10.17 13:58 Сейчас в теме
(5)
Я может чего и упускаю, но это работает только для обычных таблиц, но никак не для динамических списков.

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

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

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

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

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

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

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

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


Сейчас добавлю в темку.
13. Synoecium 787 19.10.17 16:45 Сейчас в теме
(12) ну я не парился с качеством, просто показал принцип :)
а так да, лучше лишний раз на сервер не нырять
🅵🅾️🆇; +1 Ответить
7. nytlenc 19.10.17 14:24 Сейчас в теме
15. lunjio 67 20.02.18 13:38 Сейчас в теме
Компонента по какой технологии написано, ответьте пожалуйста.
16. 🅵🅾️🆇 525 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 160 07.08.18 01:33 Сейчас в теме
Что-то не работают оба варианта... у меня динамический список документов... вставляю разворот в процедуру ПриОткрытии() а открывается все равно свернуто...
19. 🅵🅾️🆇 525 07.08.18 11:15 Сейчас в теме
(18) Попробуй через обработчик ожидания.
"При открытии" подключи.

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

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

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

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

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


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