Как вывести данные из табличной части документа в HTML-шаблоне оповещения 1С?

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

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

Разбор основной ошибки: почему выводится только первая строка

Проанализируем ситуацию, когда в шаблоне используется конструкция вида Объект.ГрафикПлатежей[0].Сумма. В данном случае индекс [0] жестко указывает системе на первую строку коллекции. Даже если вы обернете это обращение в цикл по документам, для каждого документа будет выбираться только первая запись из его табличной части.

Для корректного вывода всех строк необходимо использовать вложенный цикл. Разберем по шагам, как должна выглядеть структура HTML-таблицы. Чтобы каждая строка табличной части 1С превращалась в отдельную строку <tr> в электронном письме, теги формирования строки должны находиться внутри цикла перебора коллекции.

Решение 1: Использование вложенного цикла в HTML-разметке

Рассмотрим пример кода, который позволяет перебрать все документы в выборке, а внутри каждого документа — все строки его графика платежей. Обратите внимание на правильное расположение тегов <tr> и <td> относительно операторов цикла {%Для каждого...%}.


{%Пока СтруктураКонтекст.ВыборкаДокументов.Следующий Цикл%}
    {%Для каждого Стр из СтруктураКонтекст.ВыборкаДокументов.Объект.ГрафикПлатежей Цикл%}
        <tr>
            <td>{%Строка(СтруктураКонтекст.ВыборкаДокументов.Объект.Контрагент)%}</td>
            <td>{%Строка(СтруктураКонтекст.ВыборкаДокументов.Объект.ДоговорКонтрагента)%}</td>
            <td>{%Строка(СтруктураКонтекст.ВыборкаДокументов.Объект)%}</td>
            <td>{%Строка(Стр.Сумма)%}</td>
        </tr>
    {%КонецЦикла%}
{%КонецЦикла%}

В этом примере внешний цикл отвечает за перебор документов, а внутренний цикл — за создание строк в HTML-таблице для каждой записи из графика платежей этого документа. Таким образом, если в документе 5 строк графика, в письме появится 5 соответствующих строк <tr>.

Решение 2: Оптимизация производительности и работа с объектом

Важно помнить о производительности. В сообщениях форума справедливо отмечено, что обращение к свойству .Объект внутри цикла является «тяжелой» операцией. Каждый раз, когда система встречает ВыборкаДокументов.Объект, она выполняет полноценное чтение объекта из базы данных. Если документов много, это может существенно замедлить формирование уведомлений.

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

Решение 3: Правильное использование условий {%Если%}

Часто требуется выводить не все строки, а только те, которые соответствуют определенному критерию (например, где не заполнен документ планирования). Посмотрим на типичные ошибки в синтаксисе условий внутри шаблонов БСП.

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

  1. Точка с запятой: Внутри конструкций {% %} интерпретатор часто требует завершать операторы точкой с запятой, например, {%КонецЕсли;%}.
  2. Проверка на пустое значение: Вместо прямого сравнения с НЕОПРЕДЕЛЕНО, которое может некорректно распознаваться в контексте шаблона, лучше использовать системную функцию ЗначениеЗаполнено().
  3. Регистр и пробелы: Движок шаблонов чувствителен к написанию ключевых слов.

Проанализируем исправленный вариант условия с использованием индексации (если вы предпочитаете цикл Для...По):


{%Для Индекс = 0 По СтруктураКонтекст.ВыборкаДокументов.Объект.ГрафикПлатежей.Количество() - 1 Цикл%}
    {%Если Не ЗначениеЗаполнено(СтруктураКонтекст.ВыборкаДокументов.Объект.ГрафикПлатежей[Индекс].ДокументПланирования) Тогда%}
        <tr>
            <td>{%Строка(СтруктураКонтекст.ВыборкаДокументов.Объект.Контрагент)%}</td>
            <td>{%Строка(СтруктураКонтекст.ВыборкаДокументов.Объект.ГрафикПлатежей[Индекс].Сумма)%}</td>
            <td>{%Строка(СтруктураКонтекст.ВыборкаДокументов.Объект.ГрафикПлатежей[Индекс].Период)%}</td>
        </tr>
    {%КонецЕсли;%}
{%КонецЦикла;%}

Советы по оформлению и отладке

При работе с HTML-разметкой внутри циклов 1С придерживайтесь следующих правил:

Подводя итог, можно сказать, что наиболее стабильный и производительный метод — это подготовка «плоской» таблицы данных перед передачей в шаблон. Это позволяет избежать вложенных циклов в самом HTML и делает код шаблона чистым и понятным.

← На главную