Имя: Пароль:
1C
1С v8
определить нажатие CapsLock
,
0 igel1969
 
22.05.20
16:41
Здравствуйте!

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

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

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

        КЛ = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "КапсЛок", Истина, );
    КЛ.Видимость = Истина;
    КЛ.Доступность = Истина;
    КЛ.Ширина = 100;
    КЛ.Высота = 10;
    КЛ.Лево = 10;
    КЛ.Верх = 10;
    ЭтаФорма.ТекущийЭлемент = КЛ;
    Shell = Новый ComОбъект("WScript.Shell");
    Shell.SendKeys("к");
    
    Пока СтрДлина(КЛ.Значение) < 1 Цикл
    КонецЦикла;
    
    Сообщить(КЛ.Значение);
5 igel1969
 
22.05.20
16:54
(3) затем что сканер QR-кодов подключен как клавиатура. Устанавливать на каждую из 120 торговых точек сканер через драйвер 1С не советовать - не хочу.
6 Волшебник
 
22.05.20
16:55
метод IsKeyLocked(Keys.Capital) для CapsLock, Keys.Numlock для NumLock.
7 igel1969
 
22.05.20
16:56
отъеду на два часа, в больницу надо. извините кому не ответил
8 igel1969
 
22.05.20
16:57
(6) где такой метод?
9 Волшебник
 
22.05.20
16:58
(8) System.Windows.Forms.Control
10 Волшебник
 
22.05.20
17:02
11 mistеr
 
22.05.20
18:53
(5) А не проще поискать ШК в двух регистрах?
12 Ненавижу 1С
 
гуру
22.05.20
18:55
(7) ну еще не забудьте, не только КапсЛок, но и разные раскладки клавиатуры
13 Garykom
 
гуру
22.05.20
19:11
(0) ВК
14 igel1969
 
22.05.20
22:18
(12) знаете, разные раскладки проще. QR-код очень большой и вероятность что он будет состоять только из букв и спецсимволов очень мала, я не беру в учет эту вероятногсть. Я просто анализирую его на наличие русских букв - если хоть одна есть - то действую исходя из принципа что раскладка русская.
15 igel1969
 
22.05.20
22:20
(11) не ШК, а QR-код. Мне надо его передавать в Честный знак, а не для поиска в свой базе данных. И передавать надо его правильно. Так что перевод всей строки в большой или малый регистр, как в случае поиска, не подойдет. Нужно чтобы большие буквы были большими, а маленькие маленькими, а не наоборот, как если бы был включен CapsLock
16 igel1969
 
22.05.20
22:20
(10) Спасибо, завтра посмотрю.
17 igel1969
 
22.05.20
22:21
(13) а почему не ПЖ?
18 NorthWind
 
23.05.20
11:07
(17) В 1С нет штатных методов работы с клавиатурой на низком уровне. Поэтому задача достаточно непростая. Вам нужна внешняя компонента (ВК), которая будет написана на другом языке и будет это делать. Либо, если не хотите компоненту, то есть два типа костылей. Первый это VBS и тогда разбираться, почему у вас не пошло (4). Второй это применение .Net-классов в 1С, тогда искать статьи участника с ником Serginio1 и далее присобачивать то, что написано в (9) и (10).
19 m1_1976
 
23.05.20
11:21
(14) ну если проверка на русские буквы так - то и делайте проверку на КАПС также.
Есть в строке есть и маленькие и большие буквы! - то все ок.
Если все буквы большие (или АНТИ КАПС ЛУК - все буквы маленькие /почти шутка/)  - принимаем, что "Вероятность такой марки" = 0. И шлем всех юсеров переключать режим.
20 Волшебник
 
23.05.20
11:28
(18) А может поставить драйвер и включить сканер нормально, через COM-порт?
21 m1_1976
 
23.05.20
11:34
(20) в (5) написано 120 точек - и "НЕ ХОЧУ"
22 trdm
 
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) да он лодырь...
24 Garykom
 
гуру
23.05.20
11:50
(22) Мне осень интересно как это взлетит в последних виндах
Судя по https://script-coding.com/dynwrap.html
25 Garykom
 
гуру
23.05.20
11:51
26 m1_1976
 
23.05.20
12:03
(23) Не... у меня, например, 28 точек. Если надо все объехать. Вдруг. (бывает такое). Это по 2-3 часа на точку. Это 3-4 точки в день. Это 7 - 8 дней.
Для меня всегда это жуть - жуткая :)
Понятно, что эта задача делается подключением к магазину  по удаленке. Но даже тут если на каждый магазин по 30 минут. Это 60 часов.
Это те же самые 7-8 дней!!!
27 Волшебник
 
