Как программно заполнить параметры в шаблоне сообщения 1С?

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

В конфигурациях 1С, таких как «Комплексная автоматизация 2.4», часто используется механизм шаблонов сообщений для отправки писем или уведомлений. В эти шаблоны можно добавлять параметры (например, `[НомерЗаказа]`, `[СуммаДокумента]`), которые система должна заполнять при формировании текста. Возникает вопрос: как передать значения для этих параметров из кода, особенно если они не являются реквизитами основного объекта? При необходимости настроить почтовые оповещения без написания кода можно использовать механизм для фоновой отправки уведомлений.

Рассмотрим по шагам, как правильно подготовить и передать произвольные параметры для их автоматической подстановки в текст шаблона — для этого подойдёт обработка автоматической настройки и отправки писем по шаблонам 1С.

Решение 1: Использование общего модуля `ШаблоныСообщений`

Это основной и наиболее правильный способ для решения нашей задачи. В типовых конфигурациях существует общий модуль ШаблоныСообщений, который содержит все необходимые функции для работы с шаблонами. Нам понадобится функция СформироватьСообщение. Для быстрого поиска примеров вызова типовых процедур подойдёт справочник по методам библиотеки стандартных подсистем.

Ключевой момент — правильная подготовка четвертого параметра этой функции, который называется ДополнительныеПараметры. Система ожидает, что это будет структура, внутри которой есть специальный ключ — "ПроизвольныеПараметры". Значением для этого ключа должна быть коллекция (чаще всего Соответствие, но иногда может сработать и Структура), где ключами выступают имена наших параметров из шаблона, а значениями — то, что мы хотим в них подставить.

Проанализируем пример кода, который решает задачу:

  1. Создаем коллекцию для произвольных параметров. Надежнее всего использовать объект Соответствие.
  2. Заполняем коллекцию. Вставляем пары "Имя параметра" - "Значение". Имя параметра должно в точности совпадать с тем, что указано в шаблоне (без квадратных скобок).
  3. Создаем основную структуру. Это будет структура ДополнительныеПараметры.
  4. Помещаем нашу коллекцию в основную структуру. Используем ключ "ПроизвольныеПараметры".
  5. Вызываем функцию формирования сообщения. Передаем в нее ссылку на шаблон, объект-основание (например, ссылку на документ), уникальный идентификатор формы и подготовленную структуру.

Посмотрим, как это выглядит в коде. Предположим, у нас есть шаблон с параметром `[Номер]` и мы хотим подставить в него номер текущего документа.


&НаСервере
Процедура СформироватьИОтправитьПисьмоНаСервере()

    // Ссылка на используемый шаблон сообщения
    Шаблон = Справочники.ШаблоныСообщений.НайтиПоНаименованию("Уведомление клиенту о заказе");

    // 1. Создаем соответствие для произвольных параметров
    Произвольные = Новый Соответствие;

    // 2. Заполняем его: Ключ - имя параметра в шаблоне, Значение - нужное нам значение
    Произвольные.Вставить("Номер", Объект.Номер);
    // Сюда можно добавить и другие параметры
    // Произвольные.Вставить("ДатаЗаказа", Формат(Объект.Дата, "ДФ=dd.MM.yyyy")); 

    // 3. Создаем основную структуру для дополнительных параметров
    ДополнительныеПараметры = Новый Структура;

    // 4. Вставляем в нее наше соответствие с ключевым именем "ПроизвольныеПараметры"
    ДополнительныеПараметры.Вставить("ПроизвольныеПараметры", Произвольные);

    // 5. Вызываем функцию формирования сообщения
    СообщениеСПараметром = ШаблоныСообщений.СформироватьСообщение(
        Шаблон, 
        Объект.Ссылка, 
        ЭтотОбъект.УникальныйИдентификатор, 
        ДополнительныеПараметры
    );
    
    // Теперь в переменной СообщениеСПараметром находится структура с готовым текстом и темой
    ТекстДляОтправки = СообщениеСПараметром.Текст;
    ТемаПисьма = СообщениеСПараметром.Тема;

    // ...дальнейший код по отправке письма...

КонецПроцедуры

Этот же подход подтверждается и другим примером, где используется функция СформироватьСообщениеИОтправить. Логика остается той же:


// ...
ДополнительныеПараметры = Новый Структура;
ПроизвольныеПараметры = Новый Соответствие;

// Ключ - имя параметра из Шаблона письма
// Значение - вставляемая в письмо строка
ПроизвольныеПараметры.Вставить("ИмяМоегоПараметра", "Нужная строка для подстановки");

ДополнительныеПараметры.Вставить("ПроизвольныеПараметры", ПроизвольныеПараметры);

Сообщение = ШаблоныСообщений.СформироватьСообщениеИОтправить(
    ШаблонСобытия, 
    ОбъектОповещения, 
    УИД, 
    ДополнительныеПараметры
);

Важный момент: если параметр в шаблоне совпадает с именем реквизита объекта-основания (второй параметр функции), система может подставить его автоматически. Параметр ПроизвольныеПараметры нужен для тех случаев, когда данные нужно вычислить, получить из другого места или их просто нет в объекте-основании.

Решение 2: Использование переопределяемого модуля

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

Этот модуль позволяет встроиться в процесс формирования сообщения и добавить свою логику. Нам интересна процедура ПриФормированииСообщения.

Этот подход позволяет, например, на лету вычислять и добавлять параметры, которых изначально не было в вызове, или изменять существующие.

Рассмотрим пример. Допустим, мы хотим централизованно добавлять в любые письма некое значение "БЛАБЛАБЛАБАЛ" для всех произвольных параметров, которые есть в шаблоне.

Для этого в модуле ШаблоныСообщенийПереопределяемый, в процедуре ПриФормированииСообщения, можно разместить следующий код:


Процедура ПриФормированииСообщения(Сообщение, НазначениеШаблона, ПредметСообщения, ПараметрыШаблона) Экспорт

    // Вызываем нашу процедуру для дозаполнения
    ДозаполнитьПроизвольныеПараметры(Сообщение, НазначениеШаблона, ПредметСообщения, ПараметрыШаблона);

КонецПроцедуры


Процедура ДозаполнитьПроизвольныеПараметры(Сообщение, НазначениеШаблона, ПредметСообщения, ПараметрыШаблона)
    
    ДополнительныеЗначенияРеквизитов = Новый Соответствие;

    // ПараметрыШаблона.Параметры содержит список параметров, определенных в шаблоне
    Для каждого КлючИЗначение Из ПараметрыШаблона.Параметры Цикл
        // Здесь можно добавить сложную логику определения значения
        // В данном примере для всех параметров подставляется одна и та же строка
        ДополнительныеЗначенияРеквизитов.Вставить(КлючИЗначение.Ключ, "БЛАБЛАБЛАБАЛ");
    КонецЦикла;

    // Вызываем служебную функцию для непосредственной подстановки значений в текст
    // Параметр "Произвольные." - это префикс, который система ищет в шаблоне
    Сообщение.Текст = ШаблоныСообщенийСлужебный.ВставитьПараметрыВСтрокуСогласноТаблицеПараметров(
        Сообщение.Текст,
        ДополнительныеЗначенияРеквизитов,
        "Произвольные."
    );

КонецПроцедуры

Этот метод более сложный и нужен для доработки типовой конфигурации без ее изменения. Для решения локальной задачи в рамках одной обработки или документа обычно достаточно первого способа.

Таким образом, для программного заполнения параметров в шаблонах сообщений следует использовать штатный механизм через общий модуль ШаблоныСообщений, уделяя особое внимание правильному формированию структуры ДополнительныеПараметры.

← На главную