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

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

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

Выясним причину: почему 1С не видит колонки?

Проанализируем ситуацию с технической точки зрения. Когда мы копируем данные из Outlook, в буфер обмена Windows попадает не просто текст, а сложный объект в формате CF_HTML. Microsoft Outlook использует движок Word для рендеринга писем, поэтому генерируемый HTML-код перегружен специфическими стилями (так называемые mso-style), вложенными тегами <span> и сложной блочной версткой.

Рассмотрим основные причины сбоя:

  1. Замусоренность тегов: Внутри каждой ячейки <td> может находиться несколько контейнеров <p> или <div> с жестко заданными отступами. 1С при парсинге буфера обмена может интерпретировать эти блоки как новые строки.
  2. Нестандартная разметка: Если таблица в письме была создана с использованием «умных» стилей Word, она может вообще не содержать классических тегов <table>, имитируя табличный вид через абсолютное позиционирование элементов.
  3. Особенности парсера 1С: Встроенный механизм вставки в ТабличныйДокумент ожидает относительно «чистую» HTML-разметку. Если структура кажется ему слишком сложной, платформа переходит в режим вставки простого текста, где разделителем ячеек обычно служит символ табуляции или перенос строки.

Способ 1. Промежуточное звено (прагматичный подход)

Как было замечено в обсуждении, самым быстрым способом решения «здесь и сейчас» является использование Microsoft Excel в качестве буфера. Если мы сначала вставим таблицу из Outlook в Excel, а затем скопируем её оттуда в 1С, структура сохранится идеально.

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

Способ 2. Использование объекта ЧтениеHTML (спортивный подход)

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

Проанализируем примерный алгоритм действий:

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

Рассмотрим пример кода для обработки структуры:


// Предположим, ТелоПисьма - это строка с HTML-кодом
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТелоПисьма);

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

Таблица = ДокументDOM.ПолучитьЭлементыПоИмени("table")[0]; // Берем первую таблицу
Если Таблица <> Неопределено Тогда
    СтрокиТаблицы = Таблица.ПолучитьЭлементыПоИмени("tr");
    Для НомерСтроки = 0 По СтрокиТаблицы.Количество() - 1 Цикл
        Ячейки = СтрокиТаблицы[НомерСтроки].ПолучитьЭлементыПоИмени("td");
        Для НомерКолонки = 0 По Ячейки.Количество() - 1 Цикл
            // Записываем данные в ТабличныйДокумент напрямую
            ТабДок.Область(НомерСтроки + 1, НомерКолонки + 1).Текст = Ячейки[НомерКолонки].ТекстовоеСодержимое;
        КонецЦикла;
    КонецЦикла;
КонецЕсли;

Способ 3. Очистка HTML через COM-объект

Если нам нужно очистить HTML от лишнего «мусора» перед тем, как позволить 1С выполнить стандартную вставку, мы можем воспользоваться объектом HTMLFile. Этот метод позволяет убрать все стили и атрибуты, оставив только чистые теги данных.

Разберем, как это сделать программно:


HTMLДокумент = Новый COMОбъект("HTMLFile");
HTMLДокумент.open();
HTMLДокумент.write(ИсходныйТекстИзБуфера);
HTMLДокумент.close();

// Теперь можно программно удалить все теги style и class
ВсеЭлементы = HTMLДокумент.all;
Для Каждого Элемент Из ВсеЭлементы Цикл
    Элемент.removeAttribute("style");
    Элемент.removeAttribute("class");
КонецЦикла;

ОчищенныйТекст = HTMLДокумент.documentElement.outerHTML;

После такой обработки 1С гораздо охотнее распознает таблицу, так как исчезают вложенные стили, которые сбивали парсер с толку.

Способ 4. Использование Поля HTML документа на форме

Интересным решением является использование невидимого Поля HTML документа. Мы можем программно «вставить» содержимое буфера в это поле. Поскольку оно использует движок браузера (Internet Explorer или WebKit в зависимости от режима), таблица будет отрисована корректно. После этого мы можем программно извлечь данные из ячеек DOM-модели этого поля и перенести их в ТабличныйДокумент.

Преимущества этого метода:

Рекомендации по работе в Outlook

Если вы являетесь администратором или разработчиком, стоит обратить внимание на то, как именно копируются данные. Посмотрим на настройки Outlook: в некоторых случаях переключение режима просмотра письма из «HTML» в «Rich Text» и обратно позволяет изменить структуру попадающих в буфер данных. Также, если открыть письмо в браузере (через функцию «Просмотреть в браузере» в Outlook), копирование из окна браузера часто дает более чистый результат, чем копирование напрямую из приложения.

Подведем итог: Проблема вставки таблиц — это проблема несоответствия стандартов разметки Microsoft Word и ожиданий парсера 1С. Для простых задач используйте Excel как промежуточный этап. Для профессиональной автоматизации внедряйте парсинг через ЧтениеHTML или очистку через HTMLFile. Это позволит вашим пользователям забыть о ручном исправлении колонок и сделает работу с почтой в 1С комфортной.

← На главную