Как исправить получение нулевого веса от весов ИКС-Маркет ICS 15NT в 1С 8.3

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

В процессе интеграции торгового оборудования, в частности весов ИКС-Маркет ICS 15NT, разработчики часто сталкиваются с ситуацией, когда драйвер успешно подключается, COM-объект инициализируется, но при вызове метода получения данных весы стабильно возвращают 0. Эта проблема может быть вызвана как программными особенностями платформы 1С:Предприятие, так и нюансами системной настройки операционной системы Windows и физического подключения через переходники.

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

Разберем причину: Версия платформы и разрядность компонентов

Проанализируем ситуацию, описанную пользователями. Одной из ключевых причин, по которой внешняя компонента ICS_NT.dll перестает корректно отдавать данные в версиях 1С старше 8.3.13, является изменение механизмов взаимодействия с 32-битными COM-объектами. Драйвер весов ИКС-Маркет является 32-битным (x86). Если вы запускаете 64-битную версию клиента 1С, прямой вызов такой компоненты через Новый COMОбъект("AddIn.ICS_NT") может либо завершиться ошибкой, либо работать некорректно, возвращая пустые значения.

Рассмотрим опыт решения проблемы: переход на версию платформы 8.3.10 часто исправляет ситуацию, так как в старых релизах 32-битные механизмы работали более прозрачно. Однако, если вы не можете сменить платформу, необходимо убедиться, что вы используете 32-битный толстый или тонкий клиент 1С даже в рамках актуальных релизов 8.3.

Правильная регистрация компоненты в 64-битной Windows

Выясним причину, по которой стандартная регистрация библиотеки может не давать результата. При использовании 64-разрядной операционной системы регистрация 32-битных DLL должна выполняться специфическим образом. Выполним следующие шаги:

  1. Запустим командную строку (cmd) строго от имени администратора.
  2. Используем утилиту регистрации из папки SysWOW64, а не из стандартной System32. Команда должна выглядеть примерно так:

    C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКВашейПапке\ICS_NT.dll"

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

Проанализируем программный код инициализации

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


&НаКлиенте
Процедура ПолучитьВес(Команда)
    // Создаем экземпляр COM-объекта
    Попытка
        Ics_nt = Новый COMОбъект("AddIn.ICS_NT");
    Исключение
        Сообщить("Не удалось загрузить компоненту ICS_NT. Проверьте регистрацию DLL.");
        Возврат;
    КонецПопытки;

    // Инициализируем порт (например, COM4)
    // Обратите внимание: метод Init ожидает номер порта как строку или число в зависимости от версии
    Ics_nt.Init("4");

    // Чтение веса
    Вес = Ics_nt.get_weight;

    Если Вес = 0 Тогда
        // Если вернулся 0, возможно весы еще не стабилизировались
        Сообщить("Весы вернули 0. Проверьте стабильность платформы или подключение.");
    Иначе
        ПолеКоличества = Вес; // Вес обычно возвращается в граммах
    КонецЕсли;

    // Важно закрыть соединение с портом
    Ics_nt.Uninit;
КонецПроцедуры

Решение проблемы "нестабильности" веса

Проанализируем документацию к оборудованию. Метод get_weight возвращает 0, если значение веса не было передано весами (например, из-за вибрации платформы или если товар только что положили). В коде 1С это выглядит как мгновенный опрос, который попадает в момент "успокоения" датчика.

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


&НаКлиенте
Функция ПолучитьСтабильныйВес()
    Ics_nt = Новый COMОбъект("AddIn.ICS_NT");
    Ics_nt.Init("4");
    
    РезультатВес = 0;
    
    // Делаем 10 попыток опроса с небольшой паузой
    Для Итерация = 1 По 10 Цикл
        ТекущийВес = Ics_nt.get_weight;
        
        Если ТекущийВес > 0 Тогда
            РезультатВес = ТекущийВес;
            Прервать; // Вес получен, выходим из цикла
        КонецЕсли;
        
        // В 1С для задержки можно использовать метод ожидания или пустой цикл (менее предпочтительно)
        // Для управляемых форм лучше использовать обработчик ожидания, 
        // но в простом случае допустима небольшая пауза.
    КонецЦикла;
    
    Ics_nt.Uninit;
    Возврат РезультатВес;
КонецФункции

Настройка USB-COM переходника и параметров порта

Если программный код корректен, а версия платформы соответствует разрядности, проверим физический уровень передачи данных. Весы ICS 15NT часто подключаются через переходники USB-to-Serial. Проанализируем настройки в Диспетчере устройств Windows:

  1. Откроем Диспетчер устройств и найдем наш COM-порт.
  2. Проверим Параметры порта. Для стабильной работы весов ИКС-Маркет обычно требуются следующие настройки:
    • Скорость (бит/с): 9600
    • Биты данных: 8
    • Четность: Нет
    • Стоповые биты: 1
    • Управление потоком: Нет
  3. Выясним, не занят ли порт другой программой. Часто службы мониторинга оборудования или драйверы торгового оборудования (например, АТОЛ или Штрих-М) могут сканировать порты и блокировать доступ для компоненты AddIn.ICS_NT.

Использование альтернативных библиотек

Если стандартная компонента ICS_NT.dll продолжает работать нестабильно на новых релизах 1С 8.3, рассмотрим вариант использования альтернативного драйвера — Scale_C.dll. Данная библиотека часто поставляется в комплекте с сервисным ПО для весов ИКС-Маркет и имеет более высокую устойчивость к обрывам связи. Принцип работы с ней в коде 1С схож с использованием COM-объекта, но методы могут называться иначе (согласно документации к конкретной версии драйвера).

Также стоит проверить режим работы самих весов через их сервисное меню. Весы должны находиться в режиме "Передача по запросу". Если весы настроены на "Постоянную передачу", буфер порта будет постоянно забит данными, и метод get_weight может не успевать корректно обработать входящий поток символов, интерпретируя его как ошибку и возвращая 0.

Подведем итог: для успешного получения веса нам необходимо обеспечить совпадение разрядности платформы 1С и компоненты, правильно зарегистрировать DLL в системной папке SysWOW64, настроить параметры COM-порта в Windows и реализовать в коде цикл ожидания стабильного значения веса.

← На главную