Имя: Пароль:
1C
1C 7.7
v7: Подключение сканера ШК в разрыв клавиатуры.
0 Козаностра
 
06.07.15
12:52
Есть сканеры Motorola LS1203 которые работают в режиме эмуляции КОМ порта. Но юзеры открывают по 2-3 копии 1С на раб месте ( им так нужно ) под разными пользователями. Соответственно дает сканировать только в копии которую открыли первой, а в остальных нет.

Пришел к выводу, что проблему можно решить подключением сканера в режиме разрыва клавиатуры, так как клавиатуру монопольно занять как КОМ порт не получится.

Долбился я день, у меня уже начинает подгорать, директор чувствую с дня на день, пристроится с сзади.

Прошу помощи.

7.70.009 ( Бух-Торг-Скл-Зарпл-Кадры-для Украины.)
1 Dmitrith
 
06.07.15
12:55
А в чем проблема то? Сканер "на разрыв клавиатуры" работает как клавиатура. Просто тупо передает цифры/буквы считанные им, как если бы с клавиатуры набрали. Просто позиционируетесь в нужное поле ввода и считываете ШК
2 Козаностра
 
06.07.15
13:04
Проблема в том что он читает в поле расходной накладной только если сделать активным окно ввода на месте ШК - и то, вводятся цифры и все не подхватывает карточку товара.
3 Dmitrith
 
06.07.15
13:07
Пусть операторы или вы программно делайте окно активным и сканируете. Чтоб "подхватывало" скорее всего нужно настроить преффикс сканера - чтобы сканер после сканирование еще символ энтер вбивал
4 Builder
 
06.07.15
13:14
Искать в яндексе последние бесплатные драйвера от АТОЛ. (версия 6.х вроде)
Установить, настроить порт, добавить суффикс #13, наслаждаться.
5 Dmitrith
 
06.07.15
13:16
>Установить, настроить порт, добавить суффикс #13, наслаждаться.
И будет та же проблема с портом, от которой пытаются избавиться?
6 Козаностра
 
06.07.15
13:16
7 Builder
 
06.07.15
13:18
(5) С чего бы вдруг?
(6) Неправильно настроено на картинке. Указан префикс, а нужен суффикс.
8 Garykom
 
гуру
06.07.15
13:20
ваш вариант с 3 открытыми копиями 1с и 1 сканером не взлетит никак стандартно

точнее надо смотреть драйвер клавиатурного сканера чистит ли буфер или могут 3 драйвера по очереди отработать - но такой вариант вам 100% тоже не нужен ибо тогда во всех 2-3 1С произойдет считывание ШК
9 Козаностра
 
06.07.15
13:21
Результат тот же, сейчас все заскриню.
10 мин.
10 Garykom
 
гуру
06.07.15
13:21
(8)+ нужна кнопка в интерфейсе 1С которая "переинициализирует" драйвер сканера для нужной текущей "копии 1С"
11 Козаностра
 
06.07.15
13:21
Garykom думаю считыванию будет в активном окне
12 Dmitrith
 
06.07.15
13:22
Без всякого драйвера 100% работать будет во всех программах если позиционироваться прямо в поле ввода. у нас так на 7ке работали - после сканирования и обработки ШК я программно курсор возвращал в поле ввода.
13 Garykom
 
гуру
06.07.15
13:23
(10)+ еще вариант это выкинуть нафик драйвер сканера (клавиатурного) и наваять свой "драйвер" на основе "обработки нажатий кнопок" и FormEx
14 Garykom
 
гуру
06.07.15
13:23
(11) советую передумать... не верите то проверьте :)
15 Garykom
 
гуру
06.07.15
13:24
(12) да самый простейший вариант отказаться от "драйверов" сканера нафик и использовать "поле ввода"
16 Козаностра
 
06.07.15
13:26
Товарищи, давайте я попробую, если нет то будем действовать по вашим советам далее, благодарю за ответы : )
17 Builder
 
06.07.15
13:27
(16) Ты хоть сообщи о результатах потом :)
18 Козаностра
 
06.07.15
13:35
http://s019.radikal.ru/i640/1507/c2/7325528b1a0e.jpg
http://s014.radikal.ru/i329/1507/0b/77bd0e4dc3b7.jpg
http://i056.radikal.ru/1507/78/bc87d7cf8743.jpg
http://s017.radikal.ru/i402/1507/11/21ff9ec28659.jpg

В общем у меня ощущение что я что-то делаю не так, причем кардинально. В самой 1 с нет настоек клавы или выбора порта, все настройки которые доступны есть только здесь
http://s009.radikal.ru/i310/1507/56/634ccaf7dd29.jpg

ДУмаю я в корне лох.
19 Builder
 
06.07.15
13:46
(18) Типовые давно не подключал. Тем более такую вообще не видел.
Надо смотреть что в этой обработке загружается, какой драйвер.
Может проще вручную добавить загрузку нужного драйвера. Изучай конфу с примером.
20 Козаностра
 
06.07.15
13:49
Как на счет этого http://catalog.mista.ru/public/271279/   ?
21 palpetrovich
 
