Как реализовать получение данных с COM-порта в 1С:Предприятие 8?

Программист 1С v8.3 (Обычные формы) Промышленность, строительство и АПК
← На главную

В процессе автоматизации складского или производственного учета часто возникает задача прямого получения данных с весоизмерительного оборудования. Большинство весовых индикаторов передают данные через интерфейс RS-232 (COM-порт) в постоянном режиме. В этой статье мы подробно разберем, как «слушать» порт в 1С, какие компоненты использовать и как избежать распространенных ошибок, связанных с разрядностью платформы и режимами совместимости.

Метод 1: Использование специализированных внешних компонент

Одним из самых эффективных способов является использование внешних компонент, написанных по технологии Native API или COM. Рассмотрим популярное решение, доступное в открытых источниках, которое позволяет взаимодействовать с RS-232 напрямую.

Для начала проанализируем процесс подключения компоненты. В 1С это обычно делается через макет, в который загружается файл .dll. Разберем код инициализации компоненты:


&НаКлиенте
Процедура ПодключитьОборудование()
    Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаRS232");
    Если Результат Тогда
        Подключено = ПодключитьВнешнююКомпоненту("AddIn.RS232Device");
        Если Подключено Тогда
            ОбъектДрайвера = Новый("AddIn.RS232Device");
            Попытка
                ОбъектДрайвера.ОткрытьПорт("COM1", 9600, 8, 0, 1);
                Сообщить("Порт успешно открыт");
            Исключение
                Сообщить("Ошибка открытия порта: " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: при использовании сторонних разработок всегда обращайте внимание на параметры метода ОткрытьПорт. Стандартные настройки для большинства весов: скорость 9600, 8 бит данных, четность отсутствует (None), 1 стоп-бит.

Анализ проблем при загрузке компонент

Часто пользователи сталкиваются с ошибкой при выполнении метода УстановитьВнешнююКомпоненту(). Рассмотрим основные причины, по которым это происходит, и способы их решения:

  1. Разрядность платформы: Если ваша платформа 1С является 32-битной (x86), то и компонента внутри макета должна быть 32-битной. Даже если вы работаете в 64-битной Windows, 32-битный клиент 1С не сможет загрузить 64-битную библиотеку .dll. Проверьте разрядность в окне «О программе».
  2. Режим совместимости: Если ваша конфигурация работает в режиме совместимости с версией 8.2, многие современные компоненты, использующие возможности 8.3, могут выдавать ошибки регистрации. Рекомендуется перевести тестовую обработку в пустую базу с основным режимом 8.3 для проверки работоспособности.
  3. Отсутствие системных библиотек: Самописные компоненты часто требуют наличия Microsoft Visual C++ Redistributable. Выясним причину через просмотр событий Windows: если система не находит зависимую библиотеку, загрузка прервется без объяснения причин в самой 1С.

Метод 2: Библиотека подключаемого оборудования (БПО)

Рассмотрим более «штатный» для 1С 8.3 путь. Если вы используете современную конфигурацию (УТ 11, ERP, КА 2), в них уже интегрирована Библиотека подключаемого оборудования. Для весов, которые передают данные простым текстовым потоком, можно использовать драйвер «1С:Сканер штрихкода».

Многие весы в режиме постоянной передачи данных шлют строку вида "ww00010.5kg\r\n". Универсальный драйвер 1С позволяет настроить Префикс и Суффикс (например, символы CR/LF), при получении которых будет генерироваться внешнее событие.

Преимущество этого метода в том, что нам не нужно писать бесконечный цикл опроса порта. Проанализируем алгоритм работы:

  1. В настройках оборудования выбираем «Сканеры штрихкода».
  2. Выбираем драйвер «1С:Сканер штрихкода (NativeApi)».
  3. Настраиваем COM-порт и параметры связи.
  4. В модуле формы обрабатываем событие ВнешнееСобытие.

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если Источник = "ВесовойИндикатор" Тогда
        // Очищаем полученные данные от лишних символов
        ЧистыйВес = СтрЗаменить(Данные, "kg", "");
        ЧистыйВес = СокрЛП(ЧистыйВес);
        ТекущийВес = Число(ЧистыйВес);
    КонецЕсли;
КонецПроцедуры

Метод 3: Работа через ActiveX (MSCOMM32.OCX)

Для конфигураций на обычных формах классическим решением остается использование объекта 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) и режим совместимости конфигурации.

← На главную