Имя: Пароль:
1C
 
Сканирование марок в УТ 11
,
0 Newbie1c
 
13.10.21
12:25
Добрый день.

Есть 2 сканера. Один Zebra, второй Honeywell.
Стоклнулись с проблемой, что вылетает ошибка
при сканировании в документе Приобретение товаров и услуг или Перемещение товаров.
Текст XML содержит недопустимый символ в позиции 31

Ошибка одинаковая на обоих сканерах.
При это при работе в РМК - марка нормально сканируется, и корректно уходит в честный знак. Там гасится.

В чем может быть проблема? 31 символ - непечатаемый символ, по всей видимости.
1 Смотрящий
 
13.10.21
12:26
и 67 тоже будет такойже ...
2 Newbie1c
 
13.10.21
13:23
(1)
Как же быть тогда?(
3 Смотрящий
 
13.10.21
13:31
(2) Чекни отладчиком чтение и обработку марок в РМК и в ПТиУ/Перемещениях
4 lodger
 
13.10.21
13:39
ут типовая? обновить всё, поставить все заплатки.
5 Newbie1c
 
13.10.21
14:15
Эти куски все типовые.
11.4.13.209 в последней посмотрел этот же кусок кода такой же.

Валится при вызове серверной процедуры на форме.


Текст XML содержит недопустимый символ в позиции 31 :
010461014312057021-Iw-=aKlHir4O91809392ZkbNK8jZ1boylW+ynImpc2D8BytE6CmrnJnZAB75YRHpGrl1PollwaBo6sjn0s/OHndbEo5Vg7tMUkxw77O86A==
{Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(5093)}:    ОбработатьШтрихкодыСервер(СтруктураДействий,КэшированныеЗначения);
{Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(281)}:            ОбработатьШтрихкоды(МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр));
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(1993)}:                    Оповестить(ВыходныеПараметры[0], ВыходныеПараметры[1], "ПодключаемоеОборудование");
{МодульУправляемогоПриложения(134)}:    Результат = МенеджерОборудованияКлиент.ОбработатьСобытиеОтУстройства(ОписаниеСобытия, ОписаниеОшибки);

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Ошибка при записи XDTO
по причине:
Текст XML содержит недопустимый символ в позиции 31 :
010461014312057021-Iw-=aKlHir4O91809392ZkbNK8jZ1boylW+ynImpc2D8BytE6CmrnJnZAB75YRHpGrl1PollwaBo6sjn0s/OHndbEo5Vg7tMUkxw77O86A==
6 timurhv
 
13.10.21
14:41
(5) разделители (91809392...) нельзя передавать с клиента на сервер. Код марки должен быть закодирован на клиенте, передан на сервер и там раскодирован.
Либо смотреть в сторону обновления УТ, либо сделать как в РМК обрабатывается сканирование.
7 lodger
 
13.10.21
14:48
(5) вот тут бороли такую проблему
https://t.me/mark1c/45325

(6) УТ по виду номенклатуры определяет тип марки и применяет правила транспорта клиент->сервер.
очевидно, определилось, что товар с обычным шк и самый дешевый транспорт это строка.
8 Newbie1c
 
13.10.21
15:33
(7)
Попробовал пересохранить вид номенклатуры, перевыбрать в карточке - не помогает.
Через консоль посмотрел, служебные реквизиты заполнены корректно.
9 Newbie1c
 
14.10.21
06:53
Платформа на всякий. 1С:Предприятие 8.3 (8.3.17.1851)
Ковыряние в коде привело к следующему:

При сканирование в Приобретении
В обработке оповещения заходит в эту процедуру

    Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
        Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
            ОбработатьШтрихкоды(МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр));
        КонецЕсли;
    КонецЕсли;

И внутри валится на ОбработатьШтрихкодыСервер(СтруктураДействий,КэшированныеЗначения);

При сканировании в РМК

    Если Источник = "ПодключаемоеОборудование" И ВводДоступен()
        И Не ТолькоПросмотр Тогда
        Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
                ДанныеШтрихкодов = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
                ОбработатьШтрихкоды(ДанныеШтрихкодов);
        КонецЕсли;
    КонецЕсли;

По причине тогда, что ВводДоступен() = Ложь;

Еще одно непонятное поведение. Сканирую марку в режиме отладки - ловлю обработку оповещения. Нажимаю F5 без дальнейших точек остановок. И строка в ТЧ не добавляется вообще.

Перед ОбработатьШтрихкоды(ДанныеШтрихкодов); добавил Сообщалку с меткой. Не заходит. Т.е. процедура ОбработатьШтрихкоды не отрабатывает.

