В процессе интеграции торгового оборудования, в частности весов ИКС-Маркет 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-разрядной операционной системы регистрация 32-битных DLL должна выполняться специфическим образом. Выполним следующие шаги:
SysWOW64, а не из стандартной System32. Команда должна выглядеть примерно так:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКВашейПапке\ICS_NT.dll"
Посмотрим на пример кода, который используется для работы с весами. Важно соблюдать последовательность команд: инициализация порта, чтение данных и обязательное освобождение ресурса. Рассмотрим типовой фрагмент кода:
&НаКлиенте
Процедура ПолучитьВес(Команда)
// Создаем экземпляр 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;
Возврат РезультатВес;
КонецФункции
Если программный код корректен, а версия платформы соответствует разрядности, проверим физический уровень передачи данных. Весы ICS 15NT часто подключаются через переходники USB-to-Serial. Проанализируем настройки в Диспетчере устройств Windows:
COM-порт.AddIn.ICS_NT.Если стандартная компонента ICS_NT.dll продолжает работать нестабильно на новых релизах 1С 8.3, рассмотрим вариант использования альтернативного драйвера — Scale_C.dll. Данная библиотека часто поставляется в комплекте с сервисным ПО для весов ИКС-Маркет и имеет более высокую устойчивость к обрывам связи. Принцип работы с ней в коде 1С схож с использованием COM-объекта, но методы могут называться иначе (согласно документации к конкретной версии драйвера).
Также стоит проверить режим работы самих весов через их сервисное меню. Весы должны находиться в режиме "Передача по запросу". Если весы настроены на "Постоянную передачу", буфер порта будет постоянно забит данными, и метод get_weight может не успевать корректно обработать входящий поток символов, интерпретируя его как ошибку и возвращая 0.
Подведем итог: для успешного получения веса нам необходимо обеспечить совпадение разрядности платформы 1С и компоненты, правильно зарегистрировать DLL в системной папке SysWOW64, настроить параметры COM-порта в Windows и реализовать в коде цикл ожидания стабильного значения веса.