При автоматизации розничной торговли и переходе на работу с локальным модулем «Честный Знак» (ЛМ ЧЗ) пользователи конфигурации 1С:Розница 3.0 нередко сталкиваются с неприятным плавающим сбоем. В процессе сканирования маркированной продукции (табачные изделия, молочная продукция, упакованная вода) в рабочем месте кассира (РМК) возникает критическая ошибка встроенного языка, после чего сканер штрихкодов полностью перестает реагировать на считывание любых кодов до перезапуска сеанса программы.
Проанализируем текст исключения, выясним внутреннюю причину такого поведения подсистемы маркировки и разберем по шагам действенные способы решения проблемы.
Сбой выглядит следующим образом: при попытке считать код DataMatrix система выдает ошибку:
Значение не является значением объектного типа (ЭтоНеФормализованныйКодМаркировки)
Рассмотрим стек вызовов, приводящий к возникновению исключения:
{ОбщийМодуль.РазборКодаМаркировкиИССлужебныйКлиентСервер.Модуль(1743)}:Если ОбщийМодуль.ЭтоНеФормализованныйКодМаркировки(ПараметрыРазбораКодаМаркировки, Настройки, ДанныеРезультата, РезультатБезФильтра) Тогда
{ОбщийМодуль.РазборКодаМаркировкиИССлужебныйКлиентСервер.Модуль(158)}:Если ЭтоНеформализованныйКодМаркировки(ПараметрыРазбораКодаМаркировки, Настройки,
{ОбщийМодуль.РазборКодаМаркировкиИССлужебный.Модуль(32)}:РезультатРазбора = РазборКодаМаркировкиИССлужебныйКлиентСервер.РазобратьКодМаркировки(
{ОбщийМодуль.РазборКодаМаркировкиИССлужебныйКлиентСервер.Модуль(2211)}:РезультатРазбора = ПараметрыОбработкиКодаМаркировки.МодульКонтекста.РазобратьКодМаркировки(
...
{Обработка.РабочееМестоКассира.Форма.ФормаРМК.Форма(13631)}:ОбработатьШтрихкодКлиент(Штрихкод);
{ОбщийМодуль.ИнтеграцияПодсистемБПОКлиент.Модуль(132)}:Результат = МенеджерОборудованияКлиент.ОбработатьСобытиеОтУстройства(ОписаниеСобытия, ОписаниеОшибки);
{МодульУправляемогоПриложения(106)}:ИнтеграцияПодсистемБПОКлиент.ОбработкаВнешнегоСобытия(Источник, Событие, Данные);
Проанализируем фрагмент исходного кода в общем модуле РазборКодаМаркировкиИССлужебныйКлиентСервер в процедуре ЭтоНеформализованныйКодМаркировки:
Для Каждого ИмяОбщегоМодуля Из Настройки.ИменаОбщихМодулей Цикл
ОбщийМодуль = ПараметрыРазбораКодаМаркировки.ОбщиеМодулиРазбораКМ[ИмяОбщегоМодуля];
Если ОбщийМодуль.ЭтоНеФормализованныйКодМаркировки(ПараметрыРазбораКодаМаркировки, Настройки, ДанныеРезультата, РезультатБезФильтра) Тогда
// Обработка неформализованного кода
КонецЕсли;
КонецЦикла;
Ошибка возникает из-за того, что переменная ОбщийМодуль вместо ссылки на программный модуль содержит значение Неопределено. Соответственно, при обращении к методу через точку платформа генерирует исключение о попытке обращения к несуществующему свойству или методу не объектного типа.
Это происходит по нескольким причинам:
ПараметрыРазбораКодаМаркировки.ОбщиеМодулиРазбораКМ сбрасывается или не инициализируется повторно при переподключении сеанса.Посмотрим на поведение подсистемы подключаемого оборудования (БПО). При сканировании драйвер генерирует внешнее событие ОбработкаВнешнегоСобытия. Когда выполнение кода падает с необработанным исключением, процедура обработки события прерывается аварийно. Механизмы БПО не успевают вернуть порт сканера (COM-порт или Native API) в исходное состояние готовности к приему новых данных. Порт остается заблокированным, и устройство перестает реагировать на штрихкоды до полного перезапуска тонкого клиента 1С.
Рассмотрим по шагам комплекс мер, позволяющих полностью устранить данную ошибку.
Фирма «1С» признала наличие этой ошибки в подсистеме интеграции с ИС МП и выпустила корректирующие патчи. Это основное и наиболее быстрое решение проблемы:
EF_00_00728808, EF_00_00737192, EF_00_00737490 или их свежие ревизии для используемого релиза 1С:Розницы).Проверим используемую версию драйвера сканера штрихкодов в РМК. Устаревшие версии драйверов некорректно обрабатывают спецсимволы разделителей групп (GS-символы) и зависают при прерывании транзакций сканирования.
Если кассовые места подключены через веб-сервер, настроим таймауты соединений, чтобы предотвратить неконтролируемый сброс сеансов при бездействии кассира:
httpd.conf веб-сервера Apache.
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 300
Timeout 600
default.vrd убедимся в корректной настройке пула соединений, чтобы исключить потерю серверного контекста сеанса.Если кассовые места находятся в единой локальной сети с сервером «1С:Предприятия», рекомендуется отказаться от публикации базы через веб-сервер Apache для рабочих мест кассиров. Прямое подключение тонкого клиента к кластеру серверов 1С по протоколу TCP через порт 1541 работает значительно стабильнее, удерживает открытые сеансы без сброса кэша и исключает промежуточные ошибки веб-шлюзов.
Убедимся, что служба ЛМ ЧЗ работает корректно и не вызывает таймаутов: