Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

определить нажатие CapsLock

определить нажатие CapsLock
Я
   igel1969
 
22.05.20 - 16:41
Здравствуйте!

Так и не нашлось нормального способа определить нажатие CapsLock?
Здесь уже была ветка, но мне результат оттуда не подходит - на сервере терминала никто не будет устанавливать MS Office только для того, чтобы определить CapsLock.
 
 
   igel1969
 
1 - 22.05.20 - 16:41
(0) 1с 8.2
   igel1969
 
2 - 22.05.20 - 16:52
Я пытался сделать так:

        КЛ = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "КапсЛок", Истина, );
    КЛ.Видимость = Истина;
    КЛ.Доступность = Истина;
    КЛ.Ширина = 100;
    КЛ.Высота = 10;
    КЛ.Лево = 10;
    КЛ.Верх = 10;
    ЭтаФорма.ТекущийЭлемент = КЛ;
    Shell = Новый ComОбъект("WScript.Shell");
        Shell.SendKeys("к");
    Сообщить(КЛ.Значение);

Но оно не успевает присвоить значение. Т.е. Shell.SendKeys отрабатывает позднее, чем в процедуре доходит до следующего оператора.
Делать паузу в секунду? я считаю это маразм (((((
   Волшебник
 
3 - 22.05.20 - 16:53
зачем всё это?
   igel1969
 
4 - 22.05.20 - 16:54
я даже вот так попытался, но оно зависло:

        КЛ = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "КапсЛок", Истина, );
    КЛ.Видимость = Истина;
    КЛ.Доступность = Истина;
    КЛ.Ширина = 100;
    КЛ.Высота = 10;
    КЛ.Лево = 10;
    КЛ.Верх = 10;
    ЭтаФорма.ТекущийЭлемент = КЛ;
    Shell = Новый ComОбъект("WScript.Shell");
    Shell.SendKeys("к");
    
    Пока СтрДлина(КЛ.Значение) < 1 Цикл
    КонецЦикла;
    
    Сообщить(КЛ.Значение);
   igel1969
 
5 - 22.05.20 - 16:54
(3) затем что сканер QR-кодов подключен как клавиатура. Устанавливать на каждую из 120 торговых точек сканер через драйвер 1С не советовать - не хочу.
   Волшебник
 
6 - 22.05.20 - 16:55
метод IsKeyLocked(Keys.Capital) для CapsLock, Keys.Numlock для NumLock.
   igel1969
 
7 - 22.05.20 - 16:56
отъеду на два часа, в больницу надо. извините кому не ответил
   igel1969
 
8 - 22.05.20 - 16:57
(6) где такой метод?
   Волшебник
 
9 - 22.05.20 - 16:58
(8) System.Windows.Forms.Control
   Волшебник
 
10 - 22.05.20 - 17:02
   mistеr
 
11 - 22.05.20 - 18:53
(5) А не проще поискать ШК в двух регистрах?
   Ненавижу 1С
 
12 - 22.05.20 - 18:55
(7) ну еще не забудьте, не только КапсЛок, но и разные раскладки клавиатуры
   Garykom
 
13 - 22.05.20 - 19:11
(0) ВК
   igel1969
 
14 - 22.05.20 - 22:18
(12) знаете, разные раскладки проще. QR-код очень большой и вероятность что он будет состоять только из букв и спецсимволов очень мала, я не беру в учет эту вероятногсть. Я просто анализирую его на наличие русских букв - если хоть одна есть - то действую исходя из принципа что раскладка русская.
   igel1969
 
15 - 22.05.20 - 22:20
(11) не ШК, а QR-код. Мне надо его передавать в Честный знак, а не для поиска в свой базе данных. И передавать надо его правильно. Так что перевод всей строки в большой или малый регистр, как в случае поиска, не подойдет. Нужно чтобы большие буквы были большими, а маленькие маленькими, а не наоборот, как если бы был включен CapsLock
   igel1969
 
16 - 22.05.20 - 22:20
(10) Спасибо, завтра посмотрю.
   igel1969
 
17 - 22.05.20 - 22:21
(13) а почему не ПЖ?
   NorthWind
 
18 - 23.05.20 - 11:07
(17) В 1С нет штатных методов работы с клавиатурой на низком уровне. Поэтому задача достаточно непростая. Вам нужна внешняя компонента (ВК), которая будет написана на другом языке и будет это делать. Либо, если не хотите компоненту, то есть два типа костылей. Первый это VBS и тогда разбираться, почему у вас не пошло (4). Второй это применение .Net-классов в 1С, тогда искать статьи участника с ником Serginio1 и далее присобачивать то, что написано в (9) и (10).
   m1_1976
 
19 - 23.05.20 - 11:21
(14) ну если проверка на русские буквы так - то и делайте проверку на КАПС также.
Есть в строке есть и маленькие и большие буквы! - то все ок.
Если все буквы большие (или АНТИ КАПС ЛУК - все буквы маленькие /почти шутка/)  - принимаем, что "Вероятность такой марки" = 0. И шлем всех юсеров переключать режим.
   Волшебник
 
20 - 23.05.20 - 11:28
(18) А может поставить драйвер и включить сканер нормально, через COM-порт?
   m1_1976
 
21 - 23.05.20 - 11:34
(20) в (5) написано 120 точек - и "НЕ ХОЧУ"
   trdm
 
22 - 23.05.20 - 11:36
Библиотека dynwrap.dll и вызов функций Win 32 API
................
Определение состояния NumLock
Функция GetKeyState (библиотека user32) получает состояние заданной виртуальной клавиши на момент получения от неё последнего сообщения о вводе.

GetKeyState (ByVal nVirtKey As Long) As Integer

Возвращаемое значение: бит 0 равен 1 для клавиш-переключателей (CapsLock, NumLock и ScrollLock), если клавиша находится во включённом состоянии. Бит 15 равен 1, если клавиша нажата, и 0, если клавиша отпущена.

Приведённый ниже скрипт включает NumLock, если он выключен. Если пользователь удерживает клавишу в момент запуска скрипта, скрипт не производит никаких действий.



Const VK_NUMLOCK = &H90
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "USER32.DLL", "GetKeyState", "i=l", "f=s", "r=l"
res = Wrap.GetKeyState(VK_NUMLOCK)
If res = 0 Then
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.SendKeys "{NUMLOCK}"
End If
   Волшебник
 
23 - 23.05.20 - 11:43
(21) да он лодырь...
   Garykom
 
24 - 23.05.20 - 11:50
(22) Мне осень интересно как это взлетит в последних виндах
Судя по https://script-coding.com/dynwrap.html
   Garykom
 
25 - 23.05.20 - 11:51
   m1_1976
 
26 - 23.05.20 - 12:03
(23) Не... у меня, например, 28 точек. Если надо все объехать. Вдруг. (бывает такое). Это по 2-3 часа на точку. Это 3-4 точки в день. Это 7 - 8 дней.
Для меня всегда это жуть - жуткая :)
Понятно, что эта задача делается подключением к магазину  по удаленке. Но даже тут если на каждый магазин по 30 минут. Это 60 часов.
Это те же самые 7-8 дней!!!
   Волшебник
 
27 - 23.05.20 - 12:05
(26) Значит надо сначала автоматизировать админку, например, изучить политики.
   vde69
 
28 - 23.05.20 - 12:17
(27) это-же работать надо, представляешь 28 точек и в каждой админка, вспотеть можно :)
   NorthWind
 
29 - 23.05.20 - 12:19
(20) это разумнее всего. Но их бин не хочут.
   NorthWind
 
30 - 23.05.20 - 12:33
(28) так бывает, когда принято изначально неверное решение... Есть такая русская поговорка - сама себя раба бьет, когда хреново жнет.
 
 Рекламное место пустует
   Вафель
 
31 - 23.05.20 - 17:16
храни значение в верхнем регистре
и при поиске к верхнему приводи
   NorthWind
 
32 - 23.05.20 - 17:19
(31) та ему не надо ничего никуда приводить. Ему это надо отдавать на чужой сервис, и важно чтобы последовательность ушла так, как она забита в коде. Иначе тот же криптохвост отвалится, не пройдет проверку.
   Вафель
 
33 - 23.05.20 - 17:21
так вроде у марок регистр не имеет значения
   NorthWind
 
34 - 23.05.20 - 21:32
(33) черт его знает, там законодательство быстрое как понос, но вот тут https://sbis.ru/help/data_exchange/marking/info/kod_mark описан пример для обуви
0104610028400094↔21HZkP7pqit46Yax1D↔91ffd0↔
Криптохвост содержит и строчные, и прописные буквы, и судя по его виду, приводить к прописным явно не стоит.
   NorthWind
 
35 - 23.05.20 - 21:35
человек вроде в (15) пишет про Честный знак, а не про ЕГАИС, поэтоу если имеются в виду акцизные марки, то это не вполне в тему.
   Garykom
 
36 - 23.05.20 - 21:37
(34) Проблема что внутри DM маркировки нету идентификатора по которому можно было бы понято в какой раскладке и с каким регистром прилетело и переконвертить на 1С.

Было бы в начале нечто вроде "MD" тогда если прилетело "ьв" понятно что кириллица с капсом
   Ёпрст
 
37 - 23.05.20 - 21:51
(0)
Будь проще, по аналогии с акцизной маркой в алкашке, переводи все символы шк сам в верхний регистр и все символы в англ. расскладку, тип того:
функция ПеревестиРаскладку(см) 
    а = вРег(см);
    стрРус = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";
    стрЛат = "QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.";
    итСтр = "";
    для ее = 1 по стрДлина(см) цикл
        поз = найти(стрРус,сред(а,ее,1));
        если поз>0 тогда
            итСтр = итСтр+сред(стрЛат,поз,1);
        иначе
            итСтр =итСтр+сред(а,ее,1);
        конецЕсли;
    конецЦикла;
    возврат СокрЛП(итСтр);
конецФункции


   NorthWind
 
38 - 23.05.20 - 22:02
(36) блин, я, может, ошибаюсь конечно, но смотря на то что в (34) мне кажется что там в этом хвосте юзаются полноценные 7 бит. Поэтому ни о каком приведении к регистру не может быть и речи. Их и так заставили сократить длину хвоста, значит, будут юзать биты по максимуму.
   Garykom
 
39 - 23.05.20 - 22:02
(37) "3. Серийный номер
Байты [9:21] (13 байт) - Serial
Serial содержит в себе цифры, заглавные и строчные буквы латинского алфавита. "

Нельзя терять регистр символов он важен.
Serial "AAAaaa.." <> "AAAAAA..."
   NorthWind
 
40 - 23.05.20 - 22:04
мне пока еще маркировка не очень нужна, но вы заставляете меня все это читать и изучать. Может, пригодится потом. Спасибо.
   Ёпрст
 
41 - 23.05.20 - 22:06
(39) Да ? ну хотя бы расскладку переведёт :)
А так, тогда только активикс на форму и там что угодно ловить в нём
   NorthWind
 
42 - 23.05.20 - 22:12
(41) эмуляция COM-порта полностью спасет отца русской демократии. С этого надо ему было и начинать.
   Garykom
 
43 - 23.05.20 - 22:13
(41) И раскладку не переведет потому что в DM по ECC 200 расширенная таблица ASCII
https://www.gs1.org/docs/barcodes/GS1_DataMatrix_Guideline.pdf

Короче внутри нет кодовой страницы да можно символы 128-255 использовать для кириллицы или иной национальной кодировки.
Только хз как система это трансформирует.

Короче в DM корректно использовать только латиницу заглавные/строчные и некоторые дополнительные символы и все.
   Garykom
 
44 - 23.05.20 - 22:13
(42) Угу
   Ёпрст
 
45 - 23.05.20 - 22:14
Не .. 8-ка еще сыровата.
То ли дело клюшки, там GetKeyState реализовано в 1cpp.
:))
   Garykom
 
