К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как загрузить HTML в 1С: практическое руководство

Как загрузить HTML в 1С: чтение файла, поле HTML-документа, HTTP-запросы, хранение в базе. Готовый код, типичные ошибки и проверка результата.

Задача «загрузить HTML в 1С» встречается в нескольких типовых сценариях: нужно прочитать HTML-файл с диска, получить веб-страницу по HTTP, показать HTML-разметку пользователю в форме или сохранить содержимое страницы в базе для дальнейшей обработки. Каждый сценарий решается своим механизмом встроенного языка, и путать их нельзя — код для чтения файла не подойдёт для загрузки страницы из интернета.

В платформе 1С:Предприятие 8.3 для работы с HTML используются четыре основных инструмента: объект ЧтениеТекста для файлов, HTTPСоединение и HTTPЗапрос для сетевой загрузки, поле формы с видом «Поле HTML-документа» для отображения и объекты ЧтениеHTML/ПостроительDOM для разбора разметки. Дальше разберём каждый вариант с готовым кодом и способами проверки результата.

Определяем сценарий: откуда и куда загружаем HTML

Прежде чем писать код, ответьте на три вопроса: где находится источник (локальный файл, сетевой ресурс, строка в памяти), что нужно сделать с содержимым (показать пользователю, распарсить данные, сохранить в базу) и в каком контексте выполняется код (толстый клиент, тонкий клиент, сервер, веб-клиент). От ответов зависит выбор объектов и ограничения.

Например, в веб-клиенте недоступна прямая работа с файловой системой без расширения работы с файлами, а на сервере нельзя показать HTML пользователю — формы существуют только на клиенте. Если код должен работать и в файловом, и в клиент-серверном варианте, сетевые вызовы лучше выносить на сервер, чтобы не зависеть от настроек прокси на каждом рабочем месте.

Маршрут решения

Как выбрать способ загрузки

HTML лежит в файле на дискеИспользуйте ЧтениеТекста с указанием кодировки
Страницу нужно получить по URLИспользуйте HTTPСоединение и HTTPЗапрос на сервере
HTML нужно показать пользователюДобавьте реквизит формы и поле вида «Поле HTML-документа»
Из HTML нужно извлечь данныеПримените ЧтениеHTML и ПостроительDOM

Чтение HTML-файла с диска

Самый простой случай — файл уже сохранён на диске сервера или клиента. Для чтения используется объект ЧтениеТекста, важно правильно указать кодировку: большинство HTML-файлов сохранено в UTF-8, но встречаются и windows-1251. Неверная кодировка проявляется как «кракозябры» вместо кириллицы.

ЧтениеТекста = Новый ЧтениеТекста("C:\Data\page.html", КодировкаТекста.UTF8);

ТекстHTML = ЧтениеТекста.Прочитать();

ЧтениеТекста.Закрыть();

Если кодировка заранее неизвестна, попробуйте прочитать файл в UTF-8 и проверить наличие подозрительных символов замены. Альтернатива — объект ТекстовыйДокумент с методом Прочитать(), который умеет автоматически определять кодировку по метке BOM. Для больших файлов читайте построчно методом ПрочитатьСтроку(), чтобы не загружать весь текст в память одной строкой.

При работе в тонком или веб-клиенте файл сначала нужно передать на сервер через НачатьПомещениеФайла или поместить во временное хранилище, а чтение выполнять уже в серверной процедуре. Прямое обращение к диску клиента без расширения работы с файлами будет заблокировано.

Загрузка HTML-страницы из интернета

Для получения страницы по URL используются объекты HTTPСоединение и HTTPЗапрос. Код выполняется на сервере или в толстом клиенте. Ниже типовой пример для защищённого соединения HTTPS:

SSL = Новый ЗащищенноеСоединениеOpenSSL();

Соединение = Новый HTTPСоединение("example.com", 443, , , , 30, SSL);

Запрос = Новый HTTPЗапрос("/page.html");

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

ТекстHTML = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

Иначе

ВызватьИсключение "Ошибка загрузки: " + Ответ.КодСостояния;

КонецЕсли;

Обязательно проверяйте код состояния ответа: значение 200 означает успех, 301/302 — редирект (адрес перенаправления лежит в заголовке Location), 403/404 — страница недоступна. Метод ПолучитьТелоКакСтроку() без параметра попытается определить кодировку из заголовков ответа, но надёжнее указать её явно, если она известна.

