Как исправить зависание РМК в «1С:Розница 2.3» при сканировании неизвестного штрихкода?

Пользователь 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

Каждый владелец розничной торговой точки или кассир хотя бы раз сталкивался с ситуацией, когда в разгар рабочего дня оборудование или программа начинают вести себя некорректно. Одной из наиболее неприятных и критических проблем в программе «1С:Розница 2.3» является внезапное зависание Рабочего места кассира (РМК) при попытке отсканировать штрихкод товара, которого нет в базе данных, либо у которого этот штрихкод просто не зарегистрирован в карточке номенклатуры.

В нормальном режиме работы система должна мгновенно отреагировать на неизвестный штрихкод, выдав предупреждающее диалоговое окно «Результаты поиска: Штрихкод не найден» или предложив сопоставить этот код с существующим товаром. Однако из-за программного сбоя в некоторых релизах ветки 2.3 этого не происходит. РМК просто «засыпает»: на экране не появляется никаких сообщений, а последующее сканирование даже заведомо корректных товаров полностью игнорируется системой. Единственным выходом для кассира остается аннулирование текущего чека, аварийное закрытие программы и ее повторный запуск. Проанализируем, почему возникает эта ошибка, и подробно разберем все существующие способы ее устранения — от простых пользовательских «лайфхаков» до профессиональных административных настроек оборудования и кода.

Выясняем причину: почему РМК «зависает» без предупреждения?

Для того чтобы понять природу этой неисправности, заглянем под капот программного кода конфигурации «1С:Розница». При сканировании штрихкода торговое оборудование посылает в систему специальный сигнал. Платформа перенаправляет этот сигнал в предопределенную процедуру ОбработкаВнешнегоСобытия, расположенную в модуле формы РМК.

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

Ниже мы рассмотрим по шагам, как решить эту проблему различными методами.

Способ 1. Временное решение: активация интеграции с ИС МП (Маркировкой)

Самым быстрым и удивительным способом решения проблемы, который обнаружили пользователи на практике, является включение интеграции с государственной информационной системой маркировки (ИС МП). Это решение не требует привлечения программистов или обновления всей базы данных.

Разберем, как активировать эту настройку по шагам:

  1. Перейдем в раздел меню Администрирование.
  2. Найдем и откроем пункт Интеграция с ИС МП (обувь, одежда, табак...).
  3. Установим галочку (флаг активности) напротив абсолютно любого вида маркируемой продукции (даже если ваша торговая точка не занимается продажей маркированных товаров, например, выберем «Альтернативная табачная продукция» или «Обувная продукция»).
  4. Сохраним настройки и перезапустим сеанс работы в режиме РМК.

Почему этот «лайфхак» работает? Дело в том, что логика обработки штрихкодов в модулях «1С:Розница» разделена на две разные ветки. Если интеграция с ИС МП полностью отключена, программа использует упрощенный старый алгоритм поиска штрихкода, содержащий ту самую ошибку зависания. При включении маркировки (даже для одного вида товаров) весь поток входящих данных от сканера начинает проходить через современный универсальный модуль интеграции с ГИС МТ. Этот модуль сначала детально анализирует структуру считанного кода (пытается определить, является ли он кодом маркировки DataMatrix или обычным EAN-13). Если код оказывается обычным штрихкодом и его нет в базе данных, этот модуль корректно и безопасно инициализирует стандартное диалоговое окно сопоставления, обходя проблемный «зависающий» участок старого кода.

Способ 2. Переход на современный интерфейс «Новое РМК»

Если ваша конфигурация «1С:Розница 2.3» обновлена до версий 2.3.10 и выше, настоятельно рекомендуется отказаться от использования устаревшего режима кассира и переключиться на полностью переработанный интерфейс — Новое РМК.

В новом интерфейсе разработчики 1С кардинально переписали всю логику взаимодействия с торговым оборудованием. Код обработки внешних событий там спроектирован с нуля с учетом асинхронных вызовов платформы 1С v8.3. Это полностью исключает зависание интерфейса кассира при любых непредвиденных ситуациях (включая обрывы связи с фискальным накопителем или сканирование некорректных кодов).

Чтобы включить новый интерфейс, выполним следующие действия:

  1. Перейдем в раздел Администрирование -> Продажи.
  2. В блоке настроек розничных продаж найдем пункт Использовать новое РМК и установим соответствующий флаг.
  3. Настроим рабочее место кассира под ваши нужды через появившуюся ссылку настройки нового интерфейса.

Способ 3. Активация запрета сопоставления с неизвестными штрихкодами

В более поздних релизах конфигурации (начиная с версии 2.3.20) разработчики добавили специальный предохранитель для защиты кассиров от случайных зависаний системы сопоставления. Если кассиру в процессе работы в принципе запрещено самостоятельно привязывать новые штрихкоды к товарам прямо на кассе, эту функцию можно полностью отключить.