46 - 23.05.20 - 22:14
   Garykom
 
47 - 23.05.20 - 22:16
(45) Идиоты те кто решил маркировку делать на DataMatrix вместо QR кодов.
Наравне с дебилами которые до этого разные PDF417 и Aztec Code для ЕГАИС и прочего внедряли.
   Garykom
 
48 - 23.05.20 - 22:17
(47)+ Имхо QR коды двухмерные лучше всего.
Достаточно было прописать нормальный стандарт кодирования и версионировать его с признаком.
   Garykom
 
49 - 23.05.20 - 22:18
(48)+ Типа если внутри начинается "MC01.." - маркировка версия 1 и т.д.
   Ёпрст
 
50 - 23.05.20 - 22:18
(47) это точно, PDF417 это полный ПЭ
   Garykom
 
51 - 23.05.20 - 22:18
(49)+ Хотя можно просто JSON внутрь писать кстати
   Ёпрст
 
52 - 23.05.20 - 22:24
Раньше тоже все сканёры в ком пихал, последнее время, в топку, только в разрыв клавы. Умаешься объяснять товарищам на складе, почему сканер васи не работает если его просто воткнуть куда то еще.. Хотя, в некоторых местах без эмуляции ком не обойтись :( Там тупо сканер чуть ли не скотчем примотан, чтоб не выдрали :)
   spectre1978
 
