Версия для печати темы (https://pro1c.org.ua/index.php?s=97931c6430b44cb04702010942fb6a9f&showtopic=42818)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Сканирование в поле ввода, без возможности ввода руками.

Автор: Gazulo 20.12.17, 10:10

Управляемые формы. Конфигурация самописная. Есть поле для ввода штрих-кода, для поиска бонусных карт. Необходимо сделать ввод только через сканирование карты , без возможности ввести штрих-код вручную. Заранее большое спасибо.

Автор: Alex78 20.12.17, 11:57

1. Поле ввода штрих-кода нужно сделать недоступным для пользователя. 2. Вам нужна сканеры USB или RS-232 (в COM-порт), но не в разъем клавиатуры (иначе данные не будут вводиться в поле ввода штрихкода). 3. Дальше копайте в следующем направлении: а) Процедура ВнешнееСобытие(Источник, Событие, Данные); б) внешние компоненты для работы со сканером, что-то типа scanopos.dll. Вкратце как-то так, если память не изменяет.

Автор: Gazulo 20.12.17, 12:58

Alex78 @ Сегодня, 11:57 * ,
Сканер в USB порт в разрыв клавиатуры...

Автор: Alex78 20.12.17, 13:00

Цитата(Gazulo @ 20.12.17, 12:58) *
Сканер в USB порт в разрыв клавиатуры...

в смысле?

Автор: Gazulo 20.12.17, 13:03

Alex78 @ Сегодня, 13:00 * ,
у меня сканер на USB порт подключаю в разрыв клавиатуры. Что можно сделать?

Автор: sava1 20.12.17, 13:05

перевести в режим эмуляции СОМ порта + драйвер нужен.

Автор: Alex78 20.12.17, 13:10

Что значит "у меня сканер на USB порт подключаю в разрыв клавиатуры". Если не ошибаюсь, сканеры бывают либо в USB, либо в разрыв клавиатуры. Или есть гибридные варианты?

Автор: Gazulo 20.12.17, 13:19

Alex78 @ Сегодня, 13:10 * ,
сканер USB, в настройках указано клавиатура...

Alex78 @ Сегодня, 13:10 * ,
в параметрах подключения Порт - Клавиатура

Автор: Alex78 20.12.17, 13:21

Не знаю, не работал с такими. Но могу сказать, что сканер должен общаться с компьютером через USB порт, если он будет посылать данные в клавиатуру, то, во-первых, смысла в этом нет, во-вторых, данные влетят в активное поле формы, а там какой-нибудь поиск по строке может начаться.

Автор: sava1 20.12.17, 13:34

Перепрограммировать сканер.

Автор: Alex78 20.12.17, 13:34

То есть сканер нужно настроить так, чтобы: открыли, к примеру, текстовый документ, просканировали сканером штрихкод, а в документе ничего не появилось, иначе такая работа сканера будет аналогом ввода цифирек пользователем.

Автор: Gazulo 20.12.17, 13:35

Alex78 @ Сегодня, 13:21 * ,



 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 8
 

Автор: Alex78 20.12.17, 13:50

Gazulo @ Сегодня, 13:35 * ,
С настройками сканера разбирайтесь сами, тут ничего не могу подсказать.

Автор: Petre 20.12.17, 15:43

Gazulo @ Сегодня, 13:35 * ,
Втулите префикс, который не просто набрать с клавиатуры.
Либо в АвтоПодбор проверяйте длину введенной строки, если не соответствует длине штрихкода, очищайте (не спасет от копипасты).

Автор: sava1 20.12.17, 15:48

Сканер какой ?

Автор: Gazulo 20.12.17, 16:10

sava1 @ Сегодня, 15:48 * ,
Сканера разные(Motorola,Metrologic.... и т.д.)

Автор: sava1 20.12.17, 16:18

И у тех, и у других есть штрихкоды для перепрограммирования. Ищем штрихкод Эмуляция СОМ, считываем, качаем их-же драйверы ЮСБ-СОМ, - видим в диспетчере СОМ порты с названием сканеров, а в НИД устройствах - пропадают.

Автор: Gazulo 21.12.17, 9:29

sava1 @ Вчера, 16:18 * ,
а в самой 1С никак, без дополнительных настроек сканера?

Автор: sava1 21.12.17, 9:40

1Gazulo @ Сегодня, 9:29 * ,
это логика работы оборудования
Или через префиксы (14), но тут другой подход.

Автор: Vofka 21.12.17, 9:48

