PipeLang — функциональный язык выражений RetailCRM, на котором описывают условия срабатывания триггеров и вычисляют динамические значения в действиях. Он избавляет от программирования на стороне сервера: логика обработки заказов и клиентов задаётся прямо в интерфейсе автоматизации.
Что такое PipeLang и где он применяется
PipeLang — это встроенный язык RetailCRM для вычисления значений и проверки условий. Своё название он получил от оператора конвейера — вертикальной черты |, через которую значение передаётся из одной функции в другую. По сути каждое выражение — это цепочка преобразований: слева стоит источник данных, справа — последовательно применяемые функции.
Язык используется в нескольких местах платформы:
- Условия триггеров — логические выражения, определяющие, сработает ли триггер на событие;
- Динамические значения в действиях триггера — например, вычисление суммы скидки или текста комментария;
- Поля с формулами в настройках автоматизации, где нужно подставить или рассчитать значение на лету.
order и customer, — а также их вложенные поля.Базовый синтаксис и оператор пайпа
Минимальное выражение — это обращение к полю объекта: order.totalSumm. Чтобы преобразовать значение, его пропускают через функцию с помощью пайпа. Аргументы функции указывают после двоеточия:
order.totalSumm | round: 0
Цепочки могут быть сколь угодно длинными — результат каждой функции становится входом следующей:
order.customer.firstName | default: "Клиент" | upper
Обращение к вложенным полям идёт через точку, к элементам массива — по индексу или через функции выборки. Строковые литералы заключают в двойные кавычки, числа пишут без кавычек. Логические выражения строят из сравнений и объединяют операторами and, or, not.
- Сравнение:
order.totalSumm > 5000 - Проверка равенства:
order.status == "new" - Комбинация:
order.totalSumm > 5000 and order.customer.vip == true
Функции и фильтры
Функции PipeLang делятся на несколько групп. Ниже — типовой набор, который покрывает большинство задач автоматизации.
| Группа | Функции | Назначение |
|---|---|---|
| Числа | round, ceil, floor, abs | Округление и модуль |
| Строки | upper, lower, replace, split | Регистр, замена, разбиение |
| Массивы | length, first, last, join, sum | Размер, выборка, свёртка |
| Даты | date, date_modify | Форматирование и сдвиг |
| Значения | default | Подстановка при пустом значении |
Например, посчитать количество позиций в заказе можно так: order.items | length, а суммарную стоимость товаров — order.items | sum: "totalSumm".
Условия триггеров
Условие триггера — это выражение, которое должно вернуть true, чтобы действия выполнились. RetailCRM вычисляет его в момент наступления события: создание заказа, смена статуса, изменение поля. Условие удобно собирать из нескольких проверок.
Пример: триггер срабатывает только для оплаченных заказов дороже 10 000 рублей из определённого магазина:
order.totalSumm > 10000 and order.paymentStatus == "paid" and order.site == "main-shop"
Частая ошибка — сравнивать поле, которого нет в контексте события. Если поле не заполнено, обращение вернёт пустое значение, и сравнение может дать не тот результат, что ожидался. Поэтому перед сравнением полезно подставлять значение по умолчанию:
order.customFields.loyalty | default: 0 > 100
"100" > 90 может отработать не так, как вы рассчитываете.Динамические значения в действиях
В действиях триггера PipeLang вычисляет значение, которое подставляется в поле заказа, комментарий или задачу. Это позволяет, например, автоматически формировать текст или рассчитывать скидку.
- Скидка от суммы. Рассчитать 5% и округлить:
order.totalSumm | multiply: 0.05 | round: 0. - Комментарий менеджеру. Собрать строку из полей клиента:
order.customer.firstName | default: "Гость". - Срок доставки. Прибавить дни к дате:
order.createdAt | date_modify: "+3 days" | date: "d.m.Y".
Динамические значения удобно тестировать на реальных заказах в тестовом триггере, прежде чем включать его на весь поток. Так вы увидите, что именно возвращает выражение, и не испортите боевые данные.
Отладка и типичные ошибки
PipeLang не даёт полноценного отладчика, поэтому логику проверяют итеративно. Несколько практик экономят время:
- Изолируйте выражение. Сначала выведите сырое значение поля, затем добавляйте функции по одной.
- Проверяйте пустые значения. Большинство сбоев — из-за незаполненных полей; подстраховывайтесь
default. - Следите за контекстом. В триггере на клиента доступен
customer, но не всегдаorder; список доступных объектов зависит от события. - Не усложняйте. Если выражение разрастается, вынесите часть логики в отдельный триггер или во внешний сервис через HTTP-действие.
Итог
PipeLang закрывает большую часть задач автоматизации без программирования: условия триггеров, расчёт скидок и сроков, сборку динамических значений. Ключ к надёжным правилам — понимать контекст события, аккуратно обрабатывать пустые поля и держать выражения короткими и читаемыми.
Когда сценарии перерастают возможности встроенного языка и требуют внешней логики, интеграций с 1С или highload-обмена, мы проектируем и разрабатываем такие решения на стороне сервера — с чистой архитектурой, документацией и безопасным обменом данными между RetailCRM и вашими системами.
Частые вопросы
Чем PipeLang отличается от Twig в RetailCRM?
PipeLang рассчитан на условия и вычисление отдельных значений в триггерах, а Twig — на формирование текстовых шаблонов писем, SMS и печатных форм. Это разные инструменты для разных задач автоматизации.
Можно ли обращаться к пользовательским полям заказа?
Да, пользовательские поля доступны через объект customFields, например order.customFields.myField. Имя поля совпадает с его символьным кодом в настройках.
Что вернёт выражение, если поле не заполнено?
Обращение к пустому полю возвращает пустое значение. Чтобы избежать неожиданного поведения в сравнениях, подставляйте значение по умолчанию через функцию default.
Как объединить несколько условий в триггере?
Условия соединяют логическими операторами and, or и not. Части выражения удобно группировать, чтобы приоритет вычислений был однозначным.
Поддерживает ли PipeLang работу с массивами позиций заказа?
Да, к order.items применимы функции length, first, sum и подобные. Так можно посчитать число позиций или суммировать стоимость товаров.
Как протестировать выражение перед запуском на боевом потоке?
Создайте тестовый триггер с узким условием или проверьте на конкретном заказе. Сначала выведите сырое значение, затем добавляйте функции по одной.
Можно ли в PipeLang вызвать внешний сервис?
Сам язык вычисляет значения локально. Для обращения к внешнему сервису используйте HTTP-действие триггера или переносите логику в интеграционный модуль.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.