53 - 23.05.20 - 22:28
(52) эмуляция клавы в нулевых вылезла в основном из-за того что интенсивно юзался rdp, а там штатно просрочка компотов работала плохо. А так-то понятно, что компот лучше по всем параметрам...
   spectre1978
 
54 - 23.05.20 - 22:29
* проброска
   Сияющий в темноте
 
55 - 24.05.20 - 01:12
правильный сканер умеет понимать,что включен capslock и передавать символы корректно.
что касается rdp,то там проблема в том,что на клиенте и на сервере могут быть разные положения capslock,и вот как раз серверное положение сканер не знает.
однако,сканер шлет правильные нажатия клавиш,которые можно получить через чтение потока сырого ввода.
   Salimbek
 
56 - 24.05.20 - 07:57
(0) Если самый простой способ - то:
1) У тебя где-то в базе хранятся номера марок (считаем, что по ППР - без криптохвоста)
2) Считываешь очередной ДМ - вырезаешь это самое начало без криптохвоста и ищешь в базе. Как нашел - то сравниваешь - есть ли нажатие Капс-а или нет.
3) Если понимаешь, что марка некорректна, то сбрасываешь Капс, очищаешь поле и говоришь пользователю прочитать марку заново.

Минусы в том, что начальная часть может быть только из заглавных символов и тогда опознать нажатие строго не получится.
Но если код сформирован по принципу (34), т.е. в коде есть 91ffd0 или что-то похожее строго в нижнем регистре, то можно ловить эту часть ДМ и по ней определять и раскладку и нажатие Капс
   NorthWind
 
