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

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

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

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

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

Ниже разобраны три основных сценария: чтение файла в строку через объект «ТекстовыйДокумент», вывод страницы в элемент формы «Поле HTML-документа» и программный разбор содержимого с помощью объекта «ЧтениеHTML». Все примеры применимы в управляемых формах и тонком клиенте версий платформы 8.3, а где поведение отличается — это отдельно оговорено.

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

Что понадобится перед загрузкой файла

Первое условие — доступ к файлу с того компьютера или сервера, где выполняется код. Если код выполняется на клиенте, файл должен лежать на локальном диске пользователя или на сетевом ресурсе, доступном с его машины. Если код выполняется на сервере 1С, путь должен быть доступен учётной записи, под которой работает агент сервера — это частая причина ошибок «файл не найден» даже при верном пути.

Второе условие — кодировка файла. HTML-страницы сохраняются в UTF-8, UTF-16, windows-1251 и других кодировках. Если кодировка определена неверно, кириллица превратится в нечитаемые символы. Уточнить кодировку можно, открыв файл в редакторе (например, Notepad++ показывает её в строке состояния), либо прочитав атрибут charset в теге meta внутри самого файла.

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

Чтение HTML-файла в строку через ТекстовыйДокумент

Самый простой способ получить содержимое файла — объект «ТекстовыйДокумент». Он читает файл целиком и возвращает его как строку, которую затем можно сохранить в реквизит, хранилище значения или передать дальше по цепочке обработки.

Типовой код выглядит так:

Текст = Новый ТекстовыйДокумент;

Текст.Прочитать("C:\Данные\отчет.html", КодировкаТекста.UTF8);

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

Второй параметр метода «Прочитать» задаёт кодировку. Если его не указать, платформа попытается определить кодировку автоматически, что не всегда даёт корректный результат для HTML без BOM-маркера. Явное указание КодировкаТекста.UTF8 или КодировкаТекста.ANSI (для windows-1251) избавляет от сюрпризов.

После чтения строку можно сохранить, например, в реквизит справочника с типом «Строка неограниченной длины» или в хранилище значения. Учитывайте, что хранение большого количества HTML-страниц в базе увеличивает её размер; для массовых архивов разумнее хранить файлы на диске, а в базе — только пути.

1c
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Данные\отчет.html", КодировкаТекста.UTF8);
СтрокаHTML = Текст.ПолучитьТекст();

Отображение HTML-страницы на форме

Если задача — показать пользователю страницу, используется элемент формы «Поле HTML-документа». В управляемой форме добавьте реквизит типа «Строка» (или «ФорматированныйДокумент» — для другого сценария) и элемент формы с видом «Поле HTML-документа», связанный с этим реквизитом.

Есть два способа заполнить поле. Первый — присвоить реквизиту путь к файлу или URL: поле само загрузит и отобразит содержимое. Второй — программно установить текст страницы, когда HTML уже прочитан в строку:

// Вариант 1: путь к файлу

РеквизитHTML = "C:\Данные\отчет.html";

// Вариант 2: программная установка текста

Элементы.ПолеHTML.Документ — недоступен до загрузки,

поэтому используем:

РеквизитHTML = "about:blank";

// затем в обработчике ДокументСформирован:

Элементы.ПолеHTML.Документ.body.innerHTML = СтрокаHTML;

Обратите внимание: событие «ДокументСформирован» у поля HTML срабатывает, когда страница полностью загружена. Любую программную работу с DOM (подстановку текста, чтение элементов) нужно выполнять в обработчике этого события, иначе обращение к документу вернёт ошибку или пустой объект.

Движок отображения зависит от версии платформы и настроек: в современных версиях используется WebKit, в старых — Internet Explorer. Сложные страницы с современным JavaScript могут отображаться некорректно в режиме IE-совместимости. Если страница выглядит «сломанной», проверьте настройку режима совместимости конфигурации и используемый движок в свойствах поля.

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

Разбор HTML программно: ЧтениеHTML и ПостроительDOM

Когда нужно не показать страницу, а извлечь из неё данные — например, строки таблицы с остатками из выгрузки маркетплейса — используются объекты «ЧтениеHTML» и «ПостроительDOM». Первый читает документ последовательно, второй строит дерево элементов, по которому удобно искать нужные узлы.

Пример чтения всех ячеек таблицы:

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

Чтение.ОткрытьФайл("C:\Данные\выгрузка.html");

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

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

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

Для Каждого Ячейка Из Ячейки Цикл

Сообщить(Ячейка.ТекстовоеСодержимое);

КонецЦикла;

Этот подход устойчивее, чем разбор HTML регулярными выражениями или строковыми функциями: структура документа обрабатывается корректно даже при нестандартной вложенности тегов. Однако «ПостроительDOM» требователен к качеству HTML — сильно повреждённые страницы с незакрытыми тегами могут разбираться не так, как ожидается.

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

Сравнение способов работы с HTML в 1С

ТекстовыйДокумент

Подходит, когда нужен просто текст файла: сохранить, отправить, найти подстроку. Не разбирает структуру тегов.

Поле HTML-документа

Подходит для показа страницы пользователю. Требует элемента формы и не работает в фоновых заданиях.

ЧтениеHTML + ПостроительDOM

Подходит для извлечения данных из тегов. Требует аккуратного кода и ломается при смене вёрстки источника.

