Имя: Пароль:
1C
 
Подключение сканера штрихкодов в управляемом приложении без БСП
, ,
0 Birmingem
 
16.04.19
12:57
Есть простая самописная конфигурация на "8.3-управляемое приложение".
Требуется подключить сканер штрихкодов, чтобы попадал в ОбработкаВнешнегоСобытия().

Для обычных форм настройка сканера производилась в отдельной обработке ScanOPOSScan_v2.epf или ATOLBarcodeScan_v2.epf.

В новых конфигурациях (управляемое приложение) все это дело перенесли в БСП, там куча объектов. Все это внедрять в мою конфигурацию нежелательно, так как разбираться в БСП сложно, а задача - всего лишь сканер настроить.

Посоветуйте, как проще настроить сканер в управляемом приложении?
1 ам794123
 
16.04.19
13:09
(0) возьми за основу приведенную обработку и адаптируй её в своей нетленке.
2 Garykom
 
гуру
16.04.19
13:12
(0) Да сложнее всего разобраться как работает ВК для сканера "чтобы попадал в ОбработкаВнешнегоСобытия()"

А проще всего создать тупую тему на форуме.
3 Birmingem
 
16.04.19
13:25
(1)Да, сейчас разбираюсь с ScanOPOSScan_v2.epf, чтобы переделать на УФ. Но может кто уже проходил сей тернистый путь ...
(2)С нуля (вообще с нуля) конфигуры создавал? Есть что сказать по теме?
4 CepeLLlka
 
16.04.19
13:32
(3)Сканер нужно подключить в режиме COM порта
5 Garykom
 
гуру
16.04.19
13:36
(3) Создавал. И ВК с нуля писал.

По теме уже все сказал ВК подключи с настройками, что и делается по сути в БСП.
6 Birmingem
 
16.04.19
13:36
(4)Вопрос немного про другое. Нужна простая обработка, без БСП, чтобы в 1С настроить параметры подключения сканера (в т.ч. и СОМ порт).

Интересно, а у Атола нет ли обработки под УФ?
7 MWWRuza
 
гуру
16.04.19
13:36
Вот из одной из моих "неетленок":

В общих процедурах и функциях, "РаботаСТорговымОборудованием"

Функция ПодключитьСканер() Экспорт
    Попытка
        #Если ВебКлиент Тогда
            ПодключитьВнешнююКомпоненту("ОбщийМакет.СканерАТОЛ","АТОЛСканер");
            ДрайверСканШК = Новый("AddIn.АТОЛСканер.Scaner45");
        #Иначе
            ПодключитьВнешнююКомпоненту("AddIn.Scaner45");
            ДрайверСканШК = Новый("AddIn.Scaner45");
        #КонецЕсли    
        ДрайверСканШК.OldVersion = 0;
        ДрайверСканШК.AutoDisable = 1;
        ДрайверСканШК.DataEventEnabled = 1;
    Исключение
        Сообщить("Драйвер сканера ШК не найден");
    КонецПопытки;
КонецФункции

В модуле управляемого приложения:

Перем ДрайверСканШК Экспорт;            // Сканер штрихкодов
Перем ДрайверФР Экспорт;                // Фискальный регистратор
Перем ПосТерм Экспорт;                    // Банковский терминал

&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    Если ОбщиеПроцедурыФункции.ПроверитьРабСоСканером() Тогда
        Рез = РаботаСТорговымОборудованием.ПодключитьСканер();
        Если Рез = Ложь Тогда
            ПоказатьПредупреждение(Неопределено, "Не удалось подключить сканер и картридер, проверьте настройки!");
        КонецЕсли;
    КонецЕсли;