Т.о. обработка данных штрихкода и добавление строки в ТЧ происходит в другом месте. Вопрос как найти это место?
10 lodger
 
14.10.21
09:31
(9) значит не там искал.
(8) перечитал тот чат - оказывается это методолги 1с намудрили. позиция такая - ДМ надо считывать только в предназначенных для этого местах. в формах подбора марок, документах маркировки и в РМК. в остальных местах (где в общем-то и нет указания на марку) - считывание ДМ не работает.
11 lodger
 
14.10.21
09:32
если не согласен - пиши расширение и продавай на нимфостарте, либо пиши в 1с и жди чуда.
12 Newbie1c
 
15.10.21
09:30
Еще вопрос: в настройках компоненты сканера поставил, чтобы тип данных был Base64 - штрихкоды перестали сканироваться в подбор.
Нужно ли в самом сканере менять, чтобы в кодировке Base64 отправлялось?
Сканер Zebra DS2208.
Если нужно, то как изменить?
По умолчанию в компоненте стоял тип данных "строка".
13 lodger
 
15.10.21
09:31
(12) в мануале к сканеру есть описание как переключать режимы.
14 Salimbek
 
15.10.21
12:08
(13) А для чего переключать сканер?
Суть того, что хотят сделать в (12) простая - у Драйвера сканера есть возможность отправлять данные в Base64. При этом сканер должен все считать в обычном режиме. И отправить в 1С-ку тоже должен все в обычном режиме без преобразований. Далее, драйвер эти полученные данные переводит в base64 и передает дальше в конфу. И, теоретически, конфа далее сама должна была увидеть, что прилетело Base64, декодировать эти данные и далее с ними работать.
Но, в конфе от 1С (смотрел где-то в июле) обработки события "Base64" не было. Так что толку (сейчас) в этой настройке нет.
15 Salimbek
 
15.10.21
12:52
+(14) Хотя... посмотрел сейчас еще раз (1С Розница 2.3.9.22)

В обработке ВнешнееСобытие формы обработки РМКУправляемыйРежим - Форма идет такой код:

            ДанныеСоСканераСтруктура = СобытияФормИСКлиент.ВнешнееСобытиеПреобразоватьДанныеСоСканераВСтруктуру(
                ЭтотОбъект,
                Источник,
                Событие,
                Данные);
                
            Если ДанныеСоСканераСтруктура = Неопределено Тогда
                Возврат;
            КонецЕсли;
            
            ОбработатьКодМаркировки(ДанныеСоСканераСтруктура);

В процедуре ОбработатьКодМаркировки вызывается:

    ШтрихкодированиеИСКлиентСервер.ЗакодироватьШтрихкодДанныхBase64(ИсходныеДанные);

И уже в этой процедуре есть проверка:

    Если Не ДанныеШтрихкода.Свойство("ФорматBase64")
        Или (ДанныеШтрихкода.Свойство("ФорматBase64")
        И ДанныеШтрихкода.ФорматBase64 = Ложь) Тогда
        
        ДанныеШтрихкода.Штрихкод = ШтрихкодВBase64(ДанныеШтрихкода.Штрихкод);
        ДанныеШтрихкода.Вставить("ФорматBase64", Истина);
        
    КонецЕсли;
16 Salimbek
 
15.10.21
13:05
+(15) При этом в том же Списке Номенклатуры

Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    Если ВводДоступен() Тогда
        ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудования(ЭтотОбъект, Источник, Событие, Данные);
    КонецЕсли;
    
КонецПроцедуры

а в процедуре ВнешнееСобытиеОборудования в самом начале встречаем:

    // Заменяем спец.символы, которые потом не сможем передать на сервер.
    РазделительGS1 = МенеджерОборудованияМаркировкаКлиентСервер.РазделительGS1();
    ЭкранированныйСимволGS1 = МенеджерОборудованияМаркировкаКлиентСервер.ЭкранированныйСимволGS1();
    Данные = СтрЗаменить(Данные, РазделительGS1, ЭкранированныйСимволGS1);

т.е. они НЕ делают проверку (а может к нам прилетел уже Base64 и ничего менять не надо, они сразу считают, что прилетает только чистая Строка) так что повторюсь, полноценной обработки того, что сканер настроен в режиме Base64 в конфах 1С-ки - нет.
17 Salimbek
 
15.10.21
13:10
И еще, в (9)
"По причине тогда, что ВводДоступен() = Ложь;"

так происходит когда вы пошагово все проверяете в отладчике, и, разумеется, форма в этот момент не активна. Чтобы зайти внутрь и отследить, что происходит, надо поставить точку останова внутри условия. Тогда увидите, что ВводДоступен() = Истина;