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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Многие разработчики замечали интересную особенность: если вручную скопировать содержимое веб-страницы (особенно таблицы) и вставить его в 1С:Предприятие (удобно через универсальный импорт данных через буфер обмена) в режиме 1С:Предприятие, данные распределяются по ячейкам ТабличныйДокумент удивительно корректно. Однако при попытке реализовать это программно возникают сложности, так как стандартные методы платформы не всегда позволяют «бесшовно» переносить сложную верстку. В этой статье мы разберем несколько способов решения этой задачи: от использования внешних приложений до встроенных средств парсинга структуры документа.

Метод 1: Использование Microsoft Excel как транзитного объекта

Самый простой и эффективный способ «подсмотреть», как это делает операционная система — это использовать возможности 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 не рекомендуется по соображениям безопасности и лицензирования.

Метод 2: Программный парсинг DOM средствами 1С

Если нам нужно решение, не зависящее от стороннего ПО (например, для работы в среде Linux или на защищенном сервере), мы можем воспользоваться встроенными объектами ЧтениеHTML и ПостроительDOM. Разберем этот алгоритм.

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

  1. Создаем объект ЧтениеHTML и открываем файл или строку.
  2. Используем ПостроительDOM для получения объекта ДокументDOM.
  3. Находим все узлы с тегом table (поможет обработка для парсинга цен с веб-сайтов) (по аналогии с тем, как строится выгрузка журнала регистрации).
  4. Для каждой строки tr и каждой ячейки td вызываем метод Область() табличного документа.
  5. Записываем текстовое содержимое узла в свойство Текст ячейки. Для этой задачи есть инструмент программного изменения ячеек табличного документа.

Пример фрагмента кода для обхода таблицы:


Чтение = Новый ЧтениеHTML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
ДокументDOM = Построитель.Прочитать(Чтение);

// Получаем все таблицы документа
ТаблицыHTML = ДокументDOM.ПолучитьЭлементыПоИмени("table");

ТабДок = Новый ТабличныйДокумент;
ТекущаяСтрока = 1;

Для Каждого Таблица Из ТаблицыHTML Цикл
    СтрокиHTML = Таблица.ПолучитьЭлементыПоИмени("tr");
    Для Каждого СтрокаHTML Из СтрокиHTML Цикл
        ЯчейкиHTML = СтрокаHTML.ПолучитьЭлементыПоИмени("td");
        ТекущаяКолонка = 1;
        Для Каждого ЯчейкаHTML Из ЯчейкиHTML Цикл
            Ячейка1С = ТабДок.Область(ТекущаяСтрока, ТекущаяКолонка);
            Ячейка1С.Текст = ЯчейкаHTML.ТекстовоеСодержимое;
            ТекущаяКолонка = ТекущаяКолонка + 1;
        КонецЦикла;
        ТекущаяСтрока = ТекущаяСтрока + 1;
    КонецЦикла;
КонецЦикла;

Этот способ требует больше кода, но он полностью автономен и работает на любой платформе, где запущена 1С.

Метод 3: Использование формата XML Spreadsheet 2003 (SpreadsheetML)

Выясним причину, почему 1С так хорошо понимает Excel. Платформа имеет встроенную поддержку формата XML-Excel. Если ваш HTML содержит только данные (без сложной графики), его можно преобразовать в XML-структуру, которую 1С прочитает методом Прочитать() с указанием типа файла ТипФайлаТабличногоДокумента.XML.

Проанализируем преимущества этого подхода: он быстрее, чем COM, и надежнее, чем ручной перебор тегов. Вы можете использовать XSLT-преобразование, чтобы превратить HTML-теги в узлы Worksheet, Table, Row и Cell. Это «золотая середина» для высокопроизводительных серверных задач.

Метод 4: Эмуляция буфера обмена через PowerShell

Рассмотрим ситуацию, когда нам нужно в точности повторить поведение пользователя «Ctrl+C — Ctrl+V», но программно. В Windows это можно сделать через PowerShell. Мы можем вызвать команду, которая поместит HTML-текст в буфер обмена в специальном формате HTML Format, который понимает 1С.

После того как данные программно помещены в буфер, мы можем активизировать окно 1С и использовать WshShell для имитации нажатия клавиш:


WshShell = Новый COMОбъект("WScript.Shell");
WshShell.SendKeys("^{v}");

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

Ограничения объекта ФорматированныйДокумент

Часто возникает вопрос: почему нельзя использовать ФорматированныйДокумент? Выясним это. У данного объекта действительно есть метод УстановитьHTML(). Однако этот объект предназначен для работы с текстом и картинками (как в почтовых клиентах), а не для представления данных в виде сетки ячеек. При попытке перенести данные из ФорматированныйДокумент в ТабличныйДокумент вы потеряете табличную структуру, так как механизмы их визуализации принципиально разные.

Подведение итогов

Проанализировав все варианты, мы можем сделать следующие выводы:

  1. Если на компьютере гарантированно есть Excel и задача выполняется интерактивно — используйте Метод 1 (COM). Это самый быстрый путь к результату с сохранением всех нюансов оформления.
  2. Если работа идет на сервере или в кроссплатформенной среде — используйте Метод 2 (DOM), что упростит экспорт справочников. Это обеспечит стабильность и независимость от внешнего софта.
  3. Для высоконагруженных систем лучшим выбором будет генерация XML Spreadsheet 2003 или использование промежуточных легких библиотек для конвертации HTML в XLSX.

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

← На главную