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

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

См. также

Разработка внешних компонент 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 и маркетинг Управленческий учет Платные (руб)

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

18000 руб.

30.05.2017    54131    9    69    

46

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

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

2400 руб.

25.06.2024    1176    3    4    

3

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

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

2400 руб.

04.05.2018    47398    124    66    

67

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

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

4600 руб.

27.06.2023    3657    3    0    

5

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

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

3600 руб.

02.09.2010    77570    72    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    28777    138    100    

91

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

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

14.01.2025    2263    bayselonarrend    14    

48

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

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

04.12.2024    4915    kovalevdmv    26    

75
Отзывы
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 159 07.08.18 01:33 Сейчас в теме
Что-то не работают оба варианта... у меня динамический список документов... вставляю разворот в процедуру ПриОткрытии() а открывается все равно свернуто...
19. 🅵🅾️🆇 524 07.08.18 11:15 Сейчас в теме
(18) Попробуй через обработчик ожидания.
"При открытии" подключи.

Но перед глазами сейчас 1с'ки нет.
20. unknown181538 159 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 159 27.04.20 23:18 Сейчас в теме
(23) Кажется, что так разворачивается только корень, а не все подчиненные, как ВК делала.
Только вот что-то ВК не подключается в 8.3.16, кажется... Или ее нужно вручную регистрировать?
26. unknown181538 159 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) - "-" на нумпаде
Оставьте свое сообщение