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