Почему 1С выгружает товары только на одни весы из двух и как это исправить?

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

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

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

Причина 1. Одинаковый внутренний номер весов в системной памяти

Самая распространенная аппаратная причина — копирование системных настроек с одних весов на другие с помощью сервисной утилиты производителя без изменения идентификатора устройства.

Сетевая плата и прошивка весов «Штрих-Принт» используют внутренний номер устройства (Broadcast/Target ID) для подтверждения сетевых пакетов. Если при переносе параметров поменяли IP-адрес, но оставили прежним внутренний номер в энергонезависимой памяти, весы могут игнорировать адресованные им пакеты либо драйвер будет ошибочно адресовать команды первому найденному в сети устройству с таким же номером.

Проанализируем шаги по исправлению этой ситуации:

  1. Подключимся к весам через утилиту «Тест драйвера» или сервисную утилиту конфигурирования «Штрих-М».
  2. Перейдем в раздел Таблицы и откроем Таблицу 1 («Системные настройки»).
  3. Найдем поле «Номер весов» (или «Сетевой номер»).
  4. Установим уникальный номер для каждого физического устройства (например, весы №1 — номер 1, весы №2 — номер 2).
  5. Сохраним изменения в энергонезависимой памяти устройства и выполним перезагрузку весов по питанию.

Причина 2. Особенности работы COM-объекта драйвера и логических устройств (ЛУ)

В типовых решениях 1С (особенно на обычных формах, таких как «Управление торговлей» ред. 10.3 / 2.2) объект внешней компоненты драйвера создается один раз при инициализации торгового оборудования. Драйвер весов «Штрих-М» хранит список подключенных весов в виде таблицы логических устройств (ЛУ) в системном реестре Windows.

Рассмотрим, как 1С выполняет переключение между весами в коде обработки обслуживания:


Функция НачатьВыгрузку()
    // Установка активного логического устройства перед передачей данных
    Объект.Драйвер.НомерЛУ = Объект.ИДУстройства;
    Объект.Драйвер.УстановитьАктивноеЛУ();
КонецФункции

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

  1. Переполнение таблицы ЛУ: если при каждой выгрузке обработка вызывает метод добавления нового ЛУ (AddLD / ДобавитьЛУ) вместо выбора существующего, таблица драйвера быстро заполняется (до лимита в 30–99 записей). После этого драйвер перестает регистрировать новые весы и перенаправляет все вызовы на первое доступное ЛУ.
  2. Затирание настроек в едином потоке: драйвер весов не предназначен для параллельной многопоточной отправки. Все параметры подключения (IPAddress, TCPPort, AdminPassword) должны быть явно переданы в свойства драйвера непосредственно перед установкой связи с конкретными весами.
  3. Проблемы с правами в реестре: при работе в терминальном режиме (RDP) драйвер может не сохранять созданные ЛУ в ветке HKCU\Software\SHTRIH-M из-за ограничений прав пользователя, сбрасывая активный профиль на значение по умолчанию.

Пошаговый алгоритм настройки стабильной выгрузки

Разберем по шагам, как гарантировать корректную передачу данных на группу весов:

  1. Предварительная настройка ЛУ в драйвере: откроем тест драйвера на рабочем месте и вручную создадим нужное количество логических устройств (ЛУ 1, ЛУ 2 и т.д.), жестко привязав к каждому соответствующий IP-адрес, порт и сетевой номер весов. Проверим связь с каждым устройством по кнопке «Установить связь».
  2. Явная передача параметров в 1С: убедимся, что в обработке обслуживания перед циклом передачи товаров (PLU) вызывается явная инициализация свойств драйвера из справочника «Торговое оборудование» 1С:
    
    Объект.Драйвер.НомерЛУ = ИдентификаторВесов;
    Объект.Драйвер.УстановитьАктивноеЛУ();
    
    Объект.Драйвер.IPAddress = ТекущийIPАдрес;
    Объект.Драйвер.TCPPort = ТекущийПорт;
    Объект.Драйвер.AdminPassword = ПарольАдминистратора;
    Объект.Драйвер.ConnectionTimeout = 3000;
    
    Если Объект.Драйвер.Connect() <> 0 Тогда
        ВызватьИсключение "Не удалось установить связь с весами: " + Объект.Драйвер.ErrorDescription;
    КонецЕсли;
    
  3. Принудительный разрыв сессии: после окончания выгрузки данных на текущие весы обязательно вызываем метод Disconnect(), чтобы освободить сетевой сокет на плате весов перед переходом к следующей итерации цикла.
  4. Увеличение таймаутов: при загрузке больших списков номенклатуры весам требуется время на запись данных во внутреннюю flash-память. Рекомендуется устанавливать параметр ConnectionTimeout не менее 3000–5000 мс.
← На главную