Многие разработчики замечали интересную особенность: если вручную скопировать содержимое веб-страницы (особенно таблицы) и вставить его в 1С:Предприятие (удобно через универсальный импорт данных через буфер обмена) в режиме 1С:Предприятие, данные распределяются по ячейкам ТабличныйДокумент удивительно корректно. Однако при попытке реализовать это программно возникают сложности, так как стандартные методы платформы не всегда позволяют «бесшовно» переносить сложную верстку. В этой статье мы разберем несколько способов решения этой задачи: от использования внешних приложений до встроенных средств парсинга структуры документа.
Самый простой и эффективный способ «подсмотреть», как это делает операционная система — это использовать возможности Microsoft Excel. Excel отлично справляется с импортом HTML-файлов и умеет сохранять их в формате, который 1С понимает «из коробки» (xls или xlsx). Рассмотрим по шагам, как это реализовать.
Для начала сохраним наш HTML во временный файл и используем COM-соединение с Excel для преобразования. Проанализируем пример кода, предложенный участниками обсуждения:
ИмяФайлаHTML = "C:\Temp\example.html"; // Путь к вашему исходному HTML
ИмяФайлаТаблицы = ПолучитьИмяВременногоФайла("xlsx");
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен на данном компьютере!");
Возврат;
КонецПопытки;
// Открываем HTML файл средствами Excel
Книга = Эксель.WorkBooks.Open(ИмяФайлаHTML);
// Сохраняем в формате XLSX (код формата 51) или XLS (код формата 56)
// Формат 51 более современный и лучше обрабатывается платформой 8.3
Книга.SaveAs(ИмяФайлаТаблицы, 51);
Книга.Close();
Эксель.Quit();
// Читаем полученный файл в объект 1С
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяФайлаТаблицы);
ТабличныйДокумент.Показать();
Важный нюанс: использование метода SaveAs с параметром 51 гарантирует, что структура таблиц сохранится максимально точно. Этот метод позволяет не задумываться о сложности CSS-стилей, так как Excel берет на себя всю работу по рендерингу. Однако помните, что на сервере 1С установка MS Office не рекомендуется по соображениям безопасности и лицензирования.
Если нам нужно решение, не зависящее от стороннего ПО (например, для работы в среде Linux или на защищенном сервере), мы можем воспользоваться встроенными объектами ЧтениеHTML и ПостроительDOM. Разберем этот алгоритм.
Этот метод заключается в том, чтобы программно «обойти» дерево тегов HTML и вручную заполнить ячейки 1С. Для этого есть автоматическая загрузка данных из HTML-файлов в 1С. Рассмотрим логику процесса:
ЧтениеHTML и открываем файл или строку.ПостроительDOM для получения объекта ДокументDOM.table (поможет обработка для парсинга цен с веб-сайтов) (по аналогии с тем, как строится выгрузка журнала регистрации).tr и каждой ячейки td вызываем метод Область() табличного документа.Текст ячейки. Для этой задачи есть инструмент программного изменения ячеек табличного документа.Пример фрагмента кода для обхода таблицы:
Чтение = Новый ЧтениеHTML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
ДокументDOM = Построитель.Прочитать(Чтение);
// Получаем все таблицы документа
ТаблицыHTML = ДокументDOM.ПолучитьЭлементыПоИмени("table");
ТабДок = Новый ТабличныйДокумент;
ТекущаяСтрока = 1;
Для Каждого Таблица Из ТаблицыHTML Цикл
СтрокиHTML = Таблица.ПолучитьЭлементыПоИмени("tr");
Для Каждого СтрокаHTML Из СтрокиHTML Цикл
ЯчейкиHTML = СтрокаHTML.ПолучитьЭлементыПоИмени("td");
ТекущаяКолонка = 1;
Для Каждого ЯчейкаHTML Из ЯчейкиHTML Цикл
Ячейка1С = ТабДок.Область(ТекущаяСтрока, ТекущаяКолонка);
Ячейка1С.Текст = ЯчейкаHTML.ТекстовоеСодержимое;
ТекущаяКолонка = ТекущаяКолонка + 1;
КонецЦикла;
ТекущаяСтрока = ТекущаяСтрока + 1;
КонецЦикла;
КонецЦикла;
Этот способ требует больше кода, но он полностью автономен и работает на любой платформе, где запущена 1С.
Выясним причину, почему 1С так хорошо понимает Excel. Платформа имеет встроенную поддержку формата XML-Excel. Если ваш HTML содержит только данные (без сложной графики), его можно преобразовать в XML-структуру, которую 1С прочитает методом Прочитать() с указанием типа файла ТипФайлаТабличногоДокумента.XML.
Проанализируем преимущества этого подхода: он быстрее, чем COM, и надежнее, чем ручной перебор тегов. Вы можете использовать XSLT-преобразование, чтобы превратить HTML-теги в узлы Worksheet, Table, Row и Cell. Это «золотая середина» для высокопроизводительных серверных задач.
Рассмотрим ситуацию, когда нам нужно в точности повторить поведение пользователя «Ctrl+C — Ctrl+V», но программно. В Windows это можно сделать через PowerShell. Мы можем вызвать команду, которая поместит HTML-текст в буфер обмена в специальном формате HTML Format, который понимает 1С.
После того как данные программно помещены в буфер, мы можем активизировать окно 1С и использовать WshShell для имитации нажатия клавиш:
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.SendKeys("^{v}");
Важно: этот метод крайне нестабилен, так как зависит от фокуса окна и текущего состояния рабочего стола пользователя, поэтому его стоит использовать только в исключительных случаях на стороне клиента.
Часто возникает вопрос: почему нельзя использовать ФорматированныйДокумент? Выясним это. У данного объекта действительно есть метод УстановитьHTML(). Однако этот объект предназначен для работы с текстом и картинками (как в почтовых клиентах), а не для представления данных в виде сетки ячеек. При попытке перенести данные из ФорматированныйДокумент в ТабличныйДокумент вы потеряете табличную структуру, так как механизмы их визуализации принципиально разные.
Проанализировав все варианты, мы можем сделать следующие выводы:
Выбор конкретного метода зависит от ваших требований к производительности и окружению, в котором будет работать ваша конфигурация 1С.