Автоматизация

Формулы и калькулятор в amoCRM

Виджет автоматизирует вычисления в amoCRM по заданным формулам

Возможности

Автоматизация расчётов
Простые и сложные формулы
Работа с датами и товарами
Логические условия
Расчёт маржинальности

Инструкция по установке и настройке

Подробное руководство по работе с виджетом "Формулы и калькулятор в amoCRM"

Настройка виджета

При переходе сделки на этап бота, бот автоматически заполнит поле по результатам расчёта.

Настройка бота в воронке:

  • Выберите этап, где будет работать бот, и нажмите + Добавить триггер.
  • В списке выберите Salesbot → настройте условия → нажмите + Добавить нового бота.
  • В настройках бота перейдите в раздел Виджеты → выберите Формулы.
  • Нажмите на иконку карандаша.
  • Выберите поле, в которое будет записываться результат.
  • Введите формулу. Пример: lead['Цена товара'] - lead['Себестоимость товара']
  • При необходимости добавьте несколько формул → повторите шаги.

При необходимости добавить следующие шаги и завершить работу бота. Далее сохранить бота и настройки воронки.

Математические операции

В формулах можно использовать любые математические операции:

  • сложение (+)
  • вычитание (-)
  • умножение (*)
  • деление (/)

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

Постоянные значения

Если в формулах необходимо использовать постоянное значение, его можно задать через триггер:

  1. Перейдите в бота с формулами.
  2. Нажмите Настройка переменных.

Важно при работе с переменными:

Если переменная не является числом, преобразуйте её в числовой тип:

chislo(lead['Название поля с типом текст'])

Если переменная не является текстом, преобразуйте её в текстовый тип:

text(lead['Название поля с типом число'])

Это необходимо для корректной работы формул и предотвращения ошибок при вычислениях.

После этого переменную можно использовать в формулах наравне с полями amoCRM.

Подсказки в формулах

В поле ввода формулы доступны подсказки с названиями полей, которые можно использовать в вычислениях.

Чтобы вызвать подсказку, введите символ "[". После этого появится выпадающий список доступных полей.

Корректная работа с числами

Иногда amoCRM воспринимает значения как текст, из-за чего вместо сложения получается «склейка» (например: 10+14+5 = 10145).

Чтобы этого избежать, каждое значение нужно оборачивать в parseInt().

Пример:

parseInt(lead['Сумма в договоре']) - parseInt(lead['Бюджет'])

Логические условия

Создание логических условий (if-else в одну строку)

Пример:

lead['поле1'] == 'успех' ? 'да' : 'нет'

Здесь:

  • если поле1 = «успех» → результат «да»
  • иначе → результат «нет»

Поддерживаются разные операторы сравнения:

  • >= — больше или равно
  • <= — меньше или равно
  • > — больше
  • < — меньше
  • !== — не равно

Пример с условиями:

lead['Расстояние до заказчика (в км)'] <= '50' ? '300р.' : '250р.'

Можно проверять значения полей и возвращать разные результаты.

Вложенные условия

Этот пример показывает вложенное условие (тернарный оператор) — когда внутри одного условия используется ещё одно.

🔹 Разбор формулы:

lead['Расстояние до заказчика (в км)'] <= '10' ? '300р.' : (lead['Расстояние до заказчика (в км)'] <= '30' ? '1000' : '2000')
  1. Проверяется условие: если расстояние ≤ 10 км → результат «300р.»
  2. Если первое условие не выполнено, проверяется второе: если расстояние ≤ 30 км → результат «1000».
  3. Если оба условия не выполнены: результат по умолчанию → «2000».

По сути, это аналог «если – иначе если – иначе»:

  • До 10 км → 300р.
  • От 11 до 30 км → 1000
  • Больше 30 км → 2000

Ограничение знаков после запятой

Иногда в результате вычислений может получиться число с большим количеством знаков после запятой. Чтобы ограничить их количество, используйте функцию .toFixed(x), где:

x — это число знаков после запятой, которое должно остаться.

Пример:

(lead['Сумма'] / lead['Количество']).toFixed(2)

Если сумма = 105, количество = 7, то результат будет 15.00 (2 знака после запятой).

Ключи полей

Сделки (lead):

  • lead['ID'] — ID сделки
  • lead['Название'] — Название сделки
  • lead['Бюджет'] — Бюджет
  • lead['status_id'] — ID статуса
  • lead['pipeline_id'] — ID воронки
  • lead['status_name'] — Название статуса
  • lead['pipeline_name'] — Название воронки
  • lead['Ответственный'] — ФИО ответственного
  • lead['Поле'] — Дополнительное поле сделки

Контакт (contact):

  • contact['ID'] — ID контакта
  • contact['ФИО'] — ФИО контакта
  • contact['Имя'] — Имя
  • contact['Фамилия'] — Фамилия
  • contact['Ответственный'] — ФИО ответственного
  • contact['Поле'] — Дополнительное поле контакта

Компания (company):

  • company['ID'] — ID компании
  • company['Название'] — Название компании
  • company['Ответственный'] — ФИО ответственного
  • company['Поле'] — Дополнительное поле компании

Формулы связанных сделок

Для работы со связанными сделками можно использовать массивы lead['contact_leads'] (сделки контакта) и lead['company_leads'] (сделки компании).

Примеры формул:

Число успешных сделок (статус 142):

lead['contact_leads'].filter(l => l['status_id'] == 142).length

Сумма успешных сделок (статус 142, сумма бюджетов):

lead['contact_leads'].filter(l => l['status_id'] == 142).reduce((sum, l) => sum + (parseInt(l['price']) || 0), 0)

Сумма сделок по числовому полю:

getLeadsFieldSum(lead['contact_leads'], 'Название_числового_поля')

Число закрытых сделок (статус 143):

lead['contact_leads'].filter(l => l['status_id'] == 143).length

Число сделок в определенном статусе (пример ID статуса: 123123):

lead['contact_leads'].filter(l => l['status_id'] == 123123).length

ℹ️Если нужно считать по компании, замените lead['contact_leads'] на lead['company_leads']. В примере со статусом 123123 укажите ID нужного статуса из вашей воронки.

Примечания

В формулах доступны переменные lead['notes'] (массив всех примечаний сделки) и lead['last_note_text'] (текст последнего примечания).

Примеры:

Текст последнего примечания:

lead['last_note_text']

Длина последнего входящего звонка (в секундах):

lead['notes'].filter(n => n['note_type'] == 'call_in').length ? parseInt(lead['notes'].filter(n => n['note_type'] == 'call_in').sort((a, b) => a['created_at'] - b['created_at']).pop()['params']['duration']) : 0

Длина последнего исходящего звонка (в секундах):

lead['notes'].filter(n => n['note_type'] == 'call_out').length ? parseInt(lead['notes'].filter(n => n['note_type'] == 'call_out').sort((a, b) => a['created_at'] - b['created_at']).pop()['params']['duration']) : 0

Дата последнего входящего звонка:

lead['notes'].filter(n => n['note_type'] == 'call_in').length ? new Date(lead['notes'].filter(n => n['note_type'] == 'call_in').sort((a, b) => a['created_at'] - b['created_at']).pop()['created_at'] * 1000).toISOString().replace('T', ' ').slice(0, 16) : ''

Дата последнего исходящего звонка:

lead['notes'].filter(n => n['note_type'] == 'call_out').length ? new Date(lead['notes'].filter(n => n['note_type'] == 'call_out').sort((a, b) => a['created_at'] - b['created_at']).pop()['created_at'] * 1000).toISOString().replace('T', ' ').slice(0, 16) : ''

Операции с полями

Числовые:

lead['Поле1'] + lead['Поле2']
lead['Поле1'] - lead['Поле2']
lead['Поле1'] * lead['Поле2']
lead['Поле1'] / lead['Поле2']
numToRuWords(lead['Поле'])

Текстовые:

lead['Поле1'] + lead['Поле2']
lead['Поле1'] + ' ' + lead['Поле2']
addDivider(lead['Поле'], '.', 3)

Флаги:

Значение: 'Да' (если отмечено) или пусто (если не отмечено).

Списки:

Чтение и запись как текст.

Мультисписки:

Значения считываются как текст, несколько значений разделяются ;

Работа с товарами

Сумма по всем спискам (тип Цена):

lead['list_sum']

Сумма по конкретному списку:

lead['list_sums'][ID]

Значение поля с ценой по ключу:

lead['list_sum_123']

Ключ по названию поля из списка:

lead['e_IDсписка_1_Название']

Работа с датами

Разница дат (в днях):

(dateToTime(lead['Поле1']) - dateToTime(lead['Поле2']))/3600/24

Разница текущей даты и даты из поля:

(Math.floor(Date.now()/1000) - dateToTime(lead['Поле']))/3600/24

Прибавить 7 дней:

datePlusSeconds(lead['Поле'], 3600*24*7)

Обновление даты +1 день:

updateDate(lead['Поле'], 1, 'd')

Текущая дата:

new Date(Date.now()).toISOString().split('T')[0]

Текущая дата + 7 дней:

new Date(Date.now() + 7 * 86400000)

Изменение типов

Текст → число:

chislo(lead['Поле'])

Число → текст:

text(lead['Поле'])

Падежи для ФИО

ФИО в нужном падеже:

namePad(contact['ФИО'], 'родительный')

Сложные формулы

Операции со скобками:

lead['Поле1'] * (lead['Поле2'] - lead['Поле3'])

Условия:

Если >10, то 1, иначе 0:

(lead['Поле'] > 10) ? 1 : 0

Проверка на равенство:

(lead['Поле'] == 'тип 1') ? 'Если условие выполнено' : 'Если условие не выполнено'

С текстом:

(lead['Поле'] === 'Текст') ? 'Если условие выполнено' : 'Если условие не выполнено'

С вариантами:

((lead['Поле']=='1') ? 'Вариант1' : '') + ((lead['Поле']=='2') ? 'Вариант2' : '') + ((lead['Поле']=='3') ? 'Вариант3' : '')

Функции

В виджете доступны функции для автоматической привязки контактов и компаний к сделкам:

Привязка контактов

  • Прикрепить контакт по Телефону — поиск контакта по номеру телефона
  • Прикрепить контакт по Email — поиск контакта по адресу электронной почты
  • Прикрепить контакт по кастомному полю — поиск контакта по любому кастомному полю (например, ИНН, внутренний ID и т.п.)

Привязка компаний

  • Прикрепить компанию по кастомному полю — поиск компании по любому кастомному полю (например, ИНН, внутренний ID и т.п.)

При помощи этих функций можно автоматически находить и прикреплять контакты/компании к сделкам, либо создавать новые, если они не найдены. Настроить это можно с помощью Salesbot.

Настройка привязки по телефону или email

В выборе поля найдите раздел Функции:

Раздел Функции в выборе поля

В формуле необходимо ввести поле, из которого нужно брать телефон или почту для создания контакта:

Ввод поля для создания контакта

Настройка привязки по кастомному полю

Для привязки контакта или компании по кастомному полю выберите нужное поле из списка доступных полей в интерфейсе виджета.

Пример 1: Привязать контакт по полю ИНН:

  1. Выберите "Функции" → "Прикрепить контакт по кастомному полю" → выберите поле "ИНН" из списка
  2. В формуле укажите поле сделки, откуда брать значение ИНН: return lead["ИНН"]

Пример 2: Привязать компанию по полю "Внутренний ID":

  1. Выберите "Функции" → "Прикрепить компанию по кастомному полю" → выберите поле "Внутренний ID" из списка
  2. В формуле укажите поле сделки, откуда брать ID: return lead["Внутренний ID"]

Если контакт или компания с указанным значением поля не найдены, система автоматически создаст новую сущность с этим значением и привяжет её к сделке.

Конвертация валют

В формулах доступна функция convertCurrency() для автоматической конвертации валют по официальным курсам ЦБ РФ.

Формат функции: await convertCurrency(сумма, "исходная_валюта", "целевая_валюта")

Поддерживаемые валюты (54 валюты)

Основные мировые валюты:

  • USD — Доллар США
  • EUR — Евро
  • GBP — Фунт стерлингов
  • CHF — Швейцарский франк
  • CNY — Китайский юань
  • JPY — Японская иена
  • RUB — Российский рубль

Популярные валюты: AUD (Австралийский доллар), CAD (Канадский доллар), NZD (Новозеландский доллар), HKD (Гонконгский доллар), SGD (Сингапурский доллар), TRY (Турецкая лира), INR (Индийская рупия), BRL (Бразильский реал), ZAR (Южноафриканский рэнд), KRW (Южнокорейская вона)

Валюты СНГ: KZT (Казахстанский тенге), BYN (Белорусский рубль), UAH (Украинская гривна), AZN (Азербайджанский манат), AMD (Армянский драм), GEL (Грузинский лари), KGS (Киргизский сом), MDL (Молдавский лей), TJS (Таджикский сомони), TMT (Туркменский манат), UZS (Узбекский сум)

Европейские валюты: PLN (Польский злотый), CZK (Чешская крона), HUF (Венгерский форинт), RON (Румынский лей), RSD (Сербский динар), DKK (Датская крона), NOK (Норвежская крона), SEK (Шведская крона)

Азиатские валюты: THB (Тайский бат), VND (Вьетнамский донг), IDR (Индонезийская рупия), MMK (Мьянманский кьят), BDT (Бангладешская така)

Ближний Восток: AED (Дирхам ОАЭ), SAR (Саудовский риял), QAR (Катарский риал), OMR (Оманский риал), BHD (Бахрейнский динар), EGP (Египетский фунт), IRR (Иранский риал)

И другие: DZD, MNT, BOB, CUP, NGN, ETB, XDR

Примеры использования

Пример 1: Конвертировать 100 долларов в рубли

await convertCurrency(100, "USD", "RUB")

Пример 2: Конвертировать бюджет сделки из долларов в евро

await convertCurrency(lead["Бюджет"], "USD", "EUR")

Пример 3: Посчитать 15% от бюджета и конвертировать в доллары

await convertCurrency(lead["price"] * 0.15, "RUB", "USD")

Пример 4: Конвертировать между валютами СНГ (тенге в рубли)

await convertCurrency(10000, "KZT", "RUB")

Особенности работы

  • Курсы валют обновляются автоматически раз в день из API ЦБ РФ
  • Результат округляется до 2 знаков после запятой
  • Курсы кешируются для быстрой работы (повторные запросы выполняются мгновенно)
  • Конвертация между любыми валютами (не обязательно через рубли)
  • При ошибке возвращает исходную сумму

Функция конвертации валют использует официальные курсы Центрального Банка РФ, которые обновляются ежедневно.