23.05.20
12:05
(26) Значит надо сначала автоматизировать админку, например, изучить политики.
28 vde69
 
23.05.20
12:17
(27) это-же работать надо, представляешь 28 точек и в каждой админка, вспотеть можно :)
29 NorthWind
 
23.05.20
12:19
(20) это разумнее всего. Но их бин не хочут.
30 NorthWind
 
23.05.20
12:33
(28) так бывает, когда принято изначально неверное решение... Есть такая русская поговорка - сама себя раба бьет, когда хреново жнет.
31 Вафель
 
23.05.20
17:16
храни значение в верхнем регистре
и при поиске к верхнему приводи
32 NorthWind
 
23.05.20
17:19
(31) та ему не надо ничего никуда приводить. Ему это надо отдавать на чужой сервис, и важно чтобы последовательность ушла так, как она забита в коде. Иначе тот же криптохвост отвалится, не пройдет проверку.
33 Вафель
 
23.05.20
17:21
так вроде у марок регистр не имеет значения
34 NorthWind
 
23.05.20
21:32
(33) черт его знает, там законодательство быстрое как понос, но вот тут https://sbis.ru/help/data_exchange/marking/info/kod_mark описан пример для обуви
0104610028400094↔21HZkP7pqit46Yax1D↔91ffd0↔
Криптохвост содержит и строчные, и прописные буквы, и судя по его виду, приводить к прописным явно не стоит.
35 NorthWind
 
23.05.20
21:35
человек вроде в (15) пишет про Честный знак, а не про ЕГАИС, поэтоу если имеются в виду акцизные марки, то это не вполне в тему.
36 Garykom
 
гуру
23.05.20
21:37
(34) Проблема что внутри DM маркировки нету идентификатора по которому можно было бы понято в какой раскладке и с каким регистром прилетело и переконвертить на 1С.

Было бы в начале нечто вроде "MD" тогда если прилетело "ьв" понятно что кириллица с капсом
37 Ёпрст
 
23.05.20
21:51
(0)
Будь проще, по аналогии с акцизной маркой в алкашке, переводи все символы шк сам в верхний регистр и все символы в англ. расскладку, тип того:

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

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

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

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

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

Минусы в том, что начальная часть может быть только из заглавных символов и тогда опознать нажатие строго не получится.
Но если код сформирован по принципу (34), т.е. в коде есть 91ffd0 или что-то похожее строго в нижнем регистре, то можно ловить эту часть ДМ и по ней определять и раскладку и нажатие Капс
57 NorthWind
 
24.05.20
09:08
(47) вообще-то DM является стандартом GS1 для таких целей. Поэтому марка получилась международная, насколько я понимаю, при чтении этого DM юнискановским приложением вроде iGepir вы получите информацию о производителе и прочих AI, которые там в нем присутствуют. Если бы вместо этого сделали QR-код, то это была бы местечковая марка, которая читалась бы только специально написанным для этого приложением, как, собственно, и имеет место с акцизками.
58 Garykom
 
гуру
24.05.20
10:22
(57) Уй там. GS1 да, но внутри свой формат со своими разделителями и данными - ниуя iGepir без доработки под местечковые придумки РФ не покажет.
Точно так же можно допилить iGepir под QR с придумками местечковыми.
59 NorthWind
 
24.05.20
10:44
(58) хм... наши такие кривые? Я тут не поленился и нашел свою старую тему, вот: Маркировка лекарств по-турецки. Там есть то же самое, но турецкое, и фотку достаточно четкую я тогда сделал. Так проверил сейчас айгепиром - и все отлично читается...
60 NorthWind
 
24.05.20
10:47
AI21 у них тоже есть, но он существенно проще и состоит из одних цифр. Интересно, там эти штуки тоже за бабло выдаются или все-таки нет?
61 igel1969
 
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 эффект,но простым способом не обнаруживается.
63 igel1969
 
