В типовых конфигурациях 1С, использующих Библиотеку подключаемого оборудования (БПО), работа с электронными весами (без печати этикеток) обычно реализована по запросу. Это означает, что пользователь должен нажать кнопку в интерфейсе, после чего программа посылает команду драйверу, опрашивает порт и получает текущее значение. Однако в условиях высокоинтенсивной работы склада или производства такой подход замедляет процесс. Рассмотрим, как реализовать работу весов по аналогии со сканером штрихкодов — через механизм ВнешнееСобытие.
Стандартная архитектура БПО предполагает синхронное взаимодействие. Проблема заключается в том, что драйвер весов активизирует COM-порт только в момент вызова метода ПолучитьВес. Чтобы весы работали как сканер (асинхронно), они должны постоянно транслировать данные в порт, а 1С должна «слушать» этот порт в фоновом режиме. Разберем основные способы реализации этой задачи.
Большинство профессиональных весов (например, марок CAS, Масса-К или Штрих-М) поддерживают режим Stream Mode. В этом режиме устройство непрерывно отправляет пакеты данных с текущим весом несколько раз в секунду.
Чтобы 1С смогла обработать этот поток как внешнее событие, нам потребуется специальный драйвер или внешняя компонента (ВК), написанная на Native API или C++. Рассмотрим логику работы такой компоненты:
МенеджерОборудования.ВнешнееСобытие в 1С.Проанализируем пример кода на стороне 1С для обработки такого события:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "Весы" И Событие = "WeightChanged" Тогда
// Данные содержат строку с весом, например "10.550"
ТекущийВес = Число(Данные);
ОбработатьПолученныйВес(ТекущийВес);
КонецЕсли;
КонецПроцедуры
При работе в режиме потока данных возникает критическая проблема: 1С будет получать события постоянно (каждые 100-200 мс). Если просто записывать каждое значение в документ, база будет перегружена, а данные — некорректны из-за колебаний платформы в момент установки груза. Выясним причину необходимости алгоритма фильтрации.
Нам необходимо фиксировать вес только тогда, когда он «устоялся». Рассмотрим программный алгоритм стабилизации, который можно внедрить в промежуточное ПО или саму 1С:
// Переменные контекста модуля
Перем ПоследнийСтабильныйВес;
Перем СчетчикСовпадений;
Процедура ОбработатьПотокДанных(НовыйВес)
Если НовыйВес > 0 Тогда
Если НовыйВес = ПоследнийСтабильныйВес Тогда
СчетчикСовпадений = СчетчикСовпадений + 1;
Иначе
ПоследнийСтабильныйВес = НовыйВес;
СчетчикСовпадений = 0;
КонецЕсли;
// Если вес не менялся в течение 5 циклов опроса, считаем его верным
Если СчетчикСовпадений = 5 Тогда
ОповеститьСистемуОФиксации(НовыйВес);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Одной из главных сложностей является работа в терминальном режиме. Проброс COM-портов через RDP часто работает нестабильно, а самописные драйверы могут терять связь. Разберем более надежный современный подход — использование Ethernet-весов или преобразователей RS-232 в Ethernet (например, Moxa NPort).
В этом случае логика меняется: нам не нужен локальный драйвер. Мы можем использовать небольшое внешнее приложение (написанное на Python, C# или Go), которое работает на сервере или на рабочем месте кладовщика. Это приложение:
Для передачи данных в 1С из такого «Весового сервера» можно использовать технологию HTTP-сервисов или WebSockets. Это полностью снимает проблему драйверов и терминальных сессий.
Если бюджет проекта ограничен, рассмотрим вариант использования утилит-эмуляторов. Эти программы читают данные из COM-порта и «вбрасывают» их в активное окно Windows так, будто они набраны на клавиатуре.
Для корректной работы в 1С настроим утилиту следующим образом:
F7) и суффикс (например, Enter).F7, который открывает поле ввода.Enter.Важно: Этот метод прост, но имеет минус — окно 1С должно быть в фокусе, и курсор должен стоять в правильном месте.
Если вы хотите остаться в рамках стандартной БПО, но реализовать асинхронность, проанализируем возможность модификации логики работы со сканером. В некоторых конфигурациях можно «подменить» тип устройства. Если драйвер весов поддерживает генерацию событий (как, например, некоторые драйверы от «Клеверенс» или «Атол»), то весы настраиваются как устройство ввода.
Посмотрим на пример настройки бизнес-процесса, где сканер и весы работают в тандеме:
ВнешнееСобытие с типом "Scales".
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "Scanner" Тогда
// Логика поиска товара
ТекущийТовар = НайтиТоварПоШтрихкоду(Данные);
ИначеЕсли Источник = "Scales" Тогда
// Логика подстановки веса
Если ТекущийТовар <> Неопределено Тогда
ЗаписатьВесВСтроку(ТекущийТовар, Число(Данные));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Реализация весов через внешнее событие — это отличный способ ускорить работу персонала. Выбор конкретного метода зависит от вашей инфраструктуры:
Помните, что при использовании любого асинхронного метода критически важно реализовать программную отсечку «шума» и фиксацию только стабильного веса, чтобы избежать ошибок в управленческом учете.