Elbuz сам рахує значення поля для кожного запису: замість постійного «VIP» правило записує «VIP, якщо сума більша за 10 000, інакше звичайний». Зламана формула не зіпсує поле — воно лишиться без змін.
Коли це знадобиться:
- Тег залежить від суми замовлення —
@ifвибирає значення за умовою. - Потрібна сума з націнкою чи знижкою —
@calcрахує з полів документа. - Назва завдання має містити клієнта й номер замовлення —
@concatсклеює текст із полів. - Телефон клієнта треба перенести в документ —
@fieldбере значення з картки контрагента.
З чого почати: картка правила → команда «Змінити дані документа» → у значенні поля формула, що починається з @.
Що вміють формули
- @if — вибирає одне з двох значень за умовою.
- @calc — рахує арифметику з полів запису.
- @concat і @field — склеюють текст і переносять значення з одного запису в інший.
- @json — дістає значення з додаткових полів документа чи контрагента.
- Вкладені формули — логіка, яку одна функція не виражає.
- Перевірка при збереженні — зламаний синтаксис не збережеться, помилка на даних не зіпсує поле.
Де це і хто має доступ
Окремого вікна й пункту меню у формул немає. Вони живуть усередині команди правила — у тому самому конструкторі, яким збирається умова, але прочитаному інакше: ліворуч поле, праворуч значення, яке треба записати. Оператор посередині в цьому режимі не використовується. Під конструктором є памʼятка з назвами джерел і чотирма прикладами.
- Інші входи
- «Автоматичні правила» → олівець на правилі → секція «Команда» → олівець на команді
- Право доступу
- те саме, що на вікно правил — окремого права у формул немає
- Підготувати
- правило з командою, яка змінює або створює запис
Шлях від нуля до працюючої формули
- Відкрити картку правила й перейти до командиАвтоматичні правила
- Вибрати ліворуч поле, яке треба заповнитиНалаштування команди
- Написати у значенні формулу, що починається з
@Налаштування команди - Натиснути «Зберегти умову» й перевірити на одному записіНалаштування команди
1
Поле документа, яке заповнюємо2
Значення — тут пишеться формула3
Памʼятка про синтаксис формул- Ліворуч обирається поле документа, значення якого буде змінено.
- Праворуч — значення поля; текст, що починається з @, Elbuz обчислює як формулу.
- Памʼятка нижче пояснює синтаксис формул на прикладах @calc, @if, @concat і @json.
Як влаштоване саме правило — подія, умова, порядок виконання команд і захист від повторного спрацювання — розібрано в посібнику з автоматичних правил. Ця стаття тільки про те, що написати у значенні поля.
Як це працює
Коли правило спрацювало, програма бере кожну пару «поле — значення» з команди й дивиться на перший символ значення. Якщо це @ — значення рахується як формула. Якщо ні — записується як є.
Розбір формули завжди однаковий: після @ має стояти назва функції, одразу за нею — дужка, а останній символ значення має бути закриваючою дужкою. Усередині дужок — параметри через кому. Далі програма підставляє дані замість посилань виду джерело.поле й повертає результат.
Помилки ловляться двічі. Перший раз — при збереженні команди: програма проганяє кожну формулу «вхолосту», підставляючи замість будь-якого поля одиницю. Так знаходяться зламаний синтаксис, невідома функція і сторонні символи в @calc — команда не зберігається, а на 6 секунд спливає червоне повідомлення «Умову не збережено — помилка у формулі» з переліком того, що не прийнялося.
Другий раз — коли правило спрацювало на реальному записі. Те, що при збереженні перевірити не можна (поле виявилося порожнім, текстовим замість числа, нульовим дільником), вилазить тільки тут.
У цьому випадку поле не змінюється зовсім — старе значення лишається на місці, а в загальному «Журналі операцій» (Кабінет → Журнал операцій) зʼявляється рядок «Формулу не розібрано, поле не змінено» з назвою правила, команди й самою формулою; номер запису — у колонці «ID обʼєкта».
Плитка «Журнал операцій» у картці документа його не показує: вона відкриває історію змін полів. Решта полів команди записуються як звичайно.
- Дія або результат
- Розвилка: далі шлях залежить від відповіді
Значення, яке починається з @, але не є формулою, програма теж спробує обчислити — і не дасть зберегти команду. Якщо вам треба записати в поле текст на кшталт @shop, поставте перед ним пробіл або будь-який інший символ.
Сім команд, у яких формули працюють
Формула обчислюється не в будь-якому полі правила, а тільки там, де команда записує значення в поле запису:
- «Змінити дані документа» і «Створити документ»;
- «Змінити дані контрагента» і «Створити контрагента»;
- «Створити організацію» і «Змінити дані організації»;
- «Додати завдання».
У решті команд формул немає зовсім. У «Надіслати листа», «Надіслати SMS» і «Виконати HTTP-запит» дані запису підставляються макросами у фігурних дужках — {Документ: № документа} або коротко {{d.document_number}}, {{pc.name}}, {{cn.name}}. Символ @ там залишиться звичайним текстом. Команда «Запустити процес (Flow)» значень полів не задає взагалі — вона тільки вибирає процес.
Два поля в цих командах поводяться не як усі, і формула на них теж поширюється:
- поле проводки в командах з документами не записує текст, а проводить документ (як правило проводить документ). Формулу туди не ввести: у конструкторі це список «Так / Ні», а не рядок вводу;
- поле типу документа в команді «Створити документ» задає, у який тип копіювати. Ввести формулу можна, але не варто: формула, що дала порожньо, мовчки зупинить команду — нічого не створиться.
Так само мовчки зупиняються «Створити контрагента» без імені й «Додати завдання» без назви — це захист від порожніх карток, але виглядає він як «правило не спрацювало».
Звідки формула бере дані
Дані беруться з трьох джерел, і звертаються до них через крапку:
document.поле— документ, через який спрацювала подія;contractor.поле— його контрагент (а якщо подія була на контрагенті — сам контрагент);company.поле— ваша організація з документа.
Усі три джерела доступні в усіх семи командах.
Джерела field. у тригерах не існує, хоча воно згадується в старих прикладах. Будь-яке field.щось завжди дасть порожній рядок, а всередині @calc порахується нулем. Джерела user. немає теж.
Порожнім джерело буває й законно: якщо подія піднялася на контрагенті, документа в ній немає, і всі document. дадуть порожньо. Те саме з company., якщо в документі не вказана ваша організація.
Звідки брати імена полів
У лівому списку конструктора поля названі по-людськи, а у формулі потрібне службове імʼя — те саме, що використовується в коротких макросах HTTP-запиту ({{d.document_number}}). Найчастіше потрібні:
- документ:
document_number— номер,document_sum— сума,description— примітка,tag— мітка,delivery_price— вартість доставки,email,phone,custom_field_ext— додаткові поля,document_status_name— статус,contractor_name— назва контрагента; - контрагент і організація:
name— назва,phonesіemail— контакти,description— опис,discount_percent— знижка,customer_type— тип клієнта,contractor_group_name— група,code_iin— податковий код.
Імені, якого немає, програма не помітить: document.neisnuiuche тихо дасть порожній рядок. Перевірка при збереженні цього теж не ловить: неіснуюче поле для неї виглядає як звичайне. Перевіряють одним прогоном на тестовому записі — якщо поле заповнилося порожнім, справа майже завжди в імені.
Окремо працює поле терміну в команді «Додати завдання»: крім формул, воно розуміє підстановки дат — {current_date}, {current_date+3day}, {current_date+1week}. Одиниці ті самі, що й в умовах правила: minute, hour, day, week, month, year.
Пʼять функцій і готові формули
@if — умова
Синтаксис: @if(умова, значення_якщо_так, значення_якщо_ні). Умова пишеться строго як джерело.поле оператор значення, і пробіли навколо оператора обовʼязкові. Оператори: equals, contains, >, <, >=, <=, !=.
Будь-яка умова, яку не вдалося розібрати, вважається невиконаною — програма мовчки бере третій параметр. Саме тому @if(document.document_sum>5000, 'VIP', 'Звичайний') без пробілів завжди повертає «Звичайний», хоча виглядає правильно.
contains шукає підрядок з урахуванням регістру: contains 'терміново' не знайде слово «ТЕРМІНОВО». equals порівнює нестрого, тому '5' і 5 для нього однакові.
Окремої перевірки «поле порожнє» немає: пишеться як equals ''. Для тексту це працює, а от нуль у числовому полі порожнім не вважається.
@calc — арифметика
Синтаксис: @calc(вираз). Дозволені цифри, десятковий дріб через крапку, дужки й знаки + - * /. Посилання на поля підставляються значеннями до обчислення, тому @calc(document.document_sum * 1.2) на сумі 1000 дасть 1200.
Три випадки, у яких @calc відмовиться рахувати — команда при цьому не обривається, просто це поле лишиться без змін:
- у полі текст, а не число:
@calc(document.description * 2)дасть помилку «Поле document.description не число»; - ділення на нуль:
@calc(100 / document.delivery_price), якщо вартість доставки нульова; - функції й інші символи: ніяких відсотків та імен функцій — тільки чотири дії.
Кома замість крапки помилки не дасть, але все після коми буде відкинуто: @calc(document.document_sum * 1,2) порахує суму, помножену на 1. Дріб пишіть тільки через крапку.
Незаповнене поле помилкою не вважається: воно рахується нулем. @calc(document.document_sum + contractor.discount_percent) на контрагенті без знижки поверне просто суму документа.
@concat — склеїти текст
Синтаксис: @concat(частина, частина, …), скільки завгодно частин. Текст береться в одинарні лапки, посилання на поля — без лапок. Пробіли всередині лапок зберігаються, між параметрами — ні.
@concat('Замовлення від ', contractor.name, ' на суму ', document.document_sum) дасть «Замовлення від ТОВ Ромашка на суму 1000».
@json — дістати значення з JSON
Синтаксис: @json(джерело.поле, 'ключ'). Так читаються поля, у яких лежить JSON — насамперед додаткові поля документа й контрагента. Якщо в полі {"16":"test1","17":"443355"}, то @json(document.custom_field_ext, '17') поверне 443355.
Читається тільки верхній рівень: вкладеність через крапку не підтримується. Якщо ключа немає або в полі не JSON, результат — порожній рядок, і ніякої помилки при цьому не буде.
@field — просто значення поля
Синтаксис: @field('джерело.поле'), шлях обовʼязково в лапках. Це найкоротший спосіб перенести значення з одного запису в інший: @field('contractor.phones') покладе в поле телефон контрагента.
Без крапки у шляху (@field('name')) функція поверне порожньо — джерело вказувати обовʼязково.
Формула всередині формули
Гілки @if і аргументи @concat, @json, @field самі можуть бути формулами. Так збирається логіка, яка однією функцією не виражається:
@if(contractor.customer_type equals 'VIP', @calc(document.document_sum * 9 / 10), document.document_sum)— знижка десять відсотків тільки VIP-клієнтам;@concat('Клієнт: ', contractor.name, @if(document.document_sum > 5000, ' (великий)', ''))— приписка тільки до великих замовлень.
Рахується лише та гілка, яку вибрала умова. Тому у другій гілці можна залишити дію, яка на цьому записі заздалегідь неможлива — наприклад ділення на поле, яке в частини записів нульове: поки умова туди не заводить, помилки не буде.
Готові формули
Усе нижче перевірене й працює як написане.
- Позначити великі замовлення: поле «Теги» →
@if(document.document_sum >= 10000, 'VIP', 'Звичайний'). - Термінові за приміткою: поле «Теги» →
@if(document.description contains 'терміново', 'Терміново', 'Звичайно'). - Перенести телефон клієнта в документ: поле «Телефон» →
@field('contractor.phones'). - Зібрати назву завдання: поле «Назва задачі» →
@concat('Передзвонити: ', contractor.name, ' · ', document.document_number). - Дістати код із додаткових полів:
@json(document.custom_field_ext, '17'). - Порахувати суму з націнкою двадцять відсотків:
@calc(document.document_sum * 1.2). - Скопіювати статус оплати в примітку доставки:
@concat('Оплата: ', document.payment_status_name). - Знижка тільки постійним клієнтам:
@if(contractor.customer_type equals 'Постійний', @calc(document.document_sum * 0.95), document.document_sum). - Очистити поле: значення
nullбез жодного@— програма запише порожньо навмисно.
Кілька команд пишуть в одне поле
Перезапису програма не забороняє і не попереджає про нього: в полі лишається те, що записали останнім. Хто саме останній, залежить від того, де стоять конкурентні значення.
- Два рядки з тим самим полем в одній команді. Рядки розбираються згори вниз, і записується значення нижнього. Якщо формула нижнього рядка зламалася, запишеться значення верхнього.
- Кілька команд одного правила. Команди виконуються по черзі за полем «Порядок виконання», і кожна записує свої поля окремо — в полі лишиться значення команди, що виконалася останньою. Важливо інше: усі формули правила рахуються з даних запису, прочитаних на початку спрацювання правила. Якщо перша команда записала в примітку «VIP», то
document.descriptionу формулі другої команди того самого правила поверне стару примітку, а не «VIP». - Два різні правила на одну подію. Правила виконуються по черзі за полем «Порядок виконання», а при однаковому порядку — за назвою. Кожне наступне правило перечитує запис заново, тож його умова й формули вже бачать те, що записали попередні. В полі лишається значення правила, що виконалося останнім.
Звідси робочий прийом: якщо формула має спиратися на значення, яке записує інша команда, винесіть її в окреме правило на ту саму подію з більшим «Порядком виконання».
Небезпечні місця
Пробіл у кінці значення. Формула має закінчуватися дужкою: якщо після неї залишився пробіл, розбору не буде. Такий пробіл легко з'являється при копіюванні, а на вигляд його не видно — зате команда не збережеться, і в повідомленні ви побачите свою формулу цілком.
Умова без пробілів навколо оператора. Це єдина помилка, яку перевірка при збереженні пропускає: @if(document.document_sum>5000, …) — синтаксично правильна формула, вона просто завжди йде в гілку «інакше». Помітити можна лише за результатом.
Формула в полі, яке заповнюється зі списку. Статус документа, тип оплати, валюта, проводка — у конструкторі це випадні списки, а не рядок вводу: формулу туди не набрати. Формули пишуться тільки в текстових і числових полях.
І найтихіше з усього: команда, у якій формула зламалася на реальному записі, все одно вважається виконаною. Правило запамʼятає, що вже відпрацювало на цьому документі, і вдруге його не чіпатиме — навіть після того, як формулу виправлять. Тому перевіряти виправлення треба на новому записі, а не на тому самому.
Якщо формула вже записала не те
Попереднього значення поля програма не зберігає: у журналі видно, що команда спрацювала, але не видно, що було в полі до неї. Кнопки «повернути як було» немає, і виправлення — це запис правильного значення поверх неправильного.
- Вимкніть правило тумблером «Активність», щоб воно не зачепило нові записи, поки ви виправляєте.
- Знайдіть зачеплені записи. Відкрийте «Кабінет» → «Журнал операцій» і в колонці «Інформація» відфільтруйте рядки за текстом
Трігер #номер назва правила— саме так починається рядок про кожне виконання команди. Назву додавайте обовʼязково: фільтр шукає входження, іТрігер #7без назви знайде також правила #70, #71 і далі. Номери документів чи контрагентів — у колонці «ID обʼєкта». - Розберіть знайдене. Рядки, що починаються з «Не виконано!», — команда не відпрацювала. Рядки з «Формулу не розібрано, поле не змінено» — поле лишилося старим. Решта — записи, у які формула записала значення. У команд «Створити документ» і «Додати завдання» рядок стоїть на вихідному записі й закінчується номером створеного:
document_created #…абоtask_created #…. Чи проведено створений документ, з цього рядка не видно — це перевіряють у самому документі. - Виправте формулу. Просто зберегти виправлену команду замало: правило памʼятає, на яких записах кожна команда вже відпрацювала, і на них вона більше не запуститься.
Щоб правило саме переписало поле на вже зачеплених записах, видаліть команду й додайте її заново з правильною формулою. Разом із командою стираються її позначки «вже виконано», тож нова команда відпрацює на кожному записі при наступній його події — якщо запис підходить під умову правила. Видалення всього правила так само стирає позначки всіх його команд.
Сценарії
Позначити великі замовлення, не стерши теги менеджера
Команда «Змінити дані документа», поле «Теги» → @if(document.document_sum >= 10000, '+VIP', '+'). Значення, що починається з плюса, дописує тег до тих, що вже стоять у документі, а самотній + лишає теги як є. Без плюса ('VIP') формула замінить усі теги документа одним «VIP», а порожній результат зітре їх зовсім.
Чого не станеться: якщо суму документа згодом змінять, тег на цьому документі не перерахується — команда вже відпрацювала на ньому й вдруге не запуститься.
Перенести телефон клієнта в документ
Команда «Змінити дані документа», поле «Телефон» → @field('contractor.phones'). У документ запишеться телефон з картки контрагента. Чого не станеться: перевірки «а чи є там телефон» немає. Якщо в картці контрагента телефон не заповнений, формула дасть порожньо, і телефон, що вже був у документі, буде стертий. Коли таке можливо, додайте в умову правила перевірку, що телефон у контрагента є.
Поставити менеджеру завдання передзвонити
Команда «Додати завдання»: «Назва задачі» → @concat('Передзвонити: ', contractor.name, ' · ', document.document_number), «Термін виконання» → {current_date+1day}. Завдання зʼявиться картою на першій активній дошці органайзера в її першій колонці (якщо поля «Дошка (ID, порожньо — перша активна)» і «Колонка (ID, порожньо — перша)» не заповнені) і буде привʼязане до документа.
У Кабінет → Журнал операцій рядок про виконання закінчиться на task_created # і номер картки. Термін записується датою без часу, навіть якщо в підстановці стоїть hour чи minute.
Чого не станеться: якщо назва вийшла порожньою або в органайзері немає жодної активної дошки, завдання не створиться, а в журналі буде рядок «Не виконано!». Позначки «виконано» тоді немає, тож команда спробує ще раз при наступній події на цьому документі.
Що робити, коли формула не спрацювала
- «Умову не збережено — помилка у формулі»
- формула не розібралася. Перевірте: перший символ
@, останній —), назва функції з пʼяти дозволених, немає пробілу в кінці. У самому повідомленні перелічені формули, які не прийнялися. - Поле лишилося з колишнім значенням
- формула зламалася вже на записі. Причина — рядком «Формулу не розібрано, поле не змінено» в Кабінет → Журнал операцій (не в плитці «Журнал операцій» картки документа). Найчастіше це
@calcнад текстовим полем або ділення на нуль. - Завжди підставляється друге значення з @if
- умова не розібралася й вважається невиконаною. Найчастіше через відсутні пробіли навколо оператора або через невірне імʼя поля.
- @json повертає порожньо
- або ключа немає на верхньому рівні, або в полі не JSON. Вкладені ключі функція не читає.
- Документ не створився
- формула в полі типу документа дала порожньо. Тип має бути заданий обовʼязково, і краще — постійним значенням.
Часті запитання
У яких полях правила можна писати формули?
Тільки у значеннях полів семи команд: «Змінити дані документа», «Створити документ», «Змінити дані контрагента», «Створити контрагента», «Створити організацію», «Змінити дані організації» та «Додати завдання». В умові правила, у листі, SMS і HTTP-запиті формули не працюють.
Як дізнатися, що у формулі помилка?
Зламаний синтаксис видно одразу: команда не збережеться, а на 6 секунд спливе червоне повідомлення з переліком формул, які не прийнялися. Помилки на даних — ділення на нуль, текст замість числа — потрапляють у Кабінет → Журнал операцій рядком «Формулу не розібрано, поле не змінено».
Чи рахує @calc дробові числа?
Так: @calc(document.document_sum * 1.2) на сумі 1000 дасть 1200. Дріб пишеться через крапку. Незаповнене поле у виразі рахується нулем, а текст у полі і ділення на нуль дають помилку — поле тоді лишається без змін.
Чому не працює user.поле з прикладів?
Такого джерела в тригерах немає — як і field.. Доступні лише document., contractor. і company..
Чи є функції дати, округлення чи заміни тексту?
Ні. Є лише пʼять функцій: @if, @calc, @concat, @json, @field. Позицій документа (document. бачить тільки шапку), залишків на складі й інших записів формула теж не читає.
Чи працюють тут формули з цін і полів каталогу — CASE, IF, функції MySQL?
Ні, це інший механізм з іншим синтаксисом. Він описаний у статтях формули ціни і формули полів каталогу; у тригерах працюють тільки пʼять функцій з @.
Суміжні теми
- Якщо потрібна загальна картина правила, — як працюють автоматичні правила.
- Якщо треба вибрати, яка команда запише значення, — команди правила.
- Якщо формула заповнює завдання, — органайзер: дошки й картки, які створює «Додати завдання».
- Якщо формула посилається на поля замовлення, — замовлення покупця.

