Почему в 1С:Розница 3.0 отваливается сканер и возникает ошибка «ЭтоНеФормализованныйКодМаркировки»?

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

При автоматизации розничной торговли и переходе на работу с локальным модулем «Честный Знак» (ЛМ ЧЗ) пользователи конфигурации 1С:Розница 3.0 нередко сталкиваются с неприятным плавающим сбоем. В процессе сканирования маркированной продукции (табачные изделия, молочная продукция, упакованная вода) в рабочем месте кассира (РМК) возникает критическая ошибка встроенного языка, после чего сканер штрихкодов полностью перестает реагировать на считывание любых кодов до перезапуска сеанса программы.

Проанализируем текст исключения, выясним внутреннюю причину такого поведения подсистемы маркировки и разберем по шагам действенные способы решения проблемы.

Стек вызова и симптомы ошибки

Сбой выглядит следующим образом: при попытке считать код DataMatrix система выдает ошибку:

Значение не является значением объектного типа (ЭтоНеФормализованныйКодМаркировки)

Рассмотрим стек вызовов, приводящий к возникновению исключения:


{ОбщийМодуль.РазборКодаМаркировкиИССлужебныйКлиентСервер.Модуль(1743)}:Если ОбщийМодуль.ЭтоНеФормализованныйКодМаркировки(ПараметрыРазбораКодаМаркировки, Настройки, ДанныеРезультата, РезультатБезФильтра) Тогда
{ОбщийМодуль.РазборКодаМаркировкиИССлужебныйКлиентСервер.Модуль(158)}:Если ЭтоНеформализованныйКодМаркировки(ПараметрыРазбораКодаМаркировки, Настройки,
{ОбщийМодуль.РазборКодаМаркировкиИССлужебный.Модуль(32)}:РезультатРазбора = РазборКодаМаркировкиИССлужебныйКлиентСервер.РазобратьКодМаркировки(
{ОбщийМодуль.РазборКодаМаркировкиИССлужебныйКлиентСервер.Модуль(2211)}:РезультатРазбора = ПараметрыОбработкиКодаМаркировки.МодульКонтекста.РазобратьКодМаркировки(
...
{Обработка.РабочееМестоКассира.Форма.ФормаРМК.Форма(13631)}:ОбработатьШтрихкодКлиент(Штрихкод);
{ОбщийМодуль.ИнтеграцияПодсистемБПОКлиент.Модуль(132)}:Результат = МенеджерОборудованияКлиент.ОбработатьСобытиеОтУстройства(ОписаниеСобытия, ОписаниеОшибки);
{МодульУправляемогоПриложения(106)}:ИнтеграцияПодсистемБПОКлиент.ОбработкаВнешнегоСобытия(Источник, Событие, Данные);

Выясним причину возникновения сбоя

Проанализируем фрагмент исходного кода в общем модуле РазборКодаМаркировкиИССлужебныйКлиентСервер в процедуре ЭтоНеформализованныйКодМаркировки:


Для Каждого ИмяОбщегоМодуля Из Настройки.ИменаОбщихМодулей Цикл
    ОбщийМодуль = ПараметрыРазбораКодаМаркировки.ОбщиеМодулиРазбораКМ[ИмяОбщегоМодуля];
    Если ОбщийМодуль.ЭтоНеФормализованныйКодМаркировки(ПараметрыРазбораКодаМаркировки, Настройки, ДанныеРезультата, РезультатБезФильтра) Тогда
        // Обработка неформализованного кода
    КонецЕсли;
КонецЦикла;

Ошибка возникает из-за того, что переменная ОбщийМодуль вместо ссылки на программный модуль содержит значение Неопределено. Соответственно, при обращении к методу через точку платформа генерирует исключение о попытке обращения к несуществующему свойству или методу не объектного типа.

Это происходит по нескольким причинам:

  1. Сбой инициализации кэша модулей разбора: В определенных релизах конфигурации коллекция ПараметрыРазбораКодаМаркировки.ОбщиеМодулиРазбораКМ сбрасывается или не инициализируется повторно при переподключении сеанса.
  2. Использование веб-сервера (Apache / IIS): При кратковременном простое кассы HTTP-сессия между тонким клиентом и веб-сервером может истечь. При следующем обращении сеанс переподключается, но контекст разбора марок теряется, что провоцирует ошибку.
  3. Таймауты ЛМ ЧЗ: Если локальный модуль проверки марок не отвечает вовремя, алгоритм перенаправляет поток выполнения на резервную ветку проверки, где кэш модулей оказывается пустым.

Почему сканер блокируется после ошибки?

Посмотрим на поведение подсистемы подключаемого оборудования (БПО). При сканировании драйвер генерирует внешнее событие ОбработкаВнешнегоСобытия. Когда выполнение кода падает с необработанным исключением, процедура обработки события прерывается аварийно. Механизмы БПО не успевают вернуть порт сканера (COM-порт или Native API) в исходное состояние готовности к приему новых данных. Порт остается заблокированным, и устройство перестает реагировать на штрихкоды до полного перезапуска тонкого клиента 1С.

Способы устранения проблемы

Рассмотрим по шагам комплекс мер, позволяющих полностью устранить данную ошибку.

1. Установка официальных исправлений (патчей) 1С

Фирма «1С» признала наличие этой ошибки в подсистеме интеграции с ИС МП и выпустила корректирующие патчи. Это основное и наиболее быстрое решение проблемы:

  1. Перейдем в раздел Администрирование — Обслуживание — Обновление программы.
  2. Откроем пункт Установка обновлений и исправлений (патчей).
  3. Выполним автоматический поиск или загрузим вручную актуальные патчи для интеграции с ГосИС и подсистемы маркировки (в частности, патчи серий EF_00_00728808, EF_00_00737192, EF_00_00737490 или их свежие ревизии для используемого релиза 1С:Розницы).
  4. После загрузки патчей перезапустим сервер «1С:Предприятия» и клиентские сеансы на кассах.

2. Обновление драйвера торгового оборудования

Проверим используемую версию драйвера сканера штрихкодов в РМК. Устаревшие версии драйверов некорректно обрабатывают спецсимволы разделителей групп (GS-символы) и зависают при прерывании транзакций сканирования.

  1. Откроем Администрирование — Подключаемое оборудование.
  2. Выберем используемый сканер штрихкода и проверим используемую компоненту.
  3. Обновим драйвер 1С:Сканеры штрихкода (NativeApi) до актуальной версии из состава БПО (не ниже версии 10.6.2.x).

3. Настройка параметров веб-сервера Apache

Если кассовые места подключены через веб-сервер, настроим таймауты соединений, чтобы предотвратить неконтролируемый сброс сеансов при бездействии кассира:

  1. Откроем конфигурационный файл httpd.conf веб-сервера Apache.
  2. Проверим и при необходимости увеличим параметры времени жизни соединений:
    
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 300
    Timeout 600
    
  3. В файле публикации default.vrd убедимся в корректной настройке пула соединений, чтобы исключить потерю серверного контекста сеанса.
  4. Перезапустим службу веб-сервера.

4. Переход на прямое подключение тонкого клиента (TCP)

Если кассовые места находятся в единой локальной сети с сервером «1С:Предприятия», рекомендуется отказаться от публикации базы через веб-сервер Apache для рабочих мест кассиров. Прямое подключение тонкого клиента к кластеру серверов 1С по протоколу TCP через порт 1541 работает значительно стабильнее, удерживает открытые сеансы без сброса кэша и исключает промежуточные ошибки веб-шлюзов.

5. Проверка доступности Локального модуля «Честный Знак»

Убедимся, что служба ЛМ ЧЗ работает корректно и не вызывает таймаутов:

  1. Проверим состояние системной службы ЛМ ЧЗ на кассе или сервере: служба должна иметь статус Работает.
  2. Проверим сетевые экраны (брандмауэр Windows и антивирусные программы), чтобы обращения 1С к локальному порту ЛМ ЧЗ не блокировались.
  3. В настройках интеграции с ИС МП увеличим время ожидания ответа от сервиса проверки кодов маркировки, чтобы исключить сваливание системы в аварийный режим разбора марок.
← На главную