КОНСТРУКТОР
Модуль объекта
Модуль объекта — это место, где пишется код на 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, их значения в конце автоматически превращаются в движения по регистрам. Это самый простой способ построить нестандартное проведение без правил.
function ПередПроведением() {
const Номенклатура = formApi.getValue('Номенклатура');
const Количество = formApi.getValue('Количество');
const Сумма = formApi.getValue('Сумма');
}# Примеры
Автоматический пересчёт суммы при изменении количества:
function ПриИзменении_Количество(значение) {
const цена = formApi.getValue('Цена');
if (цена) {
formApi.setValue('Сумма', значение * цена);
}
}Проверка перед записью:
function ПередЗаписью() {
const сумма = formApi.getValue('Сумма');
if (!сумма || сумма <= 0) {
formApi.showAlert('Сумма должна быть больше нуля');
return false;
}
}Подстановка данных из связанного справочника:
function ПриИзменении_Контрагент(значение) {
if (значение && значение['Наименование']) {
formApi.setValue('Комментарий', значение['Наименование']);
}
}# Кнопки и модуль
У реквизита типа Кнопка есть настройка «Имя обработчика». Укажите там имя функции из модуля — она будет вызываться при нажатии кнопки. Так модуль «подключается» к интерфейсу.
# Правила и подводные камни
| Правило | Почему |
|---|---|
return false отменяет операцию | Так работают все обработчики «Перед…» |
Не объявляйте лишние let/const внутри ПередПроведением | Каждая переменная попадёт в движения |
Не пишите function ПередЗаписью(formApi) | formApi — глобальная, параметр сломает вызов |
| Проверяйте существование объекта/поля | Ошибка в модуле блокирует сохранение записи |
| Комментируйте сложную логику | Код модуля не документируется автоматически |
# Как редактировать модуль через ИИ-помощника
Если вы пользуетесь встроенным ассистентом, у него есть отдельный инструмент правки модуля. Мелкие правки он делает точечно, не перезаписывая весь код. Это безопаснее, чем полная замена модуля вручную.
# Смотрите также
- Компоненты — общий код для нескольких объектов
- Реквизиты — выражения вместо модуля
- Правила проведения — движения «без кода»
- Ввод на основании
- Карточка записи
