Задача
На одном из проектов понадобилась интеграция 1С с напольными весами МИДЛ, работающими по com-порту, которые переведены в режим постоянной передачи данных, подключенной к Windows-системе. Решение, которое первое приходит в голову реализовать/найти соответствующую нативную компоненту под 1С. Однако, решил реализовать отдельный веб-сервис, в сторону этого подхода склоняло еще и то, что по сути работа с весами связана на 99% процентов со считыванием данных с порта, то есть тут взаимодействие с портом минимально. Таким образом, по факту нужен сервис, который просто будет считывать данные с порта и дальше выставлять их по http. Соответственно интеграция будет строиться через http-сервис.
Может показаться, что минусом такого решения является тот момент, что придется из 1С опрашивать циклично службу для получения интерактивной информации с весов, в случае компоненты это было бы просто внешнее событие для обработки на форме, однако на текущий момент с использованием асинхронных функций на клиенте цикличный опрос никак ощутимо не тормозит клиентское приложение, поэтому в целом это не является проблемой.
Вариант решения
Необходимо реализовать службу, которая по http будет управлять com-портом и отдавать результат взвешивания. Служба реализовывалась на С#, беглый анализ примеров кода показал, что процесс считывания реализуется достаточно ясно, причем через встроенный в .Net класс SerialPort. Http-сервис так же реализуется через встроенный класс HttpListener, на текущий момент реализация простого http-сервиса практически на любом языке задача достаточно легко реализуемая. Примеров того и другого очень много, получивший вариант реализации можно увидеть на github, ниже описаны основные моменты:
Сервис будет принимать всего четыре команды, три Post - start, stop, reset и одна Get - get.
- start - принимает в теле запроса строку вида "4;9600", где 4 - номер com-порта, 9600 - скорость работы с портом. Устанавливается соединение с портов на выходе в теле в виде строки результат;
- stop - не принимает параметры на входе, разъединяется соединение с портом;
- reset - не принимает параметры на входе, сбрасывает считанное значение в 0;
- get - возвращает в теле ответа последнее считанное значение из порта в виде строки.
Весы по умолчанию из сборки работают на 8119 порту.
Ключевые моменты реализации достаточно ясно и понятно воспринимаются, всю сложность скрывают внутренние библиотеки:
Взаимодействие с 1С
Взаимодействие описывается через http-запросы, примеры ниже.
Если необходимо опрашивать с определенным интервалом весы, то необходимо подключать обработчик ожидания и использовать для получения значения асинхронные методы.
Тестирование
Так как в момент реализации под рукой не было весов, разработка велась удаленно, то оказалось тестировать вполне можно тестировать функционал на сканере штрихкодов, которой работает через виртуальный com-порт, по факту принцип его работы такой же - считанное значение выставляет в порт, откуда его можно считывать. После, в тестовой эксплуатации, уже непосредственно на самих весах шло тестирование, решение отлично себя показало далее и в промышленной эксплуатации в связке с 1С: Комплексная автоматизация 2.5, конечно не обошлось без сюрпризов, весы иногда передавали значение, которое к числу невозможно преобразовать, но это уже решается на стороне 1С. Саму службу можно устанавливать через стандартную команду sc create.
К публикации приложена обработка-пример и сборка, которая реализует взаимодействие с весами. Сам проект на github.