В процессе автоматизации складских и производственных процессов часто возникает задача минимизировать действия оператора. Идеальный сценарий работы с электронными весами выглядит так: сотрудник кладет товар на платформу, система дожидается стабилизации веса, автоматически фиксирует значение в документе и отправляет этикетку на печать. В этой статье мы подробно разберем, как реализовать такой функционал в 1С, используя возможности Библиотеки подключаемого оборудования (БПО) и расширения для учета веса и объема в документах, а также программные методы обхода ограничений некоторых драйверов.
Для начала проанализируем, как 1С взаимодействует с оборудованием. Большинство программистов привыкли к методу «запрос-ответ», когда мы вызываем функцию ПолучитьВес(). Однако для автоматизации нам нужна событийная модель. В современных версиях БПО реализована поддержка асинхронного получения данных, когда драйвер сам инициирует событие при изменении состояния устройства (например, когда вес стабилизировался).
Согласно стандартам разработки драйверов 1С, для весов предусмотрено событие Weighting (или Взвешивание). Чтобы система начала «слушать» весы, необходимо правильно инициализировать подключение и перевести драйвер в режим ожидания.
Рассмотрим стандартный код подключения весов при открытии формы. Нам важно убедиться, что оборудование подключается корректно и форма готова принимать внешние события. В модуле формы это обычно выглядит следующим образом:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Определяем типы оборудования, которые нам нужны
ТипыПодключаемогоОборудования = Новый Массив;
ТипыПодключаемогоОборудования.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПодключаемогоОборудования.ЭлектронныеВесы"));
// Проверяем использование оборудования в конфигурации
ИспользоватьПодключаемоеОборудование = ОбщегоНазначенияУТ.ИспользоватьПодключаемоеОборудование(ТипыПодключаемогоОборудования);
// Подключаем весы асинхронно
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, "ЭлектронныеВесы");
КонецПроцедуры
Обратите внимание на параметр ЭтотОбъект. Он указывает системе, что внешние события от драйверов должны направляться именно в данную форму.
Когда драйвер фиксирует стабилизацию веса, он посылает сигнал в 1С. Мы должны перехватить его в предопределенной процедуре ВнешнееСобытие. Выясним, как правильно идентифицировать событие весов:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "ПодключаемоеОборудование" Тогда
// Проверяем тип события. Для весов это обычно "Weighting"
Если Событие = "Weighting" Или Событие = "Взвешивание" Тогда
// Обрабатываем полученные данные
РазборРезультатаВзвешивания(Данные);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: данные, приходящие в параметре Данные, часто требуют дополнительной обработки. В БПО для этого существуют вспомогательные функции, которые преобразуют сырой ответ драйвера в структуру с числовым значением веса.
Если событие не приходит, проанализируем ситуацию глубже. Часто проблема кроется в том, что драйвер посылает событие, но оно «застревает» в недрах общих модулей БПО. Посмотрим на критически важный участок кода в общем модуле ПодключаемоеОборудованиеДрайверКлиент, где происходит диспетчеризация событий:
Функция ОбработатьСобытие(ОбъектДрайвера, ПараметрыПодключения, Событие, Данные) Экспорт
// ...
Если Событие = "Штрихкод" Или Событие = "Barcode" Тогда
// Логика для сканеров
ИначеЕсли Событие = "Взвешивание" Или Событие = "Weighting" Тогда
РезультатОбработки = ОбработатьСобытиеВеса(ПараметрыПодключения, Данные);
// Здесь можно поставить точку останова для проверки прихода данных
КонецЕсли;
// ...
КонецФункции
Если вы не видите срабатывания точки останова в этой функции, значит драйвер физически не отправляет событие. Это может быть связано с тем, что весы работают в режиме «запрос-ответ» по умолчанию. Проверьте настройки самого драйвера (через тестовую утилиту производителя) и убедитесь, что включен «Потоковый режим» или «Событийный режим».
Если драйвер весов (например, старые модели или специфические реализации вроде Meritech без поддержки асинхронности) не умеет генерировать события, мы можем реализовать «опрос» программно. Суть метода заключается в регулярном чтении веса и анализе его стабильности программными средствами. Это критически важно, когда вы формируете заказ клиента с указанием веса и объема или готовите упаковочный лист с автоматической калькуляцией веса.
Разберем алгоритм по шагам:
Пример реализации в коде 1С:
&НаКлиенте
Перем ПредыдущийВес, СчетчикСтабильности;
&НаКлиенте
Процедура НачатьАвтоОпрос()
ПредыдущийВес = 0;
СчетчикСтабильности = 0;
ПодключитьОбработчикОжидания("ПроверитьВесНаВесах", 1); // Опрос каждую секунду
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьВесНаВесах()
// Вызываем стандартный метод получения веса (синхронный)
ТекущийВес = 0;
Результат = МенеджерОборудованияКлиент.ПолучитьВес(ВесыСсылка, ТекущийВес);
Если Результат И ТекущийВес > 0 Тогда
Если ТекущийВес = ПредыдущийВес Тогда
СчетчикСтабильности = СчетчикСтабильности + 1;
Иначе
СчетчикСтабильности = 0;
КонецЕсли;
// Если вес стабилен 3 секунды подряд
Если СчетчикСтабильности >= 3 Тогда
ОтключитьОбработчикОжидания("ПроверитьВесНаВесах");
ОбработатьСтабильныйВес(ТекущийВес);
КонецЕсли;
ПредыдущийВес = ТекущийВес;
КонецЕсли;
КонецПроцедуры
Проанализируем технические аспекты, которые могут мешать работе при подготовке таких документов, как складская накладная с остатками и весом или акт приёмки по поступлению товаров:
Данные будет невозможно.Подводя итог, отметим: если ваша конфигурация и драйвер полностью поддерживают стандарт БПО, используйте ВнешнееСобытие с фильтром по Weighting. Если же оборудование ведет себя нестабильно (например, при оформлении такой операции, как перечень товаров на уничтожение с указанием веса), механизм с ПодключитьОбработчикОжидания станет надежной и контролируемой альтернативой.