Разработка и Конфигурация · 11 мин
Как загрузить HTML в 1С: практическое руководство
Как загрузить HTML в 1С: чтение файла, поле HTML-документа, HTTP-запросы, хранение в базе. Готовый код, типичные ошибки и проверка результата.
Задача «загрузить HTML в 1С» встречается в нескольких типовых сценариях: нужно прочитать HTML-файл с диска, получить веб-страницу по HTTP, показать HTML-разметку пользователю в форме или сохранить содержимое страницы в базе для дальнейшей обработки. Каждый сценарий решается своим механизмом встроенного языка, и путать их нельзя — код для чтения файла не подойдёт для загрузки страницы из интернета.
В платформе 1С:Предприятие 8.3 для работы с HTML используются четыре основных инструмента: объект ЧтениеТекста для файлов, HTTPСоединение и HTTPЗапрос для сетевой загрузки, поле формы с видом «Поле HTML-документа» для отображения и объекты ЧтениеHTML/ПостроительDOM для разбора разметки. Дальше разберём каждый вариант с готовым кодом и способами проверки результата.
Определяем сценарий: откуда и куда загружаем HTML
Прежде чем писать код, ответьте на три вопроса: где находится источник (локальный файл, сетевой ресурс, строка в памяти), что нужно сделать с содержимым (показать пользователю, распарсить данные, сохранить в базу) и в каком контексте выполняется код (толстый клиент, тонкий клиент, сервер, веб-клиент). От ответов зависит выбор объектов и ограничения.
Например, в веб-клиенте недоступна прямая работа с файловой системой без расширения работы с файлами, а на сервере нельзя показать HTML пользователю — формы существуют только на клиенте. Если код должен работать и в файловом, и в клиент-серверном варианте, сетевые вызовы лучше выносить на сервер, чтобы не зависеть от настроек прокси на каждом рабочем месте.
Как выбрать способ загрузки
Чтение 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С — например, открывать не внешний браузер, а форму объекта. Для этого в обработчике события установите отказ от стандартной обработки и реализуйте свою логику по данным элемента ссылки.
- 1Добавьте реквизит формы типа «Строка» неограниченной длины
- 2Перетащите реквизит на форму и смените вид поля на «Поле HTML-документа»
- 3Загрузите текст HTML из файла или по HTTP
- 4Присвойте текст реквизиту формы
- 5Откройте форму и проверьте отображение в тонком и веб-клиенте
Разбор HTML: извлечение данных из разметки
Если цель загрузки — не показать страницу, а забрать из неё данные (таблицы, списки, значения), используйте связку ЧтениеHTML и ПостроительDOM. Они преобразуют текст в объектную модель документа, по которой удобно искать элементы:
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстHTML);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(ЧтениеHTML);
Элементы = Документ.ПолучитьЭлементыПоИмени("table");
Для Каждого Таблица Из Элементы Цикл
// обход строк и ячеек
КонецЦикла;
Поиск возможен по имени тега, идентификатору (ПолучитьЭлементПоИдентификатору) и через XPath-подобные выборки. Учитывайте, что реальный HTML с сайтов часто невалиден: незакрытые теги, вложенные ошибки. ПостроительDOM достаточно терпим к таким огрехам, но структура документа может отличаться от ожидаемой — проверяйте количество найденных элементов перед циклом.
Для регулярного парсинга сторонних сайтов помните об ограничении: владелец сайта может изменить вёрстку в любой момент, и ваша обработка перестанет находить данные. Закладывайте в код контроль: если ожидаемые элементы не найдены, фиксируйте ошибку в журнале регистрации, а не молча записывайте пустые значения в базу.
Сохранение HTML в базе данных
Для хранения загруженного HTML в информационной базе используйте строковый реквизит неограниченной длины либо хранилище значения. Строка подходит для текстов до разумных размеров и позволяет искать по содержимому. Хранилище значения (Новый ХранилищеЗначения(ТекстHTML, Новый СжатиеДанных(9))) экономит место на больших объёмах, но исключает поиск по содержимому.
Если HTML нужен как вложение к объекту (например, письмо к документу), рассмотрите механизм присоединённых файлов из библиотеки стандартных подсистем, если она внедрена в конфигурацию: файл сохраняется в томе или в базе, а в объекте остаётся ссылка. Это удобнее ручного хранения, когда файлов много.
При сохранении сетевых страниц фиксируйте дату загрузки и источник в отдельных реквизитах — это упростит разбор ситуаций, когда данные на сайте изменились, а в базе осталась старая версия. Для повторяющихся загрузок предусмотрите обновление существующей записи вместо создания дублей.
Как проверить результат
Кириллица читается, теги на месте
Кракозябры или пустая строка — неверная кодировка или путь
Код состояния 200, тело содержит ожидаемую разметку
Код 4xx/5xx или редирект без обработки
Разметка рендерится, ссылки и таблицы видны
Пустое поле или сырой текст с тегами — вид поля не переключён
Найдено ожидаемое число элементов
Ноль элементов — изменилась вёрстка или ошибка в имени тега
Ограничения и частые проблемы
Веб-клиент накладывает самые жёсткие ограничения: нет прямого доступа к файловой системе, 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», затем в цикле читайте каждый через ЧтениеТекста и обрабатывайте. Для больших объёмов выполняйте обработку в фоновом задании и записывайте результаты пачками, чтобы не держать длинную транзакцию.