Как получить данные с веб-страницы весового оборудования в 1С?

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

В современной промышленной автоматизации часто возникает задача интеграции 1С с различным оборудованием, имеющим собственный веб-интерфейс. Рассмотрим ситуацию, когда весовой терминал (например, производства «НАИС») транслирует показания веса на внутреннюю веб-страницу, и нам необходимо программно получить эти данные в информационную базу 1С.

В данной статье мы разберем по шагам, как настроить обмен данными через протокол HTTP, как правильно сформировать запрос и как обработать полученный результат, чтобы извлечь из него чистое числовое значение веса.

Шаг 1. Настройка HTTP-соединения и выполнение базового запроса

Для начала проанализируем базовый механизм работы с веб-сервером. В 1С для этих целей используется объект HTTPСоединение. Предположим, наше устройство находится в локальной сети по адресу 192.168.0.106 и использует порт 48701.

Рассмотрим пример кода для инициализации соединения и получения содержимого главной страницы:


// Определяем параметры подключения
Сервер = "192.168.0.106";
Порт = 48701;

// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт);

// Формируем запрос к конкретному ресурсу (странице)
// Если в браузере адрес выглядит как http://192.168.0.106:48701/t0, 
// то путь к ресурсу будет "/t0"
Запрос = Новый HTTPЗапрос("/t0");

// Выполняем GET-запрос
Результат = Соединение.Получить(Запрос);

Если Результат.КодСостояния = 200 Тогда
    // Получаем содержимое страницы в виде строки
    Страница = Результат.ПолучитьТелоКакСтроку();
КонецЕсли;

Важный момент: Обратите внимание на формирование пути в объекте HTTPЗапрос. В аргументе конструктора указывается только путь относительно корня сайта (например, "/t0" или "/index.html"). Адрес сервера и порт указываются только при создании HTTPСоединение.

Шаг 2. Решение проблемы с кодировкой (символы «»)

Часто при получении текста страницы в 1С вместо русских букв можно увидеть «кракозябры». Это происходит из-за несовпадения кодировки веб-сервера и настроек чтения в 1С. Судя по мета-тегам страницы (charset=Windows-1251), сервер отдает данные в кодировке ANSI.

Выясним, как это исправить. При вызове метода ПолучитьТелоКакСтроку() необходимо явно указать кодировку текста. Проанализируем правильный вариант вызова:


// Указываем кодировку Windows-1251 для корректного отображения кириллицы
Страница = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
// Или явно
// Страница = Результат.ПолучитьТелоКакСтроку("windows-1251");

Шаг 3. Извлечение данных из HTML-кода (Парсинг)

Когда мы получили полный HTML-код страницы, нам нужно найти в нем конкретное значение. В нашем примере это вес, находящийся внутри тега: <div id="display0">0,000 T.</div>.

Рассмотрим «быстрый», но не самый надежный метод — текстовый разбор строки. Мы будем искать положение открывающего тега и вырезать содержимое до закрывающего тега.


МеткаНачала = "<div id=""display0"">";
МеткаКонца = "</div>";

ПозНачала = СтрНайти(Страница, МеткаНачала);
Если ПозНачала > 0 Тогда
    // Сдвигаемся на длину самой метки, чтобы получить начало значения
    СтартЗначения = ПозНачала + СтрДлина(МеткаНачала);
    
    // Ищем конец тега, начиная от найденного значения
    ОстатокСтроки = Сред(Страница, СтартЗначения);
    ПозКонца = СтрНайти(ОстатокСтроки, МеткаКонца);
    
    Если ПозКонца > 0 Тогда
        // Вырезаем текст (например, "0,000 T.")
        ЗначениеТекст = Лев(ОстатокСтроки, ПозКонца - 1);
        
        // Очищаем от лишних символов (единицы измерения " T.") и пробелов
        ЧистоеЗначение = СтрЗаменить(ЗначениеТекст, " T.", "");
        ЧистоеЗначение = СокрЛП(ЧистоеЗначение);
        
        // Преобразуем в число (не забываем про замену запятой на точку, если нужно)
        ЧистоеЗначение = СтрЗаменить(ЧистоеЗначение, ",", ".");
        Попытка
            ВесЧислом = Число(ЧистоеЗначение);
            Сообщить("Текущий вес: " + ВесЧислом);
        Исключение
            Сообщить("Не удалось преобразовать в число: " + ЧистоеЗначение);
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Важное предостережение: Метод текстового парсинга очень чувствителен к изменениям в дизайне страницы. Если разработчик оборудования добавит лишний пробел или изменит класс CSS, поиск может перестать работать.

Шаг 4. Оптимальный способ: Работа через API (getweights)

Проанализируем исходный код страницы, предоставленный автором. В скриптах видна функция GetWeights(), которая обращается к адресу /getweights. Как правило, такие эндпоинты создаются специально для динамического обновления данных на странице через AJAX.

Вместо того чтобы запрашивать тяжелую HTML-страницу со всеми стилями и картинками, гораздо эффективнее обратиться напрямую к /getweights. Скорее всего, сервер вернет данные в формате JSON или простой текстовой строкой.

Рассмотрим, как это реализовать:


ЗапросAPI = Новый HTTPЗапрос("/getweights");
ОтветAPI = Соединение.Получить(ЗапросAPI);

Если ОтветAPI.КодСостояния = 200 Тогда
    ТелоОтвета = ОтветAPI.ПолучитьТелоКакСтроку();
    
    // Если сервер возвращает JSON (например: {"display0": "0.120", "display1": "0.000"})
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТелоОтвета);
    Данные = ПрочитатьJSON(Чтение);
    
    Если ТипЗнч(Данные) = Тип("Структура") Тогда
        Вес = Данные.display0;
        Сообщить("Вес получен через API: " + Вес);
    КонецЕсли;
КонецЕсли;

Использование API значительно повышает стабильность работы. Во-первых, объем передаваемых данных уменьшается в десятки раз. Во-вторых, формат JSON структурирован, и его разбор в 1С выполняется встроенными средствами (ПрочитатьJSON), что исключает ошибки «ручного» поиска подстрок.

Дополнительные рекомендации по работе с оборудованием

При реализации обмена с весовыми терминалами следует учитывать несколько технических нюансов:

  1. Таймауты: Веб-серверы промышленного оборудования часто имеют малую производительность. Рекомендуется устанавливать таймаут в HTTPСоединение (например, 2-5 секунд), чтобы при потере связи 1С не «зависала» в ожидании ответа.
  2. Частота опроса: Не стоит запрашивать данные слишком часто (например, чаще 1 раза в секунду). Это может перегрузить сетевой модуль весового терминала.
  3. Проверка состояния: Всегда проверяйте КодСостояния. Код 200 означает успех, но сервер может вернуть 404 (страница не найдена) или 500 (внутренняя ошибка оборудования), что нужно обрабатывать в коде 1С.

Таким образом, мы проанализировали процесс получения данных от простого парсинга HTML-страницы до использования профессионального подхода через API-запросы. Рекомендуем всегда искать возможность получения данных в структурированном виде (JSON/XML), так как это гарантирует надежность вашей интеграции.

← На главную