В практической работе часто возникают нестандартные ситуации. Рассмотрим одну из них: поставщик предоставил партию товара с QR-кодами, в которые ошибочно закодирован служебный символ — символ табуляции (с кодом 182). При сканировании такого кода в 1С стандартный механизм обработки данных воспринимает этот символ как разделитель и разрывает единый штрихкод на несколько частей. В результате в обработчик события попадает уже искаженная, урезанная информация, что делает дальнейшую работу невозможной.
Проблема заключается в том, что стандартная функция МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр) использует служебные символы, включая табуляцию, для разделения потока данных на отдельные штрихкоды. Простая замена символа в процедуре ОбработкаОповещения не сработает, так как на этот уровень данные приходят уже разделенными и частично потерянными.
Давайте разберем, как можно решить эту проблему, проанализировав несколько подходов: от настройки оборудования до программных доработок в 1С.
Это наиболее правильный и надежный метод. Его суть — исправить данные на самом первом этапе, еще до того, как они попадут в 1С. Если сканер будет передавать уже очищенную строку, то никаких доработок в конфигурации не потребуется, и стандартные механизмы 1С отработают корректно.
Большинство профессиональных сканеров (например, Zebra, Honeywell, Datalogic) поставляются со специальными утилитами для настройки. Необходимо найти в документации к вашей модели раздел, посвященный обработке данных, правилам сканирования или форматированию. Часто такие утилиты позволяют создавать сложные правила, включая поиск и замену определенных символов в отсканированной строке.
В настройках сканера или его драйвера ищите опции, связанные с префиксами, суффиксами или заменой символов (часто называется "Symbol replacement", "Data formatting" или похоже). Ваша задача — создать правило, которое будет находить символ с ASCII-кодом 182 и заменять его на пустую строку (т.е. удалять). Если удаление невозможно, можно заменить его на безобидный символ, который не является разделителем, например, пробел.
Сканеры могут работать в разных режимах, чаще всего это эмуляция клавиатуры (Keyboard Wedge) и эмуляция COM-порта (Serial Port Emulation). Режим эмуляции COM-порта, как правило, предоставляет гораздо больше возможностей для тонкой настройки потока данных через драйвер. Если ваш сканер работает в режиме клавиатуры, возможно, стоит рассмотреть его переключение в режим COM-порта для получения доступа к расширенным настройкам.
Преимущество этого подхода: решение не зависит от конфигурации 1С. Оно будет работать в любой базе, не требует внесения изменений в код и не рискует сломаться при обновлении конфигурации. Кроме того, это устраняет первопричину проблемы, а не борется с ее последствиями.
Этот путь следует выбирать, если настройка сканера невозможна или слишком рискованна (например, когда в компании используется множество разных моделей сканеров и изменение настроек одного может повлиять на другие). Задача программиста — перехватить «сырые» данные от сканера до того, как их обработает стандартный механизм БПО (Библиотеки подключаемого оборудования).
Нужно найти место в конфигурации, где происходит первоначальный прием данных от драйвера оборудования. Стандартная процедура ОбработкаОповещения в форме — это уже конечная точка. Нам нужен более низкий уровень.
Алгоритм действий:
ОбработкаОповещения в форме документа, где происходит сканирование. Когда отладчик остановится, откройте стек вызовов. Двигаясь по стеку вызовов вверх, вы сможете найти процедуры и функции, которые вызывались до этого. Ваша цель — найти место в общих модулях (например, МенеджерОборудованияКлиент или похожих), где впервые появляется параметр с данными от сканера.
// Предположим, переменная "ДанныеСобытия" или "Параметр" содержит строку от сканера
ДанныеСобытия = СтрЗаменить(ДанныеСобытия, Символ(182), ""); // Заменяем символ табуляции на пустую строку
Важно: вносить изменения в типовую конфигурацию нужно через расширения, чтобы не снимать ее с поддержки и не усложнять будущие обновления.
Этот метод является более сложным и, по сути, «костылем», но может сработать, если сканер из-за символа-разделителя отправляет данные несколькими порциями. Логика такова: мы собираем все поступающие «куски» в течение очень короткого времени и объединяем их.
Как это реализовать:
БуферДанныхСканера (тип Массив).
ОбработкаОповещения не вызывайте сразу стандартную логику, а добавляйте пришедший Параметр в массив БуферДанныхСканера.
// В процедуре ОбработкаОповещения
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ScanData" Тогда
// Если буфер еще пуст, это первая порция данных
Если БуферДанныхСканера.Количество() = 0 Тогда
ПодключитьОбработчикОжидания("СобратьШтрихкод", 0.1, Истина);
КонецЕсли;
БуферДанныхСканера.Добавить(Параметр);
Иначе
// Стандартная обработка других оповещений
КонецЕсли;
КонецПроцедуры
СобратьШтрихкод вы «склеиваете» все части из буфера, очищаете от символа табуляции и передаете на дальнейшую обработку.
&НаКлиенте
Процедура СобратьШтрихкод()
// Объединяем все части, которые успели прийти
ПолныйШтрихкод = "";
Для Каждого Часть Из БуферДанныхСканера Цикл
ПолныйШтрихкод = ПолныйШтрихкод + Часть;
КонецЦикла;
// Очищаем буфер для следующего сканирования
БуферДанныхСканера.Очистить();
// Выполняем замену (на всякий случай, если символ остался)
ПолныйШтрихкод = СтрЗаменить(ПолныйШтрихкод, Символ(182), "");
// Теперь вызываем стандартную обработку с уже собранным штрихкодом
// Например, через вызов экспортной процедуры общего модуля
МенеджерОборудованияУТКлиент.ОбработатьДанныеСканера(ПолныйШтрихкод);
КонецПроцедуры
Внимание: этот метод требует аккуратной отладки, так как при очень быстром сканировании нескольких разных штрихкодов есть риск их случайного объединения.
Проблема с некорректными символами в штрихкодах, хоть и редкая, но вполне решаемая. Проанализировав ситуацию, мы можем выделить два основных пути:
В любом случае, перед внедрением решения в рабочую среду необходимо провести тщательное тестирование, чтобы убедиться, что исправление не повлияло на корректную работу другого торгового оборудования.