Таймаут соединения задавайте осознанно: слишком маленькое значение оборвёт медленные ответы, слишком большое — подвесит фоновое задание или сеанс пользователя. Для регламентных операций разумный диапазон — от 15 до 60 секунд в зависимости от скорости источника.

Отображение HTML в форме: поле HTML-документа

Чтобы показать HTML пользователю, добавьте в форму реквизит типа «Строка» неограниченной длины и элемент формы с видом «Поле HTML-документа», связанный с этим реквизитом. После присваивания текста реквизиту разметка отобразится в поле автоматически:

// В клиентской или серверной процедуре формы

ТекстHTML = ПолучитьHTMLСтраницы(); // ваша функция загрузки

РеквизитHTML = ТекстHTML;

Поле HTML-документа работает на движке браузера: в тонком клиенте под Windows используется WebView2 или Internet Explorer в зависимости от настроек платформы, в веб-клиенте — движок самого браузера. Из-за этого одна и та же разметка может выглядеть по-разному в разных клиентах. Для предсказуемого результата используйте простой CSS без современных функций и проверяйте отображение во всех целевых клиентах.

У поля есть событие ПриНажатии, через которое можно перехватывать клики по ссылкам и обрабатывать их средствами 1С — например, открывать не внешний браузер, а форму объекта. Для этого в обработчике события установите отказ от стандартной обработки и реализуйте свою логику по данным элемента ссылки.

Порядок вывода HTML в форму
  1. 1
    Добавьте реквизит формы типа «Строка» неограниченной длины
  2. 2
    Перетащите реквизит на форму и смените вид поля на «Поле HTML-документа»
  3. 3
    Загрузите текст HTML из файла или по HTTP
  4. 4
    Присвойте текст реквизиту формы
  5. 5
    Откройте форму и проверьте отображение в тонком и веб-клиенте

Разбор HTML: извлечение данных из разметки

Если цель загрузки — не показать страницу, а забрать из неё данные (таблицы, списки, значения), используйте связку ЧтениеHTML и ПостроительDOM. Они преобразуют текст в объектную модель документа, по которой удобно искать элементы:

ЧтениеHTML = Новый ЧтениеHTML;

ЧтениеHTML.УстановитьСтроку(ТекстHTML);

Построитель = Новый ПостроительDOM;

Документ = Построитель.Прочитать(ЧтениеHTML);

Элементы = Документ.ПолучитьЭлементыПоИмени("table");

Для Каждого Таблица Из Элементы Цикл

// обход строк и ячеек

КонецЦикла;

Поиск возможен по имени тега, идентификатору (ПолучитьЭлементПоИдентификатору) и через XPath-подобные выборки. Учитывайте, что реальный HTML с сайтов часто невалиден: незакрытые теги, вложенные ошибки. ПостроительDOM достаточно терпим к таким огрехам, но структура документа может отличаться от ожидаемой — проверяйте количество найденных элементов перед циклом.

Для регулярного парсинга сторонних сайтов помните об ограничении: владелец сайта может изменить вёрстку в любой момент, и ваша обработка перестанет находить данные. Закладывайте в код контроль: если ожидаемые элементы не найдены, фиксируйте ошибку в журнале регистрации, а не молча записывайте пустые значения в базу.

Типичные ошибки
01
Чтение файла без указания кодировки — кириллица превращается в нечитаемые символы
02
Игнорирование кода состояния HTTP-ответа — в базу попадает страница ошибки вместо данных
03
Отображение чужого HTML без очистки от скриптов — риск выполнения вредоносного кода в клиенте
04
Парсинг без проверки результата — после смены вёрстки сайта обработка молча пишет пустые данные
05
Выполнение HTTP-запроса в клиентской процедуре формы — зависание интерфейса на время ожидания ответа

Сохранение HTML в базе данных

Для хранения загруженного HTML в информационной базе используйте строковый реквизит неограниченной длины либо хранилище значения. Строка подходит для текстов до разумных размеров и позволяет искать по содержимому. Хранилище значения (Новый ХранилищеЗначения(ТекстHTML, Новый СжатиеДанных(9))) экономит место на больших объёмах, но исключает поиск по содержимому.

Если HTML нужен как вложение к объекту (например, письмо к документу), рассмотрите механизм присоединённых файлов из библиотеки стандартных подсистем, если она внедрена в конфигурацию: файл сохраняется в томе или в базе, а в объекте остаётся ссылка. Это удобнее ручного хранения, когда файлов много.