57 - 24.05.20 - 09:08
(47) вообще-то DM является стандартом GS1 для таких целей. Поэтому марка получилась международная, насколько я понимаю, при чтении этого DM юнискановским приложением вроде iGepir вы получите информацию о производителе и прочих AI, которые там в нем присутствуют. Если бы вместо этого сделали QR-код, то это была бы местечковая марка, которая читалась бы только специально написанным для этого приложением, как, собственно, и имеет место с акцизками.
   Garykom
 
58 - 24.05.20 - 10:22
(57) Уй там. GS1 да, но внутри свой формат со своими разделителями и данными - ниуя iGepir без доработки под местечковые придумки РФ не покажет.
Точно так же можно допилить iGepir под QR с придумками местечковыми.
   NorthWind
 
59 - 24.05.20 - 10:44
(58) хм... наши такие кривые? Я тут не поленился и нашел свою старую тему, вот: Маркировка лекарств по-турецки. Там есть то же самое, но турецкое, и фотку достаточно четкую я тогда сделал. Так проверил сейчас айгепиром - и все отлично читается...
   NorthWind
 
60 - 24.05.20 - 10:47
AI21 у них тоже есть, но он существенно проще и состоит из одних цифр. Интересно, там эти штуки тоже за бабло выдаются или все-таки нет?
   igel1969
 