Загрузка файла, выбранного пользователем, в тонком клиенте

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

&НаКлиенте

Процедура ВыбратьФайл(Команда)

НачатьПомещениеФайла(Новый ОписаниеОповещения("ПослеПомещения", ЭтотОбъект),

, , Истина, УникальныйИдентификатор);

КонецПроцедуры

&НаСервере

Процедура ОбработатьНаСервере(Адрес)

Двоичные = ПолучитьИзВременногоХранилища(Адрес);

ИмяВрем = ПолучитьИмяВременногоФайла("html");

Двоичные.Записать(ИмяВрем);

// далее чтение через ТекстовыйДокумент

КонецПроцедуры

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

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

Типичные ошибки
01
Чтение файла на сервере по локальному пути пользователя — файл не найден, потому что сервер не видит диск клиента. Передавайте файл через временное хранилище.
02
Игнорирование кодировки — кириллица превращается в «кракозябры». Указывайте кодировку явно в методе Прочитать.
03
Обращение к документу поля HTML до события ДокументСформирован — ошибка или пустой объект. Работайте с DOM только в обработчике события.
04
Разбор HTML строковыми функциями вместо ПостроительDOM — код ломается при малейшем изменении вёрстки источника.

Проверка результата и типичные проблемы

После загрузки проверьте три вещи. Первое — кодировку: откройте результат и убедитесь, что русский текст читается. Второе — полноту данных: сравните количество извлечённых строк с исходным файлом, особенно при разборе таблиц. Третье — отображение: если страница показана в поле HTML, проверьте, подгрузились ли стили и картинки (внешние ресурсы по относительным путям при чтении файла с диска часто не подгружаются).

Частая проблема — «пустой» результат при вроде бы корректном коде. Причины: файл заблокирован другой программой, путь содержит опечатку, у учётной записи сервера нет прав на каталог, либо файл на самом деле не HTML, а, например, переименованный XLS. Откройте файл в браузере и текстовом редакторе, чтобы убедиться, что он валиден.

Если страница отображается в поле HTML без стилей и картинок, это обычно не ошибка: относительные ссылки на ресурсы разрешаются относительно расположения файла, и при передаче чистого текста без базового адреса ресурсы теряются. Решение — загружать страницу по пути к файлу (тогда относительные пути работают) или прописывать тег base в HTML.

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

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

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

Кириллица читается, структура тегов видна

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

Нечитаемые символы — неверная кодировка

Отображение в поле HTML
Норма

Страница показана со стилями и картинками

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

Голый текст без оформления — потеряны внешние ресурсы

Разбор таблицы через DOM
Норма

Число строк совпадает с файлом-источником

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

Часть данных пропущена — изменилась вёрстка или повреждён HTML

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

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

Второй риск — производительность. Чтение и разбор больших файлов в транзакции или в коде, вызываемом при записи объектов, замедляет работу пользователей. Тяжёлые обработки выносите в фоновые задания, а пользователю показывайте индикатор выполнения.

Наконец, помните про обновляемость конфигурации. Если доработка встраивается в типовую конфигурацию, используйте расширения и подсистему дополнительных отчётов и обработок БСП вместо прямого изменения типовых модулей — иначе при обновлении изменения будут потеряны.

Итог

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

В 1С HTML-файл читается в строку через ТекстовыйДокумент, показывается пользователю через поле HTML-документа, а данные из тегов извлекаются через ЧтениеHTML и ПостроительDOM. Всегда указывайте кодировку явно, учитывайте разделение клиента и сервера, а тяжёлую обработку выносите в фоновые задания.

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

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

Частично. Типовые механизмы вроде «Загрузки данных из табличного документа» не работают с HTML напрямую. Можно открыть файл в браузере, сохранить таблицу как Excel и загрузить её стандартной обработкой. Полноценная же загрузка именно HTML требует кода — своего или в виде внешней обработки.

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

Причина почти всегда в несовпадении кодировки. Укажите её явно вторым параметром метода Прочитать: КодировкаТекста.UTF8 для большинства современных файлов или КодировкаТекста.ANSI для старых страниц в windows-1251. Если не помогло, откройте файл в редакторе и посмотрите реальную кодировку.

Как показать HTML-письмо, хранящееся в базе, на форме?

Извлеките текст письма из реквизита или хранилища значения в строку, добавьте на форму поле HTML-документа, установите адрес about:blank и в обработчике события ДокументСформирован подставьте текст в body документа. Картинки, вложенные в письмо, потребуется отдельно сохранить на диск и поправить ссылки.

Работает ли разбор HTML в фоновом задании?

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

Чем отличается поле HTML-документа от форматированного документа?

Поле HTML-документа отображает произвольную веб-страницу «как в браузере», со стилями и скриптами. Форматированный документ — это редактируемый текст с ограниченным набором оформления (жирный, курсив, списки, картинки), он не воспроизводит произвольную HTML-вёрстку. Для показа внешних страниц подходит только первый вариант.

Файл читается на клиенте, но не находится на сервере. В чём дело?

Клиент и сервер — разные машины с разными файловыми системами. Путь C:\... существует только на компьютере пользователя. Передайте файл на сервер через временное хранилище (НачатьПомещениеФайла) и обрабатывайте его уже там, либо выполняйте чтение целиком на клиенте.