24.05.20
22:47
Теперь по поводу того что я лентяй:
Во-первых, действительно, лень везде ставить драйвера, настраивать их правильно.
120 точек - это же не просто 120 раз поставить, а не забывать ставить каждый раз пир открытии новой точки,
а это почти каждую неделю (я не говорю что количество точек стремительно растет, какие-то и закрываются).
Вот как это происходит с кассой -
надо поставить драйвер на локальный компьютер, настроить драйвер на RDP под данным пользователем,
настроить драйвер в 1С для данного пользователя. Видите - три кутерьмы для одной точки?
Теперь - точка работает по RDP через мобильный (флешечный) интернет. Как только у точки прерывается связь
(а причин для обрыва связи тыщща - от вины мобильного оператора, до того что продавщица пузом флешку сковырнула),
так сразу связь с кассой через все эти драйвера теряется. Ладно, я написал процедурку и повесил ее на горячей
клавише для воссоединения связи с кассой. Ладно - касса вещь супернужная и когда она не печатает чек - то продавцу
сразу понятно, что что-то неисправно и первое что она сделает (если есть мозги, а это процентов у 20 из всех продавщиц)
это попытается восстановить связь с помощью моей горячей клавиши.
А теперь представим что связь потерялась со сканером. Это мне ще еодни гемморой, в два раза больше звонков?
А некоторые продавщицы просто забьют на сканирование, а потом через неделю скажут на голубом глазу: "а что, сканер же не работает"
В общем, мне эти танцы с драйверами в 1С нафиг не нужны. Я уж лучше через разрыв клавиатуры все запрограммирую.
Поверьте - так удобнее. Тут большинство программеров в вакууме сидит, в своих программистских фирмочках коды кропаете,
а жизни реальной не знаете. Каждый раз когда на заре внедрения 1С (6 лет назад) пыталсь таких 1С-ников приглашать из всяких
контор типа 1СРарус и им подобных - ни бе, ни ме, как бараны, ничего не знают как торговля устроена, никакого толка от них не было ни разу.
64 igel1969
 
24.05.20
22:48
(62) не сталкивался с подобным
65 spectre1978
 
25.05.20
05:53
(63) сейчас вам скажут что полный онлайн для магазинов дрянь дело и надо было делать автономные армы кассиров и обмен.
66 Комрад1
 
25.05.20
06:49
(65) Сам поймет, когда ещё сотня новых магазинов откроется.
67 igel1969
 
25.05.20
07:22
(65) (66) Да, да, 120 обменов и следить чтобы все вовремя обменялись. Это я уже проходил в другой фирме 7 лет назад с 28 магазинами - пришлось брать специального человека на обмены, чтобы следил и помогал продавцам. сами они даже комп выключить неспособны зачастую. не то что продавцы, даже кураторы торговых точек (а они по сути должны быть толковыми) - когда торговая точка закрывается, возвращают оборудование, а там как правило всегда незакрытая кассовая смена. и хоть кол о башку теши им. также и обмениваться будут - через раз, только когда им это надо (товар пришел). а уж вечером то точно - все домой спешать, не дожидаются когда компьютер сам завершит работу, сразу из розетки выдергивают. так что автоматический обмен тоже не катит. я 17 лет в торговле, знаю о чем говорю. каждое утро (и сегодня не исключение) кто-нибудь из продавщиц звонит мне и возмущается - почему не открывается кассовая смена, ведь она вчера сняла отчет. и всегда оказывается что это был только Х-отчет. Цифры же есть, а больше ей и не надо.
68 igel1969
 
25.05.20
07:25
(65) и в конце-концов это требование руководства. когда я 7 лет назад пришел в эту фирму - было всего 12 точек (большей частью оптовых) и начальство привыкло иметь информацию о продажах ежесекундно, в режиме онлайн. И не может заставить себя отказаться от этого, хотя сейчас розничных точек больше, чем оптовых, а схема в 1С остается оптовая - реализация товаров и услуг, ПКО.
69 NorthWind
 
25.05.20
07:42
(67) кол тесать не надо, надо чтобы был регламент, где прописано что закрытие смены - обязанность продавца, незакрытая смена - определенный минус из премиальной части ЗП. Оговаривается при приеме на работу, предупреждается. Весь подобный геморрой - он всегда из-за того, что непонятно, кто должен выполнять ту или иную работу. Начальство доплачивать не хочет, поэтому норовит "вы как-нибудь так"... В такой ситуации надо смело обострять, писать пояснения, повышать голос, требовать, чтобы была определенность.
Бывает, конечно, и так, что руководство и сотрудники ИТшников вообще не слышат... если это ваш случай, тогда жаль что вы себя так поставили. Можно посоветовать только уволиться.
70 Комрад1
 
25.05.20
08:32
(67) :)) Ты просто не понимаешь, что подходы, которые работают на 100 точках, на 300+ точках работать уже не будут.
71 igel1969
 
25.05.20
08:36
(24) Windows Server 2008 R2 x 64 - полет нормальный. Разумеется, скачивал версию для NT и копировал ее в папку C:\Windows\SysWOW64,
а не в папку system32
72 Garykom
 
гуру
25.05.20
08:43
(67) Обмены делать принудительно однократно при включении, и так же принудительно однократно закрывать смену утром если она не была закрыта вечером.

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

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

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