61 - 24.05.20 - 22:36
Спасибо всем, дававшим советы. Основываясь на них я сделал следующее:
скачал и зарегистрировал на терминальном сервере компоненту dynwrap.dll
Качал отсюда: https://www.script-coding.com/dynwrap.html версию для NT.
Поскольку у меня 64-система, то пришлось ее (dll-ку) копировать в папку C:\Windows\SysWOW64,
а в папке system32 она регистрироваться не хотела.
ну, запустил командную строку от имени администратора, набрал
regsvr32 C:\Windows\SysWOW64\dynwrap.dll
Это я так подробно даю инструкцию, чтобы другим не мучаться.

    Процедура ОтключитьКапсЛок()
    Врап = Новый COMОбъект("DynamicWrapper");
    Врап.Register("USER32.DLL", "GetKeyState", "i=l", "f=s", "r=l"); 
    res = Врап.GetKeyState(20);
    Если res = 1 тогда
        WshShell = Новый COMОбъект("WScript.Shell");
        WshShell.SendKeys("{CAPSLOCK}");
    КонецЕсли;
    КонецПроцедуры

Обратите внимание, что код клавишы КапсЛок равен 20, это я нагуглил сам.
А если бы речь шла о НумЛоке, то код был бы 144.
   Сияющий в темноте
 
62 - 24.05.20 - 22:46
еще полезно не забыть,что в терминале встречается западание shift,что дает похожий на CapsLock эффект,но простым способом не обнаруживается.
   igel1969
 
63 - 24.05.20 - 22:47
Теперь по поводу того что я лентяй:
Во-первых, действительно, лень везде ставить драйвера, настраивать их правильно.
120 точек - это же не просто 120 раз поставить, а не забывать ставить каждый раз пир открытии новой точки,
а это почти каждую неделю (я не говорю что количество точек стремительно растет, какие-то и закрываются).
Вот как это происходит с кассой -
надо поставить драйвер на локальный компьютер, настроить драйвер на RDP под данным пользователем,
настроить драйвер в 1С для данного пользователя. Видите - три кутерьмы для одной точки?
Теперь - точка работает по RDP через мобильный (флешечный) интернет. Как только у точки прерывается связь
(а причин для обрыва связи тыщща - от вины мобильного оператора, до того что продавщица пузом флешку сковырнула),
так сразу связь с кассой через все эти драйвера теряется. Ладно, я написал процедурку и повесил ее на горячей
клавише для воссоединения связи с кассой. Ладно - касса вещь супернужная и когда она не печатает чек - то продавцу
сразу понятно, что что-то неисправно и первое что она сделает (если есть мозги, а это процентов у 20 из всех продавщиц)
это попытается восстановить связь с помощью моей горячей клавиши.
А теперь представим что связь потерялась со сканером. Это мне ще еодни гемморой, в два раза больше звонков?
А некоторые продавщицы просто забьют на сканирование, а потом через неделю скажут на голубом глазу: "а что, сканер же не работает"
В общем, мне эти танцы с драйверами в 1С нафиг не нужны. Я уж лучше через разрыв клавиатуры все запрограммирую.
Поверьте - так удобнее. Тут большинство программеров в вакууме сидит, в своих программистских фирмочках коды кропаете,
а жизни реальной не знаете. Каждый раз когда на заре внедрения 1С (6 лет назад) пыталсь таких 1С-ников приглашать из всяких
контор типа 1СРарус и им подобных - ни бе, ни ме, как бараны, ничего не знают как торговля устроена, никакого толка от них не было ни разу.
   igel1969
 
64 - 24.05.20 - 22:48
(62) не сталкивался с подобным
   spectre1978
 
65 - 25.05.20 - 05:53
(63) сейчас вам скажут что полный онлайн для магазинов дрянь дело и надо было делать автономные армы кассиров и обмен.
   Комрад1
 
66 - 25.05.20 - 06:49
(65) Сам поймет, когда ещё сотня новых магазинов откроется.
 
 Рекламное место пустует
   igel1969
 