06.07.15
13:53
(18) сканер настрен как ЭмуляцияКлавиатуры верно? в блокнот сканирует?  ..а в текст в 1с? если да - тогда нужно всего-то настроить АвтоПозиционирование курсора в нужном поле на форме используя недокументированную фичу использования предопределенных процедур
22 Козаностра
 
06.07.15
14:00
В блокнот сканирует нормально с переносом на новую строку.
В 1 с тоже только нужно выбирать активное поле для ввода ( те выделять его )
http://s013.radikal.ru/i322/1507/de/541eecdf2291.jpg
23 Козаностра
 
06.07.15
14:03
В расходной накладной только вот так
http://s015.radikal.ru/i331/1507/7d/3ad0eeddaa23.jpg
без подхвата товара.
24 Козаностра
 
06.07.15
14:04
Те я так понимаю оно работает, но последующие шаги за программистом?
25 palpetrovich
 
06.07.15
14:12
(23) дык, надо-ж функцию вызвать по событию, получить товар по ШК и вывать,  что там в поле Товар - что-то типа ИзмТовар()
26 Козаностра
 
06.07.15
14:21
Скажу сразу, я нуб в 1с, поэтому если вам не лень тыкайте носом где смотреть, заодно и мне поможете ))
27 Козаностра
 
06.07.15
14:28
// ===============================
Процедура ПриОткрытии()
    Форма.ПанельИнструментов(0);
КонецПроцедуры


// ===============================
Процедура ИзмШтрихКод()
          
    Тов = 0;
    
    Данные = ШтрихКод;
    Если ШтрихКодИмеетПрефикс=1 Тогда
        Если Найти("MPJS",Лев(Данные,1))<>0 Тогда
            // Штрих-код определяет товар
            Данные=Сред(Данные,2,СтрДлина(Данные)-1);
        Иначе
            глКомментарий("Формат считанного штрих-кода не предназначен для товаров");
        КонецЕсли;
    КонецЕсли;
    
    Тов=СоздатьОбъект("Справочник.ТМЦ");
    Упак=СоздатьОбъект("Справочник.Единицы");
    
    Лев2 = Лев(Данные,2);
    Если Лев2 = "22" Тогда
        // Используется свой внутренний штрих-код товара
        // Штрих-код построен по коду товара и весу
        ЗначДлинаКодаТМЦ = ?(глДлинаКодаТМЦ > 10, 10, глДлинаКодаТМЦ);
        Если Тов.НайтиПоКоду(Сред(Данные,3,ЗначДлинаКодаТМЦ))=0 Тогда
            Сообщить("Товар с кодом "+Сред(Данные,3,ЗначДлинаКодаТМЦ)+" не найден");
            Возврат;
        КонецЕсли;
        Если ЗначДлинаКодаТМЦ < 10 Тогда
            ТекКоличество=Число(Сред(Данные,3+ЗначДлинаКодаТМЦ,10-ЗначДлинаКодаТМЦ))/1000;
        Иначе
            ТекКоличество=1;
        КонецЕсли;
        Товар = Тов.ТекущийЭлемент();
        Упаковка="";
    Иначе
        // Используется основной штрих-код товара
        // или свой внутренний штрих-код товара с префиксом "20,21"
        Если Упак.НайтиПоРеквизиту("ШтрихКод",Данные,1)=0 Тогда
            глКомментарий("Товар со штрих кодом "+Данные+" не найден",0);
            Возврат;
        КонецЕсли;
        Упаковка=Упак.ТекущийЭлемент();
        Товар=Упаковка.Владелец;
        ТекКоличество=1;
        Если Константа.ЗапрашиватьКоличество=Да Тогда
            Если ВвестиЧисло(ТекКоличество,"Количество товара '"+Товар+"'",10,3)=0 Тогда
                Возврат;
            КонецЕсли;
        КонецЕсли;
        Если ТекКоличество<=0 Тогда
            Возврат;
        КонецЕсли;
    КонецЕсли;
    
    Инфо = СоздатьОбъект("СписокЗначений");
    Инфо.Установить("ТМЦ",Товар);
    Инфо.Установить("Единица",Упаковка);
    Инфо.Установить("Количество",ТекКоличество);
    Форма.ВыполнитьВыбор(Инфо);
    
    ШтрихКод = "";
КонецПроцедуры


Есть вот это - ПодборПоШтрихКоду.Форма
28 Garykom
 
гуру
06.07.15
14:29
(27) и? че хотим то?
29 Злопчинский
 
06.07.15
17:04
30 Garykom
 
гуру
06.07.15
17:12
(29) к сожалению там тема си... нескольких одновременно работающих сеансов 1С на одном раб.месте не раскрыта
31 Злопчинский
 
06.07.15
17:22
(30) извращения - это вы уже в персональном порядке... ;-)
32 FN
 
07.07.15
00:44
Вот тебе без всяких драйверов - вставляешь в нужную форму следующий код:

//переменные перехвата клавиатурного ШК
Перем ВСХ, спНажатыхКлавиш, ПропустиьСимвол,БуферШК;

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО)
    Если ФСО=0 тогда Возврат; КонецЕсли; //легкий антидубль - формекс иногда подглючивает

