В процессе автоматизации складского или производственного учета часто возникает задача прямого получения данных с весоизмерительного оборудования. Большинство весовых индикаторов передают данные через интерфейс RS-232 (COM-порт) в постоянном режиме. В этой статье мы подробно разберем, как «слушать» порт в 1С, какие компоненты использовать и как избежать распространенных ошибок, связанных с разрядностью платформы и режимами совместимости.
Одним из самых эффективных способов является использование внешних компонент, написанных по технологии Native API или COM. Рассмотрим популярное решение, доступное в открытых источниках, которое позволяет взаимодействовать с RS-232 напрямую.
Для начала проанализируем процесс подключения компоненты. В 1С это обычно делается через макет, в который загружается файл .dll. Разберем код инициализации компоненты:
&НаКлиенте
Процедура ПодключитьОборудование()
Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаRS232");
Если Результат Тогда
Подключено = ПодключитьВнешнююКомпоненту("AddIn.RS232Device");
Если Подключено Тогда
ОбъектДрайвера = Новый("AddIn.RS232Device");
Попытка
ОбъектДрайвера.ОткрытьПорт("COM1", 9600, 8, 0, 1);
Сообщить("Порт успешно открыт");
Исключение
Сообщить("Ошибка открытия порта: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при использовании сторонних разработок всегда обращайте внимание на параметры метода ОткрытьПорт. Стандартные настройки для большинства весов: скорость 9600, 8 бит данных, четность отсутствует (None), 1 стоп-бит.
Часто пользователи сталкиваются с ошибкой при выполнении метода УстановитьВнешнююКомпоненту(). Рассмотрим основные причины, по которым это происходит, и способы их решения:
x86), то и компонента внутри макета должна быть 32-битной. Даже если вы работаете в 64-битной Windows, 32-битный клиент 1С не сможет загрузить 64-битную библиотеку .dll. Проверьте разрядность в окне «О программе».8.2, многие современные компоненты, использующие возможности 8.3, могут выдавать ошибки регистрации. Рекомендуется перевести тестовую обработку в пустую базу с основным режимом 8.3 для проверки работоспособности.Microsoft Visual C++ Redistributable. Выясним причину через просмотр событий Windows: если система не находит зависимую библиотеку, загрузка прервется без объяснения причин в самой 1С.Рассмотрим более «штатный» для 1С 8.3 путь. Если вы используете современную конфигурацию (УТ 11, ERP, КА 2), в них уже интегрирована Библиотека подключаемого оборудования. Для весов, которые передают данные простым текстовым потоком, можно использовать драйвер «1С:Сканер штрихкода».
Многие весы в режиме постоянной передачи данных шлют строку вида "ww00010.5kg\r\n". Универсальный драйвер 1С позволяет настроить Префикс и Суффикс (например, символы CR/LF), при получении которых будет генерироваться внешнее событие.
Преимущество этого метода в том, что нам не нужно писать бесконечный цикл опроса порта. Проанализируем алгоритм работы:
ВнешнееСобытие.
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "ВесовойИндикатор" Тогда
// Очищаем полученные данные от лишних символов
ЧистыйВес = СтрЗаменить(Данные, "kg", "");
ЧистыйВес = СокрЛП(ЧистыйВес);
ТекущийВес = Число(ЧистыйВес);
КонецЕсли;
КонецПроцедуры
Для конфигураций на обычных формах классическим решением остается использование объекта MSCOMM. Этот объект является частью Windows и позволяет гибко управлять портом. Посмотрим на пример кода для инициализации:
Попытка
КомПорт = Новый COMОбъект("MSCOMMLib.MSComm");
КомПорт.CommPort = 1; // Номер порта
КомПорт.Settings = "9600,N,8,1";
КомПорт.PortOpen = Истина;
Исключение
Предупреждение("Не удалось инициализировать COM-порт!");
КонецПопытки;
В этом режиме важно помнить о буферизации. Если весы шлют данные со скоростью 10 раз в секунду, буфер быстро переполнится. Необходимо настроить свойство RThreshold = 1, чтобы объект реагировал на каждый пришедший символ, или использовать таймер для периодического считывания накопленных данных.
Разберем ситуацию, когда данные приходят «склеенными». Например, весы передают значение веса непрерывно, и в буфер попадает строка 0.510.510.51. Чтобы получить корректное значение, мы должны использовать алгоритм поиска последнего целого пакета данных.
Обычно пакет данных заканчивается спецсимволом (конец строки). Проанализируем пример функции обработки накопленного буфера:
Функция ВыделитьВесИзПотока(СтрокаДанных)
// Разделяем строку по символу перевода строки (ASCII 10)
МассивСтрок = СтрРазделить(СтрокаДанных, Символы.ПС, Ложь);
// Берем предпоследнюю строку, так как последняя может быть неполной
Если МассивСтрок.Количество() > 1 Тогда
Значение = МассивСтрок[МассивСтрок.Количество() - 2];
Возврат ОчиститьОтМусора(Значение);
КонецЕсли;
Возврат 0;
КонецФункции
Прежде чем приступать к написанию кода в 1С, настоятельно рекомендуем проверить физическое подключение и формат данных с помощью сторонних утилит (например, PuTTY или Advanced Serial Port Monitor). Это позволит вам точно увидеть, какие спецсимволы приходят в конце строки (CR, LF или их комбинация), и правильно настроить парсинг в 1С.
Резюме: Для современных систем 1С 8.3 лучшим выбором будет использование Native API компонент или БПО. При возникновении ошибок регистрации в первую очередь проверяйте соответствие разрядности (x86/x64) и режим совместимости конфигурации.