Частые ошибки в шаблонизаторе
При ошибках использования шаблонизатора срабатывает валидация. Как результат вы получаете название ошибки, которая не дает сохранить письмо.
Научимся разбирать эти ошибки и исправлять их.
В рассылке содержатся неизвестные параметры
Возможные причины и способы исправления.
Работаете с коллекцией?
Проверьте, что правильно задали цикл.
Пример.
Есть параметр Session.GetCategoryActions("ProsmotrKategoriiTovara").Take(1).Categories.Name
Внутри него — коллекция Session.GetCategoryActions("ProsmotrKategoriiTovara").Take(1).Categories
и значение (название) элемента из этой коллекции: ...Name.
Правильный вывод названий:
@{for category in Session.GetCategoryActions("ProsmotrKategoriiTovara").Take(1).Categories}
${category.Name}
@{end for}
Тоже коллекция, но вложенная
То есть цикл в цикле.
Пример:
Order.Items.Take(1).Product.Categories.Name
— коллекция Order.Items.Take(1)
, каждый её элемент имеет ещё одну коллекцию .Product.Categories
, и уже у этого элемента есть значение: ...Name
.
Как понять, что мы столкнулись с такой ситуацией и нужен цикл в цикле?
При формировании параметра мы дважды натыкаемся на коллекцию.
Важно
Take сам по себе не считается отдельной коллекцией, так это просто функция, которая относится к предыдущему параметру-коллекции и отбирает из неё N-нное количество элементов
Первая коллекция:
Вторая коллекция:
Правильный вывод названий:
@{for item in Order.Items.Take(1)}
@{for category in item.Product.Categories}
${category.Name}
@{end for}
@{end for}
Параметр правильный, но используется неправильным типом.
Например, параметр — строка, а вы пытаетесь сложить его с числом.
${Recipient.CustomField.String + 1}
выдаст ошибку, если дополнительное поле не числового типа.
Некорректный шаблон: Строка N, символ M: Недопустимый символ (жалоба на последний символ в шаблоне)
Проверьте, что у вас закрыты все циклы: сравните количество @{for и @{end for}, @{if и @{end if} — они должны совпадать.
Строка M, символ N: Invalid symbol
Проверьте верстку в редакторе кода — возможно в него попали символы из неподходящей кодировки. Такое может быть при копировании кода из различных источников.
Например, можно использовать VS Code:
В метод Take в качестве аргумента под номером 1 передано не константное значение
Функции принимают только константные значения — то есть не переменные, а конкретные значения.
Попытка использовать вместо них переменные закончится ошибкой.
Например, Session.GetCategoryActions("ProsmotrKategoriiTovara").Take(N).Categories
— нерабочий вариант.
Недопустимый тип аргумента «quantity» функции «appendForms»: Ожидался Decimal, а передан String, Строка 1, символ 14: Недопустимый тип результата функции FormatDecimal. Ожидался Decimal, а она возвращает String
Пытаемся использовать функцию, предназначенную для другого типа данных.
Например,
${AppendForms(FormatDecimal(CustomParameters.balance, 'N0′), "балл", "балла", "баллов")}
— функция FormatDecimal преобразует параметр в строку, а функция AppendForms ожидает получить число. Получается конфликт.
Шаблон содержит элементы базового языка параметров, но для рассылки включен расширенный язык
Символ вывода параметра указан внутри фигурных скобок, а не снаружи.
Например, вместо ${Recipient.OnlyStandardFirstName}
указали {$Recipient.OnlyStandardFirstName}