//самопальный драйвер клавиатурного сканера    
    Если Форма.АктивныйЭлемент()="ШКод" тогда Возврат; КонецЕсли; //тут фильтр по реквизитам формы, где ловить штриход ненужно
    Если Форма.Закладки.ТекущаяСтрока()<>1 тогда Возврат; КонецЕсли; //тут фильтр по закладкам
    Если (КодСимв(Символ)>47) и (КодСимв(Символ)<58) Тогда //нажатие цифры    
        Если ПропустиьСимвол=Символ Тогда
            ПропустиьСимвол="";
            Возврат;
        КонецЕсли;
        БылаНажата=спНажатыхКлавиш.Получить(""+КодКлавиши);
        Если ПустоеЗначение(БылаНажата)=1 тогда //'это первое нажатие - обрабатываем
                ФСО=0; //отменяем нажатие, ждем отжатия
                спНажатыхКлавиш.Установить(""+КодКлавиши,_GetPerformanceCounter());
            Иначе
                спНажатыхКлавиш.Установить(""+КодКлавиши,""); //обнулим нажатие
        КонецЕсли;
    ИначеЕсли (КодСимв(Символ)=13) и (ПустоеЗначение(БуферШК)=0) Тогда
        ФСО=0;
        Возврат;
    КонецЕсли;
КонецПроцедуры


Процедура ПриОтжатииКнопкиКлавиатуры(КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)
    Если ФСО=0 тогда Возврат; КонецЕсли; //легкий антидубль - формекс иногда подглючивает

//самопальный драйвер клавиатурного сканера
    Если Форма.Закладки.ТекущаяСтрока()<>1 тогда Возврат; КонецЕсли; //тут фильтр по закладкам
    Если Форма.АктивныйЭлемент()="ШКод" тогда Возврат; КонецЕсли; //тут фильтр по реквизитам формы, где ловить штриход ненужно
    Если (КодСимв(Символ)>47) и (КодСимв(Символ)<58) Тогда //нажатие цифры
        Если ПропустиьСимвол=Символ Тогда
            Возврат;
        КонецЕсли;
        БылаНажата=спНажатыхКлавиш.Получить(""+КодКлавиши);
        Если ПустоеЗначение(БылаНажата)=1 тогда //отжатие клавиши, которую мы не мониторим
            Возврат;
        КонецЕсли;
        ТаймАут=?(ПустоеЗначение(БуферШК)=1,30,3000);
        ТекВремяМеждуКлавишами=(_GetPerformanceCounter()-БылаНажата);
        Если ТекВремяМеждуКлавишами<ТаймАут Тогда // это сканер
            БуферШК=БуферШК+Символ;
            спНажатыхКлавиш.Установить(""+КодКлавиши,""); //обнулим факт нажатия
            ФСО=0;
            Возврат;
        Иначе
            Если ПустоеЗначение(БуферШК)=0 Тогда
                БуферШК="";
            КонецЕсли;
            ПропустиьСимвол=Символ;
            ВСХ.SendKeys(Символ,1);
        КонецЕсли;
    ИначеЕсли (КодСимв(Символ)=13) и (ПустоеЗначение(БуферШК)=0) Тогда
        ОбработатьШтрихкод(БуферШК);
        БуферШК="";
    Иначе
        БуферШК="";
    КонецЕсли;
КонецПроцедуры


спНажатыхКлавиш=СоздатьОбъект("СписокЗначений");
ПропустиьСимвол="";
ВСХ=СоздатьОбъект("WScript.Shell");
БуферШК="";


Нужен загруженный формекс.
Чуствительность задается в строке
ТаймАут=?(ПустоеЗначение(БуферШК)=1,30,3000);
Где 30 - время между нажатием и отжатием клавиши (практический тест показал что человек не может выполнить эту операцию быстрее 50мс, а сканер может) - на этом и основан метод перехвата
3000 - время между нажатиями клавиш. Для локального использования 500 мс с головой, для удаленки через rdp - можно увеличить.
ОбработатьШтрихкод(БуферШК); - вызов обработчика. Тут можно применить формекс и сгенерировать внешнее событие, которое автоматом обработается в стандартных конфигурациях.

Этот код заточен под ситуацию, когда в сканере настроен суффикс "ентер" и нет возможности настроить префикс (таких сканеров много в китае). При наличии префикса - код можно упростить.
33 Злопчинский
 
07.07.15
00:55
(0) "Долбился я день, у меня уже начинает подгорать, директор чувствую с дня на день, пристроится с сзади"
.
директора гони нафиг ;-)
объясни популярно, что песни по заказу партии и правительства пишутся только у тех, кто обласкан квартирами в париже, дачами на мальдивах и багаттями под окном - которые охраняет личный привратник...
34 Козаностра
 
07.07.15
09:36
Злопчинский, большего я пока не достоин, оклад 10610 RUB
FN - Благодарю, попробую
И благодарю всех отписавшихся
35 Garykom
 
гуру
07.07.15
09:53
(34) ага попробуй через formex (32) это нормальная варианта типа (13)