Рассмотрим, как настроить данный запрет:

  1. Откроем настройки РМК в разделе Продажи.
  2. Найдем опцию Запретить сопоставление с неизвестным штрихкодом.
  3. Активируем этот параметр.

После включения этой опции программа при сканировании неизвестного штрихкода даже не будет пытаться открыть ресурсоемкое модальное окно сопоставления номенклатуры. Вместо этого касса моментально отобразит лаконичное всплывающее текстовое сообщение «Штрихкод не найден в базе данных» прямо на панели уведомлений РМК, сохранив работоспособность оборудования для дальнейших продаж.

Способ 4. Перевод сканера штрихкодов из режима клавиатуры в режим эмуляции COM-порта

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

Если компьютер кассира в этот момент занят фоновыми задачами (например, обменом данными или проведением сложного документа) или если работа ведется через терминальный сервер (RDP), поток символов от сканера может разорваться или передаться не полностью. 1С получает поврежденный «огрызок» штрихкода, пытается сопоставить его с базой данных, сталкивается с ошибкой позиционирования курсора в интерфейсе и намертво зависает.

Для решения этой проблемы переведем сканер в режим эмуляции COM-порта (Virtual COM):

  1. Найдем инструкцию к вашему сканеру штрихкодов (ее можно скачать с официального сайта производителя).
  2. Найдем в инструкции специальный управляющий штрихкод с подписью «USB OEM», «Virtual COM Port» или «Enable Uni-Directional USB Serial Emulation» и отсканируем его.
  3. После этого операционная система Windows обнаружит новое устройство. При необходимости установим драйвер виртуального COM-порта от производителя сканера (для многих современных моделей драйвер устанавливается автоматически).
  4. Откроем Диспетчер устройств Windows и проверим, под каким номером определился порт устройства (например, COM3).
  5. Запустим «1С:Розница» с правами администратора, перейдем в раздел Администрирование -> Подключаемое оборудование.
  6. Откроем карточку вашего сканера штрихкодов и заменим используемый драйвер на стандартный «1С:Сканеры штрихкода (NativeApi)».
  7. В настройках драйвера укажем порт подключения (например, наш COM3) и нажмем кнопку Тест устройства для проверки корректности считывания сигналов.

При работе через COM-порт данные передаются в программу единым защищенным пакетом через прерывание операционной системы. Это полностью исключает утерю символов при передаче и существенно повышает стабильность работы кассового модуля.

Способ 5. Очистка кэша конфигурации и исправление индексов поиска

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

Выполним профилактическое обслуживание базы данных по шагам:

Очистка локального кэша 1С:

  1. Закроем все запущенные сеансы работы с программой «1С:Предприятие».
  2. Откроем список баз данных в окне запуска 1С.
  3. Выделим нашу базу данных «Розница» и нажмем кнопку Удалить (сама база данных при этом останется на диске, удалится только ссылка на нее).
  4. Нажмем кнопку Добавить и заново пропишем путь к папке с базой данных (или укажем адрес сервера для клиент-серверного варианта). При повторном добавлении базы платформа автоматически создаст чистые папки кэша, удалив все устаревшие временные файлы форм интерфейса.

Восстановление индексов полнотекстового поиска:

  1. Зайдем в программу под учетной записью администратора системы.
  2. Перейдем в раздел Администрирование -> Поддержка и обслуживание -> Управление полнотекстовым поиском.
  3. Нажмем на кнопку Очистить индекс, чтобы удалить поврежденные индексные файлы.
  4. После завершения очистки нажмем кнопку Обновить индекс для создания новой, корректной поисковой базы.

Способ 6. Для программистов: отладка и доработка процедуры ОбработкаВнешнегоСобытия

Если вы являетесь программистом 1С или имеете базовые навыки конфигурирования, вы можете самостоятельно исправить ошибку в коде формы РМК с помощью механизма расширений, не снимая конфигурацию с поддержки.

Для этого нам необходимо проанализировать логику обработки внешнего события формы РМК. Ниже приведен пример безопасной структуры кода, которую можно внедрить в процедуру обработки сигналов сканера для предотвращения блокировок:


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

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

Подведем итоги. Мы подробно разобрали проблему зависания РМК при сканировании неизвестных товаров в программе «1С:Розница 2.3». Для быстрого решения «здесь и сейчас» отлично подойдет простой способ с включением галочки ИС МП. Для долгосрочного и стабильного решения рекомендуется обновить конфигурацию, переключиться на «Новое РМК» и настроить подключение сканера штрихкодов через эмуляцию COM-порта.

← На главную