Например, у нас есть внутренний документ "Приказ о направлении в командировку". Параметры командировки определяются дополнительными реквизитами: дата начала, дата окончания, длительность и прочее. Требуется эти реквизиты разместить на отдельной вкладке "Данные командировки", а также настроить автоматический расчет длительности в зависимости от периода командировки.

Эту логику можно заложить в действиях дополнительных реквизитов, и не писать код в конфигураторе под каждый дополнительный реквизит.
Действия описываются в справочнике "Действия дополнительных реквизитов".
Предусмотрены следующие действия:
1. При создании чтении на сервере - выполняется один раз при открытии формы. Также выполняется при нажатии команды "Перечитать" в форме.
2. При изменении - выполняется при изменении дополнительного реквизита. Может быть выполнено в контексте клиента или сервера.

3. После заполнения реквизитов в форме - выполняется при каждом типовом заполнении реквизитов в форме, например после изменения вида документа.

4. Перед записью - выполняется перед записью на сервере. В обработчике этого вида можно разместить дополнительные проверки заполненности или логики заполнения дополнительных реквизитов.
5. Обработка проверки заполнения - выполняется на сервере. В обработчике этого вида можно разместить дополнительные проверки заполненности.
Ниже небольшое видео для наглядности:

Листинг обработчиков из примера:
Дата начала при изменении
// Получаем список дополнительных реквизитов формы
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
// Получаем значение ДатаНачала
ДатаНачала = Неопределено;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ДатаНачала");
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
ДатаНачала = Форма[ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение];
КонецЕсли;
КонецЕсли;
// Получаем значение ДатаОкончания
ДатаОкончания = Неопределено;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ДатаОкончания");
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
ДатаОкончания = Форма[ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение];
КонецЕсли;
КонецЕсли;
// Проверяем, что обе даты заполнены
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
// Вычисляем количество дней между датами
РазницаВСекундах = ДатаОкончания - ДатаНачала;
КоличествоДней = Окр(РазницаВСекундах / 86400, 0, РежимОкругления.Окр15как20);
// Устанавливаем значение в реквизит Длительность
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Длительность");
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
Форма[ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение] = КоличествоДней;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Дата окончания при изменении
// Получаем список дополнительных реквизитов формы
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
// Получаем значение ДатаНачала
ДатаНачала = Неопределено;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ДатаНачала");
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
ДатаНачала = Форма[ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение];
КонецЕсли;
КонецЕсли;
// Получаем значение ДатаОкончания
ДатаОкончания = Неопределено;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ДатаОкончания");
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
ДатаОкончания = Форма[ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение];
КонецЕсли;
КонецЕсли;
// Проверяем, что обе даты заполнены
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
// Вычисляем количество дней между датами
РазницаВСекундах = ДатаОкончания - ДатаНачала;
КоличествоДней = Окр(РазницаВСекундах / 86400, 0, РежимОкругления.Окр15как20);
// Устанавливаем значение в реквизит Длительность
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Длительность");
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
Форма[ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение] = КоличествоДней;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Перенос реквизитов в отдельную группу (при создании на сервере):
// Получаем ссылки на необходимые элементы формы
ГруппаСтраницы = Форма.Элементы.Найти("ГруппаСтраницы");
ГруппаКонтрагенты = Форма.Элементы.Найти("ГруппаКонтрагенты");
// Проверяем существование родительской группы
Если ГруппаСтраницы = Неопределено Тогда
ВызватьИсключение "Не найдена группа ""ГруппаСтраницы"" на форме";
КонецЕсли;
// Проверяем, не существует ли уже такой элемент
СуществующаяСтраница = Форма.Элементы.Найти("ДанныеКомандировки");
Если СуществующаяСтраница = Неопределено Тогда
// Добавляем новую страницу
НоваяСтраница = Форма.Элементы.Вставить("ДанныеКомандировки", Тип("ГруппаФормы"), ГруппаСтраницы);
// Устанавливаем вид группы как Страница
НоваяСтраница.Вид = ВидГруппыФормы.Страница;
// Устанавливаем заголовок страницы
НоваяСтраница.Заголовок = "Данные командировки";
// Если найден элемент ГруппаКонтрагенты, перемещаем новую страницу перед ним
Если ГруппаКонтрагенты <> Неопределено Тогда
Форма.Элементы.Переместить(НоваяСтраница, ГруппаСтраницы, ГруппаКонтрагенты);
КонецЕсли;
Иначе
// Если страница уже существует, просто перемещаем ее
Если ГруппаКонтрагенты <> Неопределено Тогда
Форма.Элементы.Переместить(СуществующаяСтраница, ГруппаСтраницы, ГруппаКонтрагенты);
КонецЕсли;
КонецЕсли;
// Массив имен дополнительных реквизитов для перемещения
ИменаРеквизитов = Новый Массив;
ИменаРеквизитов.Добавить("ДатаНачала");
ИменаРеквизитов.Добавить("ДатаОкончания");
ИменаРеквизитов.Добавить("Длительность");
ИменаРеквизитов.Добавить("ЗаСчетСредств");
ИменаРеквизитов.Добавить("МестоНазначения");
ИменаРеквизитов.Добавить("Сотрудник");
ИменаРеквизитов.Добавить("ЦельКомандировки");
// Находим страницу ДанныеКомандировки
СтраницаКомандировки = Форма.Элементы.Найти("ДанныеКомандировки");
Если СтраницаКомандировки = Неопределено Тогда
ВызватьИсключение "Не найдена страница ""ДанныеКомандировки"" на форме";
КонецЕсли;
// Получаем список дополнительных реквизитов формы
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
// Перебираем каждое имя реквизита
Для Каждого ИмяРеквизита Из ИменаРеквизитов Цикл
Попытка
// Находим свойство по имени реквизита
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита);
Если ЗначениеЗаполнено(Свойство) Тогда
// Ищем строку в списке дополнительных реквизитов
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ПолеДополнительногоРеквизита = НайденныеСтроки[0];
// Получаем элемент формы по имени реквизита значения
ПолеФормы = Форма.Элементы.Найти(ПолеДополнительногоРеквизита.ИмяРеквизитаЗначение);
Если НЕ ПолеФормы = Неопределено Тогда
// Перемещаем поле на страницу ДанныеКомандировки
Форма.Элементы.Переместить(ПолеФормы, СтраницаКомандировки);
// Устанавливаем доступность поля
ПолеФормы.Доступность = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Исключение
// Пропускаем ошибки при перемещении отдельных реквизитов
Продолжить;
КонецПопытки;
КонецЦикла;
Проверено на следующих конфигурациях и релизах:
- Документооборот КОРП, релизы 2.1.36.3
Вступайте в нашу телеграмм-группу Инфостарт