В современной промышленной автоматизации часто возникает задача интеграции 1С с различным оборудованием, имеющим собственный веб-интерфейс. Рассмотрим ситуацию, когда весовой терминал (например, производства «НАИС») транслирует показания веса на внутреннюю веб-страницу, и нам необходимо программно получить эти данные в информационную базу 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Соединение.
Часто при получении текста страницы в 1С вместо русских букв можно увидеть «кракозябры». Это происходит из-за несовпадения кодировки веб-сервера и настроек чтения в 1С. Судя по мета-тегам страницы (charset=Windows-1251), сервер отдает данные в кодировке ANSI.
Выясним, как это исправить. При вызове метода ПолучитьТелоКакСтроку() необходимо явно указать кодировку текста. Проанализируем правильный вариант вызова:
// Указываем кодировку Windows-1251 для корректного отображения кириллицы
Страница = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
// Или явно
// Страница = Результат.ПолучитьТелоКакСтроку("windows-1251");
Когда мы получили полный HTML-код страницы, нам нужно найти в нем конкретное значение. В нашем примере это вес, находящийся внутри тега: <div id="display0">0,000 T.</div>.
Рассмотрим «быстрый», но не самый надежный метод — текстовый разбор строки. Мы будем искать положение открывающего тега и вырезать содержимое до закрывающего тега.
МеткаНачала = "<div id=""display0"">";
МеткаКонца = "</div>";
ПозНачала = СтрНайти(Страница, МеткаНачала);
Если ПозНачала > 0 Тогда
// Сдвигаемся на длину самой метки, чтобы получить начало значения
СтартЗначения = ПозНачала + СтрДлина(МеткаНачала);
// Ищем конец тега, начиная от найденного значения
ОстатокСтроки = Сред(Страница, СтартЗначения);
ПозКонца = СтрНайти(ОстатокСтроки, МеткаКонца);
Если ПозКонца > 0 Тогда
// Вырезаем текст (например, "0,000 T.")
ЗначениеТекст = Лев(ОстатокСтроки, ПозКонца - 1);
// Очищаем от лишних символов (единицы измерения " T.") и пробелов
ЧистоеЗначение = СтрЗаменить(ЗначениеТекст, " T.", "");
ЧистоеЗначение = СокрЛП(ЧистоеЗначение);
// Преобразуем в число (не забываем про замену запятой на точку, если нужно)
ЧистоеЗначение = СтрЗаменить(ЧистоеЗначение, ",", ".");
Попытка
ВесЧислом = Число(ЧистоеЗначение);
Сообщить("Текущий вес: " + ВесЧислом);
Исключение
Сообщить("Не удалось преобразовать в число: " + ЧистоеЗначение);
КонецПопытки;
КонецЕсли;
КонецЕсли;
Важное предостережение: Метод текстового парсинга очень чувствителен к изменениям в дизайне страницы. Если разработчик оборудования добавит лишний пробел или изменит класс CSS, поиск может перестать работать.
Проанализируем исходный код страницы, предоставленный автором. В скриптах видна функция 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), что исключает ошибки «ручного» поиска подстрок.
При реализации обмена с весовыми терминалами следует учитывать несколько технических нюансов:
HTTPСоединение (например, 2-5 секунд), чтобы при потере связи 1С не «зависала» в ожидании ответа.КодСостояния. Код 200 означает успех, но сервер может вернуть 404 (страница не найдена) или 500 (внутренняя ошибка оборудования), что нужно обрабатывать в коде 1С.Таким образом, мы проанализировали процесс получения данных от простого парсинга HTML-страницы до использования профессионального подхода через API-запросы. Рекомендуем всегда искать возможность получения данных в структурированном виде (JSON/XML), так как это гарантирует надежность вашей интеграции.