При сохранении сетевых страниц фиксируйте дату загрузки и источник в отдельных реквизитах — это упростит разбор ситуаций, когда данные на сайте изменились, а в базе осталась старая версия. Для повторяющихся загрузок предусмотрите обновление существующей записи вместо создания дублей.

Контрольные точки

Как проверить результат

Текст после чтения файла
Норма

Кириллица читается, теги на месте

Тревожный признак

Кракозябры или пустая строка — неверная кодировка или путь

HTTP-ответ
Норма

Код состояния 200, тело содержит ожидаемую разметку

Тревожный признак

Код 4xx/5xx или редирект без обработки

Отображение в форме
Норма

Разметка рендерится, ссылки и таблицы видны

Тревожный признак

Пустое поле или сырой текст с тегами — вид поля не переключён

Парсинг DOM
Норма

Найдено ожидаемое число элементов

Тревожный признак

Ноль элементов — изменилась вёрстка или ошибка в имени тега

Ограничения и частые проблемы

Веб-клиент накладывает самые жёсткие ограничения: нет прямого доступа к файловой системе, HTTP-запросы из клиентского кода невозможны, а поле HTML-документа работает внутри песочницы браузера. Вся загрузка в этом режиме идёт через серверные вызовы и механизмы передачи файлов платформы.

Вторая группа проблем — сертификаты и прокси. Ошибки вида «недоверенный сертификат» при HTTPS решаются корректной настройкой хранилища сертификатов на сервере 1С или передачей собственного объекта защищённого соединения с указанным файлом сертификатов. Если в сети используется прокси, параметры подключения передаются в конструктор HTTPСоединение через объект ИнтернетПрокси.

Третья группа — производительность. Загрузка и парсинг страниц в цикле по сотням адресов блокирует сеанс надолго. Выносите такие операции в фоновые задания через ФоновыеЗадания.Выполнить или в регламентные задания, а пользователю показывайте прогресс или результат по завершении.

Итог

Что важно запомнить

Файл читается через ЧтениеТекста с явной кодировкой, страница скачивается через HTTPСоединение с проверкой кода ответа, показывается в поле HTML-документа, разбирается через ЧтениеHTML и ПостроительDOM. Чужой HTML очищайте от скриптов, длительные загрузки выполняйте в фоне.

Частые вопросы

Можно ли загрузить HTML в 1С без программирования?

Частично. В типовых конфигурациях есть механизмы обмена и загрузки данных, но универсальной кнопки «загрузить HTML» нет. Для разового просмотра файл можно открыть в браузере, а для интеграции в учёт потребуется обработка или доработка конфигурации.

Почему после чтения файла вместо русского текста отображаются непонятные символы?

Причина почти всегда в несовпадении кодировки: файл сохранён в windows-1251, а читается как UTF-8, или наоборот. Укажите кодировку явно в конструкторе ЧтениеТекста или используйте ТекстовыйДокумент с автоопределением по метке BOM.

Как загрузить страницу, которая требует авторизации?

Добавьте в HTTPЗапрос нужные заголовки: логин и пароль для Basic-авторизации передаются в конструктор HTTPСоединения, а токен — в заголовке Authorization. Если сайт использует форму входа с cookies, потребуется сначала выполнить POST-запрос авторизации и сохранить cookies из ответа для последующих запросов.

Поле HTML-документа показывает пустую страницу, хотя текст присвоен. Что не так?

Проверьте три вещи: вид поля действительно установлен в «Поле HTML-документа», реквизит связан с элементом формы, и присваивание происходит после инициализации формы, а не до её создания. Также убедитесь, что строка содержит корректный HTML, а не пустое значение.

Можно ли выполнять JavaScript из загруженного HTML?

В поле HTML-документа скрипты выполняются движком браузера, но взаимодействие с кодом 1С ограничено и зависит от клиента. Полноценно исполнять произвольный JavaScript из встроенного языка нельзя — для логики используйте средства платформы, а JavaScript оставляйте для оформления и простых интерактивных элементов.

Как загрузить сразу много HTML-файлов из папки?

Получите список файлов методом НайтиФайлы с маской «*.html», затем в цикле читайте каждый через ЧтениеТекста и обрабатывайте. Для больших объёмов выполняйте обработку в фоновом задании и записывайте результаты пачками, чтобы не держать длинную транзакцию.