В современной розничной торговле часто возникает необходимость использовать один и тот же QR-код для разных целей. С одной стороны, маркетологам важно, чтобы покупатель мог отсканировать код смартфоном и перейти на страницу товара в интернет-магазине. С другой стороны, кассиру необходимо использовать этот же код для быстрого поиска позиции в рабочем месте кассира (РМК) или документе поступления. Рассмотрим ситуацию, когда при сканировании такого "комбинированного" кода 1С выдает ошибку «Создать новую позицию?» или открывает пустое окно поиска.
Проанализируем ситуацию: когда вы создаете штрихкод для номенклатуры и записываете в него текстовую строку вида https://myshop.ru/tovar123, 1С генерирует изображение QR-кода именно с этим содержанием. При сканировании в режиме 1С:Предприятие драйвер торгового оборудования передает программе всю считанную строку целиком.
Стандартная логика 1С настроена на то, чтобы искать точное совпадение полученных данных в регистре сведений ШтрихкодыНоменклатуры. Если в базе зарегистрирован просто код tovar123, а сканер передает https://myshop.ru/tovar123, система не находит соответствия и предлагает создать новую карточку товара. Нам необходимо научить программу "отсекать" лишнюю часть ссылки, оставляя только полезный идентификатор.
Разберем, как можно модифицировать код обработки события сканирования. Наиболее часто логика обработки внешнего события сосредоточена в процедуре ОбработкаОповещения. Посмотрим на пример реализации, который позволяет динамически проверять наличие URL-префикса в считанных данных и очищать их перед поиском.
Предположим, что все ваши ссылки имеют стандартный вид и фиксированную длину префикса. В этом случае мы можем применить следующий алгоритм в модуле формы РМК или списка номенклатуры:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло от торгового оборудования
Если Источник = "ПодключаемоеОборудование" И ВводДоступен() И ИмяСобытия = "ScanData" Тогда
ДанныеСканирования = "";
// Проверяем формат передаваемых данных (массив или одиночное значение)
Если Параметр[1] = Неопределено Тогда
ДанныеСканирования = Параметр[0];
Иначе
ДанныеСканирования = Параметр[1][1];
КонецЕсли;
// Определяем префикс, который нужно отсечь (например, адрес сайта)
АдресСайта = "https://myshop.ru/item/";
ДлинаПрефикса = СтрДлина(АдресСайта);
// Проанализируем считанную строку
Если Лев(ДанныеСканирования, ДлинаПрефикса) = АдресСайта Тогда
// Извлекаем только код товара, который идет после URL
ШтрихкодДляПоиска = Сред(ДанныеСканирования, ДлинаПрефикса + 1);
Иначе
// Если ссылки нет, используем считанные данные как есть
ШтрихкодДляПоиска = ДанныеСканирования;
КонецЕсли;
// Далее вызываем стандартную процедуру поиска товара по очищенному коду
// Например: РаботаСНоменклатурой.НайтиПоШтрихкоду(ШтрихкодДляПоиска);
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он позволяет сохранить функциональность QR-кода для мобильных устройств покупателей, не ломая при этом работу учетной системы.
Проанализируем более сложную ситуацию: что если структура ссылок может меняться (например, используется протокол http вместо https или к ссылке добавляются UTM-метки для аналитики)? В этом случае жесткое отсечение по количеству символов не сработает.
Рекомендуем использовать регулярные выражения (RegEx). Хотя в языке 1С нет встроенного объекта для работы с RegEx, мы можем воспользоваться объектом VBScript.RegExp. Рассмотрим, как извлечь только цифровой код из любой строки:
Функция ИзвлечьКодИзСсылки(Знач ИсходнаяСтрока)
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Ложь;
// Ищем последовательность цифр в конце ссылки
RegExp.Pattern = "(\d+)$";
Matches = RegExp.Execute(ИсходнаяСтрока);
Если Matches.Count > 0 Тогда
Возврат Matches.Item(0).Value;
Иначе
Возврат ИсходнаяСтрока;
КонецЕсли;
КонецФункции
Рассмотрим альтернативный вариант, который не требует изменения программного кода. Если номенклатурных позиций в магазине немного, мы можем пойти по пути «соответствия данных». Для этого в карточке номенклатуры в поле Штрихкод необходимо записать не короткий цифровой код, а полную URL-ссылку.
Порядок действий в этом случае:
https://myshop.ru/tovar123 в поле штрихкода.Теперь, когда сканер передаст ссылку целиком, 1С найдет точное совпадение в регистре сведений и мгновенно подберет товар. Важный нюанс: при таком подходе, если вы решите изменить домен сайта или структуру ссылок, вам придется обновлять штрихкоды у всех товаров в базе и перепечатывать этикетки.
Выясним причину, по которой сканер может выдавать ошибку даже при правильной настройке кода. QR-коды часто кодируются в UTF-8. Если в URL-ссылке присутствуют кириллические символы, сканер в режиме имитации клавиатуры (HID) может передавать их некорректно, превращая в "кракозябры".
Для стабильной работы мы рекомендуем:
: и / могут быть заменены на Ж и ..Посмотрим на перспективу развития автоматизации. Чтобы не придумывать собственные "костыли" с обрезкой строк, профессиональное сообщество разработало стандарт GS1 Digital Link. Это формат, который превращает обычный штрихкод в веб-ссылку, понятную и браузеру, и сканеру 1С.
Структура такого кода строго регламентирована. 1С последних версий (в составе БПО) начинает поддерживать разбор таких ссылок "из коробки". Если ваша конфигурация поддерживает этот стандарт, достаточно генерировать QR-код по правилам GS1, и система сама поймет, где в этой ссылке зашифрован GTIN товара, проигнорировав адрес сайта. Это самый надежный и правильный метод для долгосрочного использования.
Подведем итоги нашего анализа. Проблема со сканированием QR-кодов со ссылками решается тремя путями:
Во-первых, самым быстрым способом является запись полной ссылки прямо в регистр штрихкодов товара.
Во-вторых, более гибким и надежным методом считается модификация процедуры ОбработкаОповещения, где программно отсекается адресная часть ссылки.
В-третьих, важно правильно настроить оборудование (сканер), переведя его в режим эмуляции COM-порта для исключения ошибок кодировки.
Выбор метода зависит от ваших технических возможностей и количества товаров. Для небольшого магазина подойдет ручное заполнение ссылок, а для крупной сети лучше реализовать универсальный обработчик в общем модуле МенеджерОборудованияКлиент, чтобы изменения коснулись всех рабочих мест сразу.