В модулях справочников и документов, что-то типа такого:

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если ВводДоступен() Тогда
        Если Источник = "BarCodeScaner" Тогда
            ШтрихКод = Лев(ДрайверСканШК.Данные,13);
            НайденныйТов = ОбщиеПроцедурыФункции.НайтиТоварПоШК(ШтрихКод);
        КонецЕсли;
    //    КонецЕсли;
        ДрайверСканШК.УдалитьСообщение();
        ДрайверСканШК.DataEventEnabled = 1;
        Если НайденныйТов = Неопределено Тогда
            ПоказатьПредупреждение(,"Товар со ШтрихКодом " + СокрЛП(ШтрихКод) + " не найден!");
            Возврат;
        Иначе
            Пар = Новый Структура("Ключ",НайденныйТов);
            Форм = ПолучитьФорму("Справочник.Товары.ФормаОбъекта",Пар);
            Форм.Открыть();
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры

В ОбщихМакетах - макет СканерАТОЛ. В нем загружен драйвер. Старый, 6.0 Так, как новый - платный.
Вообще, можно с АТОЛом и не заморачиваться - использовать 1С. Просто в данном случае, мне нужно было и сканер и КартРидер использовать, с АТОЛом мне показалось проще.
8 Garykom
 
гуру
16.04.19
13:36
(4) У меня и в режиме USB HID (клавиатуры) работает, странно да? Причем внешнее событие в 1С вызывается...
9 Garykom
 
гуру
16.04.19
13:37
(6) Я же говорю "мне влом самому разбираться дайте бесплатно все готовое для дебилов"
10 craxx
 
16.04.19
13:37
(3) БПО скачай и интегрируй в свою конфу. А по интеграции есть видеоуроки
11 Birmingem
 
16.04.19
13:44
(7)Вот, то что надо. Огромное спасибо! Буду разбираться.
(5), (9) на фига тащить БСП в маленькую конфигуру, когда задача простая? Вот например в (7) нормальное решение есть же ...
(10)Что такое БПО?
12 MWWRuza
 
гуру
16.04.19
13:50
БПО - библиотека подключаемого оборудования.

То, что в (7), я делал давно, лет пять назад, когда только начинал работать с восьмеркой, но имея уже довольно большой опыт 7.7... Поэтому, там код, по сути как в 7.7, только под восьмерку УФ...
Если что-то будет не понятно обращайтесь, надергаю фрагментов из этой "живой" конфы...
13 Birmingem
 
16.04.19
19:07
MWWRuza
Не заходит в ОбработкаВнешнегоСобытия()
Что делал:
1. Сначала помучился с внешней компонентой "1С: Сканер штрихкода" v 8.1.7.2 (ScanOPOS.dll). Так и не смог добиться чтобы сработала ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода","AddIn.Scanner")
2. Тогда решил попробовать старый добрый бесплатный Атол, который без проблем работает в 1С7.7.
        Подключили=ПодключитьВнешнююКомпоненту(Путь, "АТОЛСканер", ТипВнешнейКомпоненты.COM);        
        
        Если Подключили Тогда
            ДрайверСканШК = Новый ("AddIn.АТОЛСканер.Scaner45");
            
            ДрайверСканШК.OldVersion = 0;
            ДрайверСканШК.AutoDisable = 1;
            ДрайверСканШК.DataEventEnabled = 1;
        КонецЕсли;
Тут все хорошо, внешняя компонента подключается.
Но в процедуру ОбработкаВнешнегоСобытия() не заходит.
Подозреваю что сканеру нужно указать суффикс "#13 (Enter CR)", порт "Клавиатура" и может быть еще чего нибудь.
Как это сделать?
Или я не в том направлении иду?
14 Garykom
 
гуру
16.04.19
19:18
(13) Если ты взял "ОбщийМакет.Драйвер1ССканерШтрихкода" из типовой Розницы2 то там ошибка в манифесте и только x86_64 COM ВК прописана на 64 битной платформе должно быть все ОК.

Типовые конфы давно юзают NativeAPI "Драйвер1СУстройстваВводаNative"
15 Birmingem
 
16.04.19
19:29
(14)Нет, брал из БП 3.0. Да ладно, уже не нужен этот Сканопус. Делаю на Атоле, везде пишут что надежнее.
16 MWWRuza
 
гуру
16.04.19
19:46
Так все-таки, эмуляция клавы или ком-порта? Если ком-порт, то должно обязательно ентером заканчиваться, в настройках самого сканера.
И в свойствах формы, где Вы хотите получить внешнее событие, процедура его обработки назначена?
17 Garykom
 
