Как программно добавить таблицу товаров в тело письма при отправке счета из 1С:Комплексная автоматизация

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

При автоматизации бизнес-процессов в 1С:Комплексная автоматизация (КА 2) часто возникает задача не просто прикрепить печатную форму счета в формате PDF, но и продублировать краткий перечень товаров непосредственно в тексте письма. Это повышает лояльность клиентов, позволяя им быстро ознакомиться с составом заказа, не открывая вложения.

В этой статье мы разберем, как реализовать механизм динамического формирования таблицы в теле письма, рассмотрим стандартные инструменты БСП и методы прямой работы с HTML-разметкой.

Способ 1: Использование механизма «Шаблоны сообщений» (БСП)

Прежде чем приступать к написанию кода, проанализируем возможности встроенной подсистемы Библиотеки стандартных подсистем (БСП). В современных версиях КА 2 уже существует справочник ШаблоныСообщений. Это наиболее «чистый» способ с точки зрения архитектуры системы.

Для реализации этого метода выполним следующие действия:

  1. Перейдем в раздел администрирования и найдем справочник «Шаблоны сообщений».
  2. Создадим новый шаблон для документа «Счет на оплату».
  3. В визуальном редакторе мы можем вставить параметры (Номер, Дата, Сумма).
  4. Для вывода таблицы товаров в БСП используется механизм работы с группами или вложенными наборами данных. Программа позволяет настроить цикл по строкам табличной части.

Преимущество: Пользователь может самостоятельно редактировать текст вокруг таблицы без участия программиста.

Способ 2: Программная генерация HTML-таблицы

Если нам требуется сложная логика или специфическое оформление, которое трудно реализовать в стандартном редакторе, мы прибегнем к программному формированию HTML-строки. Рассмотрим ситуацию, когда нам нужно собрать таблицу товаров из документа ЗаказКлиента или СчетНаОплату.

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


Функция СформироватьТаблицуТоваровHTML(ОбъектСсылка) Экспорт
    
    ТекстHTML = "<table style='border-collapse: collapse; width: 100%; border: 1px solid #000;'>";
    ТекстHTML = ТекстHTML + "<tr style='background-color: #f2f2f2;'>
                <th style='border: 1px solid #000; padding: 8px;'>№</th>
                <th style='border: 1px solid #000; padding: 8px;'>Товар</th>
                <th style='border: 1px solid #000; padding: 8px;'>Кол-во</th>
                <th style='border: 1px solid #000; padding: 8px;'>Цена</th>
                <th style='border: 1px solid #000; padding: 8px;'>Сумма</th></tr>";
    
    НомерСтроки = 1;
    Для Каждого СтрокаТЧ Из ОбъектСсылка.Товары Цикл
        ТекстHTML = ТекстHTML + "<tr>";
        ТекстHTML = ТекстHTML + "<td style='border: 1px solid #000; padding: 8px;'>" + НомерСтроки + "</td>";
        ТекстHTML = ТекстHTML + "<td style='border: 1px solid #000; padding: 8px;'>" + СтрокаТЧ.Номенклатура + "</td>";
        ТекстHTML = ТекстHTML + "<td style='border: 1px solid #000; padding: 8px; text-align: right;'>" + СтрокаТЧ.Количество + "</td>";
        ТекстHTML = ТекстHTML + "<td style='border: 1px solid #000; padding: 8px; text-align: right;'>" + Формат(СтрокаТЧ.Цена, "ЧДЦ=2") + "</td>";
        ТекстHTML = ТекстHTML + "<td style='border: 1px solid #000; padding: 8px; text-align: right;'>" + Формат(СтрокаТЧ.Сумма, "ЧДЦ=2") + "</td>";
        ТекстHTML = ТекстHTML + "<tr>";
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    
    ТекстHTML = ТекстHTML + "</table>";
    Возврат ТекстHTML;
    
КонецФункции

После генерации этой строки её необходимо вставить в тело письма. В объекте ЭлектронноеПисьмоИсходящее за это отвечает поле Текст. Критически важно установить правильный тип текста сообщения:


Письмо = Справочники.ЭлектронныеПисьмаИсходящие.СоздатьОбъект();
Письмо.Текст = "Добрый день! Ниже представлен перечень товаров по вашему счету:" + Символы.ПС + СформироватьТаблицуТоваровHTML(СсылкаНаСчет);
Письмо.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML;

Способ 3: Конвертация Табличного документа в HTML

Разберем самый эффективный метод, который позволяет сохранить дизайн вашей печатной формы (логотипы, выделение цветом, шрифты) без ручного написания HTML-тегов. Мы можем использовать метод Записать() объекта ТабличныйДокумент.

Проанализируем этот алгоритм:

  1. Формируем стандартный ТабличныйДокумент с помощью макета печатной формы счета.
  2. Сохраняем его во временный файл во временном хранилище с расширением .html.
  3. Читаем содержимое файла в строку и вставляем в письмо.

// 1. Получаем табличный документ (например, из менеджера документа)
ТабДок = Документы.СчетНаОплатуКлиенту.СформироватьПечатнуюФормуСчета(СсылкаНаСчет);

// 2. Записываем во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("html");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML);

// 3. Читаем HTML-код
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
СодержимоеHTML = ТекстовыйДокумент.ПолучитьТекст();

Важный нюанс: Метод записи в HTML генерирует полный документ с тегами <html> и <body>. Если вы вставляете это в уже существующее письмо, может потребоваться извлечь только содержимое блока <body> или использовать строковые функции для замены частей текста.

Точки встраивания в конфигурации КА 2

Чтобы наше решение заработало при нажатии стандартной кнопки «Отправить по почте», нам нужно найти место, где формируется структура ПараметрыОтправки. Обычно это происходит в общих модулях, отвечающих за печать, таких как УправлениеПечатью или в обработке ПечатьПисем.

Выясним причину, почему письмо может отображаться некорректно. В 1С:КА при использовании БСП структура письма часто передается через параметры. Ищите процедуру ПередСозданиемЗадачПочтовыхСообщений или аналогичные в модуле Взаимодействия. Именно там происходит заполнение свойства Текст.

Подведем итог: для простых задач идеально подходят Шаблоны сообщений. Если нужно точное соответствие печатной форме — используем конвертацию Табличного документа в HTML. Для полностью кастомных решений — ручную сборку HTML-строки с использованием инлайновых стилей. Это обеспечит корректное отображение таблицы у большинства получателей.

← На главную