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

Рис. 1. Значение функции Period в оповещении при создании задачи
Пример класса точки расширения
FormatedValue – это форматируемое значение Вашей функции.
FunctionEvaluationContext – это параметры для вычисления Вашей функции. Количество параметров может быть неограниченно. В функции параметры отделяются друг от друга точкой запятой, например, {Period({$New.StartDate};{$New.EndDate};SR(’Период’))} , где {$New.StartDate}, {$New.EndDate} и SR(’Период’) являются параметрами. Для того, чтобы получить значение нужного параметра, необходимо ссылаться на номер его позиции. Если обратиться к вышеописанному примеру, то параметр {$New.StartDate} имеет порядковый номер равный 0, {$New.EndDate} является номером 1 и так далее. Чтобы записать значение параметра необходимо привести его к правильному формату, в этом поможет функция context.GenerationContext.FormatProvider.FormatValue(context.Parameters[Номер_Позиции_Параметра]). Необходимость приведения к правильному формату обусловлена тем, что в значении переменной могут находится лишние символы, например, при передаче даты окончания пользовательской задачи без времени (дд.мм.гггг) без использования приведения к верному формату в оповещении будет дата начала равная дд.мм.гггг 23:59:50, а если использовать приведение, то дата запишется в верном формате.
Название функции будет совпадать с названием метода Вашего класса, реализующего функцию для шаблона оповещения. В данном примере использование функции в оповещении будет выглядеть следующим образом: {Period({$New.StartDate};{$New.EndDate};SR(’Период’))}, причем параметр под номером 3 является необязательным, так как название поля будет сгенерировано по умолчанию Срок выполнения.
[Component]
public class MyNotificationFunction : INotificationFunctions
{
/// <summary>
/// Генерирует строку, состоящую из имени свойства и значений двух дат.
/// Параметр 1 - Значение 1 (Дата начала).
/// Параметр 2 - Значение 2 (Дата окончания).
/// Параметр 3 - Заголовок (необязательный), по умолчанию генерируется название "Срок выполнения".
/// </summary>
public static FormatedValue Period(FunctionEvaluationContext context)
{
string captionFinish = SR.T("Срок выполнения");
if (context.Parameters.Count < 2) return new FormatedValue(string.Empty);
//Значение первого параметра (Дата начала)
var startDateValue = context.Parameters[0];
//Отформатированное строковое значение Даты начала
var startDateFormatedValue = context.GenerationContext.FormatProvider.FormatValue(startDateValue);
//Значение второго параметра (Дата окончания)
var endDateValue = context.Parameters[1];
//Отформатированное строковое значение Даты окончания
var endDateFormatedValue = context.GenerationContext.FormatProvider.FormatValue(endDateValue);
//Формируем текст значений оповещения
var formattedValue = SR.T("с {0} до {1}", startDateFormatedValue, endDateFormatedValue);
if (context.Parameters.Count == 3)
{
//Формируем название поля
var caption = context.Parameters[2];
var captionFormatedValue = context.GenerationContext.FormatProvider.FormatValue(caption);
captionFinish = captionFormatedValue;
}
//Генерируем разметку
return new FormatedValue(string.Format("{0} {1}", captionFinish, formattedValue));
}
}
Создание собственной функции генератора шаблонов оповещений
Реализация ITemplateGeneratorFunctionsContainer аналогична реализации INotificationFunctions. В данном примере реализована функция PriorityHight, которая возвращает true, если задача имеет приоритет Высокий. Отличие данных точек расширения в том, что INotificationFunctions используются для отображения в разметке, тогда как ITemplateGeneratorFunctionsContainer используются в условиях фильтраций Condition.
Пример:
<Filter>
<Condition>
(PriorityHight({$New}) = true)
</Condition>
</Filter>
Пример класса точки расширения
[Component]
public class TemplateGenerator : ITemplateGeneratorFunctionsContainer
{
public static FormatedValue PriorityHight(FunctionEvaluationContext context)
{
var result = false;
if (context != null && context.Parameters != null && context.Parameters.Count > 0)
{
var ctxParam = context.Parameters[0];
if (ctxParam != null && ctxParam.Value is ITaskBase)
{
var task = (ITaskBase)ctxParam.Value;
if (task.Priority == TaskPriority.High)
result = true;
}
}
return new FormatedValue(result);
}
}
Данную функцию можно добавить в уже существующий шаблон оповещений Tasks.Task.xml в <Notification Name="Create">. В данном шаблоне уже существует условие, при котором оповещение отправится получателям, но если добавить and (PriorityHight({$New}) = true) – тогда будут отправляться оповещения при создании задачи, если её приоритет высокий.
Ссылки на элементы API
- INotificationFunctions (для версий 3.13, 3.15, 4.0);
- ITemplateGeneratorFunctionsContainer (для версий 3.13, 3.15, 4.0).