гуру
16.04.19
19:46
(15) Блин да вытащи из макета (это обычный zip архив) dll-ку нужную и подключи как внешнюю ВК.
18 Birmingem
 
16.04.19
19:52
Внешнюю компоненту уже подключил, Атоловскую.
Теперь вопрос, как заставить чтобы в ОбработкаВнешнегоСобытия() заходил
19 Birmingem
 
16.04.19
19:55
(16)Сканер работает в режиме Клавиатура. Это я проверил запустив Атоловскую программулину Scaner_t.exe из C:\Program Files\ATOL\Drivers\Bin
20 Cyberhawk
 
16.04.19
19:55
В режиме отладки туда не зайдет, а на самом деле заходит
21 Birmingem
 
16.04.19
20:02
(20)Ого ... А как проверить тогда?
22 Garykom
 
гуру
16.04.19
20:04
(21) Сообщить("Зашло") ля
23 Birmingem
 
16.04.19
20:13
(20) (21) Шутить изволите ...
Проверил в БП 3.0, в модуле управляемого приложения есть процедура ОбработкаВнешнегоСобытия(). В Предприятии в любом месте сканером пикаю, в отладчике в эту процедуру заходит, есть и Источник, и Событие, и Данные.
24 Birmingem
 
16.04.19
20:17
А эту процедуру ОбработкаВнешнегоСобытия(), которая в модуле управляемого приложения, случайно как нибудь привязывать к событию не нужно ли (как в модулях форм)?
25 Cyberhawk
 
16.04.19
20:23
(23) Никаких шуток - Я про обработчик-метод формы "ВнешнееСобытие"
26 Cyberhawk
 
16.04.19
20:24
А, так у тебя эмуляция клавиатуры? Тогда и никакого внешнего события нет
27 Garykom
 
гуру
16.04.19
20:33
А ты со старой ВК атол
ДрайверСканШК.DeviceEnabled = Истина;

То делаешь? И проверяешь успешность "захвата порта"?
28 Birmingem
 
16.04.19
20:33
(26)Еще как есть.
Этот же сканер, на этом же компе, в конфигурации БП 3.0 в настройках оборудования указано:
Модель устройства: АТОЛ: Сканер штрихкода (общий)
Порт: <Клавиатура>
Суффикс: #13
и работает.
В модуле управляемого приложения есть процедура ОбработкаВнешнегоСобытия(). В Предприятии в любом месте сканером пикаю, в отладчике в эту процедуру заходит, есть и Источник, и Событие, и Данные.
29 Birmingem
 
16.04.19
20:38
(27)Да, так: ДрайверСканШК.DataEventEnabled = 1
А каким методом проверить "успешность "захвата порта"?
30 Garykom
 
гуру
16.04.19
20:41
(29) ResultCode, ее описание в ResultDescription
31 Garykom
 
гуру
16.04.19
20:42
Мануалы читать не пробовал? Мне очень помогает

https://www.atol.ru/upload/iblock/6d2/DTO6_Scaner_PM.pdf
https://www.atol.ru/upload/iblock/6d7/Drivers8_Scaner_PM.pdf
32 Birmingem
 
16.04.19
20:45
(30)ДрайверСканШК.ResultCode = 0, ДрайверСканШК.ResultDescription="ошибок нет"
(31)Спасибо! Попробую, может тоже поможет :)
33 Cyberhawk
 
16.04.19
21:21
(28) Мало ли что там настроено, это как надпись на заборе
34 Сияющий в темноте
 
17.04.19
13:52
Префикс и суффикс должны быть настроены как в сканере,но можно их не указывать,тогда вы получите сырые данные со всеми префиксами.
обработчик драйвера ловит событие клавиатуры и шерстит очередь событий на другое событие в течение интервала времени,указанного как чувствительность,если нажатие пришло,то начинаем интервал сначала и ждем следующего,если события не пришло,то мы закончили сбор штрихкода,теперь смотрим,чтобы у нас было символов больше,чем минимальная длина штрихкода,если меньше,то обрабатываем их как обычные нажатия,если больше,то передаем как штрихкод