67 - 25.05.20 - 07:22
(65) (66) Да, да, 120 обменов и следить чтобы все вовремя обменялись. Это я уже проходил в другой фирме 7 лет назад с 28 магазинами - пришлось брать специального человека на обмены, чтобы следил и помогал продавцам. сами они даже комп выключить неспособны зачастую. не то что продавцы, даже кураторы торговых точек (а они по сути должны быть толковыми) - когда торговая точка закрывается, возвращают оборудование, а там как правило всегда незакрытая кассовая смена. и хоть кол о башку теши им. также и обмениваться будут - через раз, только когда им это надо (товар пришел). а уж вечером то точно - все домой спешать, не дожидаются когда компьютер сам завершит работу, сразу из розетки выдергивают. так что автоматический обмен тоже не катит. я 17 лет в торговле, знаю о чем говорю. каждое утро (и сегодня не исключение) кто-нибудь из продавщиц звонит мне и возмущается - почему не открывается кассовая смена, ведь она вчера сняла отчет. и всегда оказывается что это был только Х-отчет. Цифры же есть, а больше ей и не надо.
   igel1969
 
68 - 25.05.20 - 07:25
(65) и в конце-концов это требование руководства. когда я 7 лет назад пришел в эту фирму - было всего 12 точек (большей частью оптовых) и начальство привыкло иметь информацию о продажах ежесекундно, в режиме онлайн. И не может заставить себя отказаться от этого, хотя сейчас розничных точек больше, чем оптовых, а схема в 1С остается оптовая - реализация товаров и услуг, ПКО.
   NorthWind
 
69 - 25.05.20 - 07:42
(67) кол тесать не надо, надо чтобы был регламент, где прописано что закрытие смены - обязанность продавца, незакрытая смена - определенный минус из премиальной части ЗП. Оговаривается при приеме на работу, предупреждается. Весь подобный геморрой - он всегда из-за того, что непонятно, кто должен выполнять ту или иную работу. Начальство доплачивать не хочет, поэтому норовит "вы как-нибудь так"... В такой ситуации надо смело обострять, писать пояснения, повышать голос, требовать, чтобы была определенность.
Бывает, конечно, и так, что руководство и сотрудники ИТшников вообще не слышат... если это ваш случай, тогда жаль что вы себя так поставили. Можно посоветовать только уволиться.
   Комрад1
 
70 - 25.05.20 - 08:32
(67) :)) Ты просто не понимаешь, что подходы, которые работают на 100 точках, на 300+ точках работать уже не будут.
   igel1969
 
71 - 25.05.20 - 08:36
(24) Windows Server 2008 R2 x 64 - полет нормальный. Разумеется, скачивал версию для NT и копировал ее в папку C:\Windows\SysWOW64,
а не в папку system32
   Garykom
 
72 - 25.05.20 - 08:43
(67) Обмены делать принудительно однократно при включении, и так же принудительно однократно закрывать смену утром если она не была закрыта вечером.

С обменами нет особой проблемы, да RDP удобней для админа но сейчас есть тонкие клиенты которые даже лучше.
   Garykom
 
73 - 25.05.20 - 08:45
(72)+ И кстати всю установку требуемых дров можно делать из 1С, с проверкой перед этим стоят ли.
В силент моде даже обычно можно.
   Ёпрст
 
74 - 25.05.20 - 08:52
(61) GetKeyState("CapsLock") не работает ? Или другая текстовая константа.. всё лучше, чем 20
   igel1969
 
75 - 25.05.20 - 09:13
(74) GetKeyState("{CapsLock}") попробовал - не работает, а без фигурных скобок не пробовал.
там же в примере из (22) видно, что цифровое значение.
   NorthWind
 
76 - 25.05.20 - 09:46
(74)

Перем CapsLockCode;
...
CapsLockCode = 20;
...
GetKeyState (CapsLock);

Все же WinAPI это не 1С, где можно на голубом глазу написать что-нибудь типа "Да+Нет" в качестве параметра. И то это скорее относится к семерке, в восьмерке тоже начали делать по-человечески.
   NorthWind
 
77 - 25.05.20 - 09:46
* GetKeyState (CapsLockCode);
   dezss
 
78 - 25.05.20 - 09:58
(69) +100
   m1_1976
 
79 - 25.05.20 - 11:37
(75) посмотри мое в (19)... топором по яйцам, но в 100% случаев работать будет.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.