Документация Формулы
Разделы документации

Руководство

Обзор руководства

Бизнес-процессы и задачи

Бизнес-процессы и задачи

КОНСТРУКТОР

Модуль объекта

Модуль объекта — это место, где пишется код на JavaScript. Он нужен, когда возможностей конструктора не хватает: сложные вычисления, проверки перед записью, своя логика проведения, реакция на изменение поля.

Модуль доступен для справочников и документов. Для регистров отдельного редактора модуля нет — вкладка скрыта, хотя внутренняя поддержка сохранена.

Если задачу можно решить выражением реквизита ([Количество] * [Цена]) или правилом проведения, лучше так и сделать: модуль сложнее отлаживать и сопровождать.

# Экран редактора модуля

┌──────────────────────────────────────────────────────────────────┐
│ ⧉  Редактор модуля: Приходная накладная               [🧩 2]     │
│    Редактирование кода объекта "Приходная накладная" · 12 полей   │
│    · 1 таб.частей                                                 │
├──────────────────────────────────────────────────────────────────┤
│  1  function ПередЗаписью() {                                     │
│  2    const Сумма = formApi.getValue('Сумма');                    │
│  3    if (!Сумма) {                                               │
│  4      formApi.showAlert('Заполните сумму');                     │
│  5      return false;                                             │
│  6    }                                                           │
│  7  }                                                             │
└──────────────────────────────────────────────────────────────────┘
ЭлементЧто делает
Заголовок «Редактор модуля: <имя>»Имя объекта; ниже — сколько у объекта полей и табличных частей
Кнопка 🧩 (Компоненты)Открывает левую панель со списком компонентов. Цифра — сколько подключено
Область кодаРедактор Monaco: подсветка, автодополнение, поиск (Ctrl+F). Язык — JavaScript
ЗаписатьОбычная зелёная кнопка Записать в шапке объекта. Отдельной кнопки сохранения у модуля нет

В панели «Компоненты»: список с флажками, у каждого — имя и «N файлов». Если компонентов нет, выводится «Нет доступных компонентов». Когда выбраны компоненты, внизу появляется подсказка: «Код компонентов выполняется перед модулем. Функции доступны в вашем коде.»

# Объект formApi

Внутри модуля доступна глобальная переменная formApi. Не передавайте её параметром функции и не используйте this.formApi.

МетодЧто делает
formApi.getValue(имя)Прочитать значение реквизита (в том числе табличной части)
formApi.setValue(имя, значение)Установить значение реквизита
formApi.getData()Получить все данные формы
formApi.setData(данные)Заменить все данные формы
formApi.showAlert(сообщение)Показать уведомление пользователю
formApi.addFieldValidator(имя, функция)Добавить проверку для поля

Строки табличных частей доступны как массив, например formApi.getData().Товары.

# Обработчики (хуки)

Модуль состоит из функций с фиксированными именами. Платформа сама вызывает их в нужный момент.

ОбработчикКогда вызывается
ПриОткрытии()Форма открывается
ПослеОткрытия()Форма уже открыта
ПриСоздании()Создаётся новая запись
ПриИзменении_<Поле>(значение)Изменилось значение реквизита
ПриИзменении_<Таблица>_<Поле>(значение, строка)Изменилось значение в строке табличной части
ПередЗаписью()До записи. return false отменяет запись
ПослеЗаписи()После записи
ПередЗакрытием()До закрытия. return false отменяет закрытие
ПередПроведением()До проведения документа. return false отменяет проведение
ПослеПроведения()После проведения
ПриОтменеПроведения()Отмена проведения запрошена
ПослеОтменыПроведения()Проведение отменено

Имена обработчиков для изменения полей собираются из имён: для поля Цена — ПриИзменении_Цена, для колонки Цена табличной части Товары — ПриИзменении_Товары_Цена.

# Переменные становятся движениями

Если внутри ПередПроведением объявить переменные через let, const или var, их значения в конце автоматически превращаются в движения по регистрам. Это самый простой способ построить нестандартное проведение без правил.

javascript
function ПередПроведением() {
  const Номенклатура = formApi.getValue('Номенклатура');
  const Количество = formApi.getValue('Количество');
  const Сумма = formApi.getValue('Сумма');
}

# Примеры

Автоматический пересчёт суммы при изменении количества:

javascript
function ПриИзменении_Количество(значение) {
  const цена = formApi.getValue('Цена');
  if (цена) {
    formApi.setValue('Сумма', значение * цена);
  }
}

Проверка перед записью:

javascript
function ПередЗаписью() {
  const сумма = formApi.getValue('Сумма');
  if (!сумма || сумма <= 0) {
    formApi.showAlert('Сумма должна быть больше нуля');
    return false;
  }
}

Подстановка данных из связанного справочника:

javascript
function ПриИзменении_Контрагент(значение) {
  if (значение && значение['Наименование']) {
    formApi.setValue('Комментарий', значение['Наименование']);
  }
}

# Кнопки и модуль

У реквизита типа Кнопка есть настройка «Имя обработчика». Укажите там имя функции из модуля — она будет вызываться при нажатии кнопки. Так модуль «подключается» к интерфейсу.

# Правила и подводные камни

ПравилоПочему
return false отменяет операциюТак работают все обработчики «Перед…»
Не объявляйте лишние let/const внутри ПередПроведениемКаждая переменная попадёт в движения
Не пишите function ПередЗаписью(formApi)formApi — глобальная, параметр сломает вызов
Проверяйте существование объекта/поляОшибка в модуле блокирует сохранение записи
Комментируйте сложную логикуКод модуля не документируется автоматически

# Как редактировать модуль через ИИ-помощника

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

# Смотрите также