на последовательном порту проще тем,что там любая посылка-это штрихкод,так как нажатий клавиш там нет.
35 Сияющий в темноте
 
17.04.19
13:54
обработка внешнего события в форме указывается в свойствах формы,тут как в клюшках просто создать процедуру недостаточно,а глобальная в модуле сработает уже после захода в каждую форму.
36 MWWRuza
 
гуру
17.04.19
14:51
+++(34) Однозначно! Возьмите инструкцию от сканера, переведите в режим эмуляции ком-порта, запрограммируйте суффикс "ентер", и все у Вас заработает.
И про (35) я уже писал, в (16) - И в свойствах формы, где Вы хотите получить внешнее событие, процедура его обработки назначена?
Без этого, текст процедуры в модуле формы, не более, чем слово из трех букв на заборе. Сама форма ловит событие, и запускает назначенную на это событие процедуру. При чем, она может даже совсем по другому называться, это не важно. В 7.7 предопределенная процедура обработки внешнего события, по ее стандартному имени вызывалась.
37 Birmingem
 
19.04.19
15:31
Разобрался. За основу взят пример указанный в (7).

Всем большое спасибо!

Основная ошибка была в том, что подключение внешней компоненты делал на сервере, и соответственно глобальную переменную ДрайверСканШК создавал на сервере. А процедура ВнешнееСобытие() выполняется на клиенте, где глобальная переменная ДрайверСканШК недоступна.

Еще одна особенность - в моей конфигуре использование синхронных методов запрещено (продвижение новых технологий в жизнь :) ), и соответственно метод ПодключитьВнешнююКомпоненту() и т.п. не работает. Использовал НачатьПодключениеВнешнейКомпоненты() и т.п.

Потом долго искал, как в асинхронном режиме устанавливать параметры и запускать методы внешней компонеты. Просто написать ДрайверСканШК.DataEventEnabled=1 не работает.
Нашел - НачатьУстановкуDataEventEnabled(,1) и т.п.

В итоге, все эта канитель поместилась в нескольких процедурах. Никаких дополнительных объектов, как в БСП, создавать не пришлось.

Если кому интересно, спрашивайте, поделюсь опытом.
38 Garykom
 
гуру
19.04.19
15:45
(37) Выложи пустой пример конфы/обработки на ИС, вместе с ВК в макетах
39 Garykom
 
гуру
19.04.19
15:45
Но там ничего сложного, ты просто по очереди сумел на все грабли почти наступить ))
40 Birmingem
 
19.04.19
16:04
(38)Да, тоже думаю так. Как время будет, сделаю в пустой конфигуре цельный работающий пример.
(39)Точно :)
К сожалению подходящего цельного примера в инете не нашел. Везде только ссылки на типовые конфигурации, а там БСП. К тому же, например в БП 3.0 использование синхронных вызовов разрешено, думаю и в других типовых также. А мне надо в асинхронном режиме.
Пришлось информацию собирать по крупинкам, а потом методом проб и ошибок ...
41 Garykom
 
гуру
19.04.19
16:09
(40) Когда уже и с подключением ВК и с асинхронностью (отказом от модальности) и с клиент-сервером в УФ работал ничего сложного нет.

Я вот не так давно обломался что когда нет платформы 1С нужной версии нужной разрядности стартер 1С (если там указать) запускает конфу на той именно версии но разрядность какая есть, причем без предупреждений/сообщений.
И долго не мог понять почему у меня ВК не пашет, оказалось банально не ту разрядность в пути к dll указывал.
42 Cyberhawk
 
19.04.19
18:59
(41) Он и когда есть нужная разрядность тоже иногда не то может запускать - смотря откуда стартер сам и смотря что там в недрах конф-файлов прописано. И еще от релиза к релизу может чиниться и ломаться )
Поэтому внешний стартер иногда собираюсь с силами и ставлю на РДП очередного заказчика, чтоб не е*аться там где уже поднадоело)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший