Копируем значение из поля 'Поле-источник' в поле 'Текстовое поле'.
form.onChange(['Поле-источник'], true) .setValue('Текстовое поле', state => { const [value] = state.changes; return value.text; });
В этом примере скрипт прибавляет премию сотрудника к его окладу и рассчитывает НДФЛ от полученной суммы. Затем вычитает НДФЛ из этой суммы и выводит итоговую выплату за месяц.
form.onChange(['Оклад', 'Премия']) .setValues(['НДФЛ (13%)', 'Итого к выплате за месяц'], state => { const [salary, bonus] = state.changes; const ndflTax = (salary.value + bonus.value) * 0.13; const result = (salary.value + bonus.value) - ndflTax; return [ndflTax, result]; });
В этом примере поле 'Оптовая скидка' скрыто, если значение в поле 'Количество' не превышает 99.
form.onChange(['Количество'], true) .setVisibility(['Оптовая скидка'], state => { const num = state.changes[0].value; return num > 99; });
Здесь 'Справочник' — название поля с вашим справочником, 'Колонка' — название колонки справочника, а 'Текст' - поле типа Текст, в котором будет сохранено значение.
form.onChange(['Справочник']) .setValue('Текст', state => { const [item] = state.changes; return item.columns['Колонка']; });
form.onChange(['Дата начала', 'Дата окончания']) .validate('Дата окончания', state => { const [start, end] = state.changes; if (start.date && end.date && start.date >= end.date) return { errorMessage: 'Не может быть раньше даты начала' }; return null; });
form.onChange(['Эл. почта', 'Телефон'], true) .validate('Эл. почта', state => { const [email, phone] = state.changes; if (!email.text && !phone.text) return { errorMessage: 'Заполните электронную почту или телефон' }; return null; });
C возможностью установки произвольного срока.
form.onChange(['Высокий приоритет', 'Перенос даты']) .setValue('Срок', state => { const [checkmark, customDue] = state.changes; if (customDue.date) return {date: customDue.date}; if (checkmark.checked) return {days_from_create: 1}; return {days_from_create: 3}; });
Скрипт подойдёт тем, кто в рамках задачи работает с партнёрами. В нашем примере статус задачи будет меняться на «В работе», если партнёр назначил ответственного в поле «Ответственный за решение».
const orgId =111111Индивидуальный номер организации, которая редактирует форму. Чтобы узнать ID, напишите на support@pyrus.com.; form.onChange([], true) .setVisibility(['Открыта / Завершена'], state => false ); form.onChange([], true) .setStatus(state => { if (state.commenter.organization_id !== orgId) return {choice_name: 'В работе'}; }); form.onChange(['Ответственный за решение']) .setStatus(state => { const [currVal] = state.changes; const [prevVal] = state.prev; if (!prevVal && currVal) return {choice_name: 'В работе'}; });
Укажите в скрипте своё время решения и названия полей. Вместо числовых констант вы можете использовать переменные или формулы для расчёта времени решения. При изменении в заявке полей «Приоритет» и «Клиент» скрипт будет выполняться и устанавливать один из указанных в нём сроков.
form.onChange(['ПриоритетНазвание поля типа «Справочник» в форме обращения', 'КлиентНазвание поля типа «Справочник» в форме обращения']) .setValue('СрокНазвание поля типа «Срок» в форме обращения', state => { const [priority, client] = state.changes; if (!priority || !client) return undefined; const tariff = client.columns['ТарифКолонка справочника «Клиенты» с тарифами обслуживания']; const priorityValue = priority.columns['ПриоритетКолонка справочника «Приоритет»']; const hours = getSlaHoursByTariffAndPriority(tariff, priorityValue); if (hours === undefined) return undefined; return {hours_from_create: hours}; }); function getSlaHoursByTariffAndPriority(tariff, priority) { switch (tariff) { case 'БазовыйНазвание тарифа (значение колонки справочника «Клиенты»)': switch (priority) { case 'НизкийПриоритет (значение колонки справочника «Приоритет»)' : return64Срок в часах; case 'СреднийПриоритет (значение колонки справочника «Приоритет»)': return32Срок в часах; case 'ВысокийПриоритет (значение колонки справочника «Приоритет»)': return16Срок в часах; } case 'СтандартНазвание тарифа (значение колонки справочника «Клиенты»)': switch (priority) { case 'НизкийПриоритет (значение колонки справочника «Приоритет»)' : return32Срок в часах; case 'СреднийПриоритет (значение колонки справочника «Приоритет»)': return16Срок в часах; case 'ВысокийПриоритет (значение колонки справочника «Приоритет»)': return8Срок в часах; } case 'ПремиумНазвание тарифа (значение колонки справочника «Клиенты»)': switch (priority) { case 'НизкийПриоритет (значение колонки справочника «Приоритет»)' : return16Срок в часах; case 'СреднийПриоритет (значение колонки справочника «Приоритет»)': return8Срок в часах; case 'ВысокийПриоритет (значение колонки справочника «Приоритет»)': return4Срок в часах; } default: return undefined; } }
Распознаём емейл из темы письма. Если письмо пришло не от mail@example.com — скрываем поле «Тип заявки».
const emailPattern = /([a-zа-яё0-9-._]+)\@([a-zа-яё0-9-._]+)\.([a-zа-яё]{2,3})/ig; form.onChange(['Тема письма'], true) .setValue('Тип заявки', state => { const [currVal] = state.changes; const emails = (currVal.text || '').match(emailPattern); const first = emails ? emails[0] : ''; return first; }); form.onChange(['Email'], true) .setVisibility(['Тип заявки'], state => { const [choice] = state.changes; return choice && choice.text === "mail@example.com"; });
Этот скрипт позволяет фильтровать список городов по выбранному региону. Другой пример — при выборе отдела показывать только статьи расходов, относящиеся к этому отделу.
let catalogItems = null; form.getCatalog("Города по регионамНазвание справочника, который связывает значения двух других справочников").then(items => { catalogItems = items; }); form.onChange(["РегионПоле, при изменении которого меняется список выбираемых значений в другом поле"]).setFilter("ГородПоле, значения в котором фильтруются в зависимости от выбора в первом поле", state => { const [region] = state.changes; if (!catalogItems || !region || !region.columns) return null; const regionCol = region.columns["РегионНазвание колонки, по значениям которой осуществляется фильтрация"]; const filtered = catalogItems .filter(item => item.columns["РегионНазвание колонки, по значениям которой осуществляется фильтрация"] === regionCol) .map(item => item.columns["ГородНазвание колонки, из которой берутся отфильтрованные значения"]); return filtered.length > 0 ? { values: filtered } : null });