Если штрихкод вводится с помощью сканера, то, можно предположить, что он заполняется в текстовом поле за 1-2 секунды.
Если штрихкод вводится кем-то руками, то можно предположить, что это будет 2 и более секунды.

Если это принимается, то можно сделать следующим образом. В событии ПриИзменении поля с штрихкодом подключать обработчик ожидания, который вызовется через 2 секунды один раз, в котором проверять количество символов в этом поле. Если количество символов меньше, чем в реальном штрихкоде (13, если это EAN13), то с вероятностью 95% это человек вводит руками. В таком случае можно очищать поле, возможно, выдавая сообщение о том, что руками вводить нельзя. При этом надо учесть, что если обработчик ожидания уже подключен (взводить какой-то флаг), то подключать повторно его не надо. Так же нужно не забыть этот флаг обнулить по окончании этого обработчика.

Решение не идеальное, такой себе костыль, и возможны "осечки" (теоретически, если чел будет очень быстро набивать штрихкод) но при этом не надо играться с настройками сканера. Но по хорошему, конечно, правильное решение то, о чем пишут выше.

Автор: Gazulo 21.12.17, 9:56

Vofka @ Сегодня, 9:48 * ,
а может сделать поле ввода недоступным, а курсор сфокусировать на этом поле приоткрытии формы...

Автор: Vofka 21.12.17, 10:06

Gazulo @ Сегодня, 9:56 * ,
мне кажется, если поле недоступно, то установить туда курсор не получится.
Если курсор устанавливается и если вас такой сценарий устраивает, то почему бы и нет. Вам решать smile.gif

Автор: Batchir 21.12.17, 12:38

Никогда не было проблем со сканерами.
Ставите SCANOPOS (или АТОЛ последние бесплатные) и работаете как с внешним событием. Во всех типовых реализовано.
А если конфа самописная так вообще подключайте библиотеку торгового оборудования и закроете вопрос не только со сканерами.

Автор: Gazulo 21.12.17, 14:30

Batchir @ Сегодня, 12:38 * ,
у меня не проблема в подключении сканера, почитайте выше в чем проблема и чем ваш комментарий здесь мне поможет?

Автор: Gazulo 21.12.17, 15:47

Alex78 @ Вчера, 11:57 * ,
а как быть если не сканер, а считыватель магнитных карт??

Автор: Batchir 21.12.17, 15:56

Цитата(Gazulo @ 21.12.17, 14:30) *
у меня не проблема в подключении сканера, почитайте выше в чем проблема и чем ваш комментарий здесь мне поможет?

Цитата(Gazulo @ 21.12.17, 15:47) *
а как быть если не сканер, а считыватель магнитных карт??

Вам ведь нужно что бы при сканировании (считывании) карты система распознавала штрихкод и обрабатывала по своему алгоритму?
Для того что бы это сделать не нужны никакие курсоры и поля. Нужно заставить сканирование выполняться как внешнее событие.
Как это сделать? читать http://pro1c.org.ua/topic/skanirovanie-v-pole-vvoda-bez-vozmozhnosti-vvoda-rukami-42818/?view=findpost&p=136512.

Автор: Gazulo 21.12.17, 17:14

Batchir @ Сегодня, 15:56 * ,
Да можно пробывать и так, на для этого надо на каждом рабочем месте ставить драйвера SCANOPOS ?

Автор: Gazulo 21.12.17, 22:20

Batchir @ Сегодня, 15:56 * ,
Написал обработку
Вот код

&НаКлиенте
Перем ОбъектДрайвера;

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Сообщить(Источник);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОписаниеОшибки = "";
    Попытка
        ProgID = "AddIn.Scanner";
        ПодключитьВнешнююКомпоненту(ProgID);
        ОбъектДрайвера = Новый (ProgID);
    Исключение
        ОписаниеОшибки = "Невозможно подключить внешнюю компоненту";
    КонецПопытки;
    Если ОписаниеОшибки <> "" Тогда
        Сообщить(ОписаниеОшибки);
    КонецЕсли;
КонецПроцедуры


Но не срабатывает процедура ВнешнееСобытие

Gazulo @ Сегодня, 21:22 * ,
Получилось так:
    ProgID = "AddIn.Scaner45";
        ПодключитьВнешнююКомпоненту(ProgID);
        ОбъектДрайвера = Новый (ProgID);
        ОбъектДрайвера.DataEventEnabled=1;
        ОбъектДрайвера.стараяВерсия=1;
        ОбъектДрайвера.autoDisable=0;
        ОбъектДрайвера.УстройствоВключеноПриCтарте = 1;
        ОбъектДрайвера.УстройствоВключено = 1;


Но немного тормозит...

Gazulo @ Сегодня, 21:59 * ,
при создании драйвера где то 10 секунд и после того как просканировно карточку 10 секунд примерно..

Автор: logist 22.12.17, 7:12

Цитата(Gazulo @ 21.12.17, 22:20) *
при создании драйвера где то 10 секунд и после того как просканировно карточку 10 секунд примерно..

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

Автор: Batchir 22.12.17, 9:01

Цитата(Gazulo @ 21.12.17, 17:14) *
Да можно пробывать и так, на для этого надо на каждом рабочем месте ставить драйвера SCANOPOS ?

Так же как на каждом рабочем месте нужно поставить 1С. А если к компу подключен принтер, то нужно и драйвера на него поставить.
Вроде всё логично. Для нормальной работы девайса нужно поставить необходимое ПО.

Я бы всё таки скачал "1С:Библиотека подключаемого оборудования" нужной редакции и подсадил бы её в самописную конфу.
Там всё уже реализовано. Сиди только формочки настраивай на работу с ней.

Автор: Gazulo 22.12.17, 9:25

Batchir @ Сегодня, 9:01 * ,
да но все сейчас работает и без драйверов SCANOPOS , а теперь значит мне на каждый комп его надо поставить, а это порядка 20-30 машин))). Я думал как то без этого справиться, хотел только доработать саму конфигурацию..

Автор: Batchir 22.12.17, 11:04

Цитата(Gazulo @ 22.12.17, 9:25) *
да но все сейчас работает и без драйверов SCANOPOS

Это работает через одно место, просто как ввод руками в любое поле формы.
С моей точки зрения это работает не корректно. Ведь не зря существуют все эти драйверы торгового оборудования и целая библиотека работы с ними?

20-30 машин это ж не проблема. Зайти удаленно и настроить.
Можно бесконечно долго встраивать различного рода костыли для того что бы как-то работало.
Потом появятся весы в магазинах - опять костыли? Появятся разные фискальные регистраторы - опять костыли?
Можно ведь подойти к вопросу с другой стороны и сделать всё по уму сразу. Решать в конечном счете Вам. Как бы я сделал - уже озвучил.

Автор: Gazulo 22.12.17, 16:48

Batchir @ Сегодня, 11:04 * ,
Спасибо.

Автор: Sl@V@ 23.12.17, 21:01

Я сам не программер, но была ситуация 1-в-1, плюс все сидят на RemoteApp. Перечитал кучу всего, говорил с тучей специалистов.
Заказал реализацию у человека, который сразу понял и начал предлагать тоокоые варианты. Вот что получилось.

&НаКлиенте
Процедура ТекстКАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
    СтандартнаяОбработка = ложь;
     WSHShell = Новый COMОбъект("WScript.Shell");
     WSHShell.SendKeys("{ENTER}");
КонецПроцедуры

&НаКлиенте
Процедура ТекстКОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
    Текст = СтрЗаменить(Текст,Символы.НПП,"");
    htmlfile = Новый COMОбъект("htmlfile");
    Буф = htmlfile.ParentWindow.ClipboardData.GetData("Text");
    Если Текст = Буф Тогда
        Текст="";
        htmlfile.ParentWindow.ClipboardData.SetData("Text","");
    КонецЕсли;    
        СтандартнаяОбработка = ложь;
        //Сообщить("Окончание"+Текст+ "*Буф*"+Буф);    
    Если Не ЕстьСканКасса() Тогда
        Закрыть(Истина);
    КонецЕсли;    
    
    Если Не ПустаяСтрока(Текст) И КодКартыКлиента = Текст  Тогда
        Закрыть(Истина);
    Иначе
        Закрыть(Ложь);
    КонецЕсли;    
КонецПроцедуры

Плюс контроль на наличие сканера в кассе

&НаСервере
//БезКонтекста
Функция ЕстьСканКасса()
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ШтрихкодерНаТочке.КассаККМ
        |ИЗ
        |    РегистрСведений.ШтрихкодерНаТочке КАК ШтрихкодерНаТочке
        |ГДЕ
        |    ШтрихкодерНаТочке.КассаККМ = &КассаККМ";

    Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
    
    
    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Если   ВыборкаДетальныеЗаписи.Следующий() Тогда
        Возврат(Истина)
    КонецЕсли;
    Возврат(Ложь);

КонецФункции


Все работает чудесно. Понятно, что ушлые всегда найдутся обойти, но пока на этом остановился.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua