← Назад к вопросам

Добавление элементов на управляемую форму программно

2.0 Middle🔥 181 комментариев
#Формы и интерфейс

Условие

Напишите код для программного добавления элементов на управляемую форму в типовой конфигурации.

Требования:

  • Добавить новое поле ввода на форму документа
  • Связать его с реквизитом формы
  • Настроить обработчик события изменения
  • Всё должно работать без снятия с поддержки

Пример структуры

// В модуле формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Добавление реквизита
    // Добавление элемента формы
    // Настройка связи и событий
КонецПроцедуры

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Добавление элементов на управляемую форму программно

// В модуле формы документа

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем реквизит формы
    ДобавитьРеквизитФормы();
    
    // Добавляем элемент на форму
    ДобавитьЭлементНаФорму();
    
КонецПроцедуры

&НаСервере
Процедура ДобавитьРеквизитФормы()
    
    // Получаем структуру новых реквизитов
    МассивНовыхРеквизитов = Новый Массив;
    
    ОписаниеРеквизита = Новый ОписаниеРеквизита;
    ОписаниеРеквизита.Имя = "ДополнительноеПоле";
    ОписаниеРеквизита.Тип = Новый ОписаниеТипов("Строка", , , 255);
    ОписаниеРеквизита.ОсновнойРеквизит = Ложь;
    ОписаниеРеквизита.ИспользованиеАтрибутов = ИспользованиеАтрибутов.Невозможно;
    
    МассивНовыхРеквизитов.Добавить(ОписаниеРеквизита);
    
    // Добавляем реквизиты в форму
    ДобавитьРеквизиты(МассивНовыхРеквизитов);
    
КонецПроцедуры

&НаСервере
Процедура ДобавитьЭлементНаФорму()
    
    // Получаем контейнер формы
    КонтейнерЭлементов = Элементы;
    
    // Получаем группу, в которую добавим элемент
    РодительскаяГруппа = КонтейнерЭлементов.ОсновнаяГруппа;
    
    // Создаём новое поле ввода
    НовыйЭлемент = КонтейнерЭлементов.Добавить();
    НовыйЭлемент.Вид = ВидОсновногоЭлемента.ПолеВвода;
    НовыйЭлемент.Имя = "ДополнительноеПолеВвода";
    НовыйЭлемент.Тип = ТипОсновногоЭлемента.ОсновнойЭлемент;
    НовыйЭлемент.РодительскогоГруппы = РодительскаяГруппа;
    
    // Связываем с реквизитом
    НовыйЭлемент.ПутьДанных = "ДополнительноеПоле";
    
    // Настраиваем свойства элемента
    НовыйЭлемент.ПоказыватьСтроку = Истина;
    НовыйЭлемент.Заголовок = "Дополнительное поле";
    НовыйЭлемент.РазмерПолучетки = "По ширине формы";
    НовыйЭлемент.МаксимальнаяШирина = 60;
    
    // Добавляем обработчик события "ПриИзменении"
    ОписаниеОбработчика = Новый ОписаниеОбработчика;
    ОписаниеОбработчика.Функция = "ДополнительноеПолеПриИзменении";
    ОписаниеОбработчика.МодульОбработчика = "МодульФормы";
    
    НовыйЭлемент.ОбработчикиСобытий.Вставить("ПриИзменении", ОписаниеОбработчика);
    
КонецПроцедуры

// Обработчик события изменения
&НаКлиенте
Процедура ДополнительноеПолеПриИзменении(Элемент)
    
    Сообщить("Значение дополнительного поля изменено на: " + ДополнительноеПоле);
    
КонецПроцедуры

Расширенный вариант с группой

&НаСервере
Процедура ДобавитьЭлементНаФормуРасширенный()
    
    КонтейнерЭлементов = Элементы;
    
    // Сначала добавляем группу (контейнер для элемента)
    НоваяГруппа = КонтейнерЭлементов.Добавить();
    НоваяГруппа.Вид = ВидОсновногоЭлемента.ГруппаОбычная;
    НоваяГруппа.Имя = "ДополнительнаяГруппа";
    НоваяГруппа.Заголовок = "Дополнительная информация";
    НоваяГруппа.РодительскогоГруппы = КонтейнерЭлементов.ОсновнаяГруппа;
    
    // Добавляем два поля в группу
    Для Индекс = 1 По 2 Цикл
        
        НовыйЭлемент = КонтейнерЭлементов.Добавить();
        НовыйЭлемент.Вид = ВидОсновногоЭлемента.ПолеВвода;
        НовыйЭлемент.Имя = "ПолеДополнительное" + Индекс;
        НовыйЭлемент.РодительскогоГруппы = НоваяГруппа;
        НовыйЭлемент.ПутьДанных = "ДополнительноеПоле" + Индекс;
        НовыйЭлемент.Заголовок = "Поле " + Индекс;
        
    КонецЦикла;
    
КонецПроцедуры

Удаление элемента с формы

&НаСервере
Процедура УдалитьЭлементСФормы()
    
    КонтейнерЭлементов = Элементы;
    
    // Проверяем, существует ли элемент
    Если КонтейнерЭлементов.Найти("ДополнительноеПолеВвода") <> Неопределено Тогда
        КонтейнерЭлементов.УдалитьЭлемент(КонтейнерЭлементов.ДополнительноеПолеВвода);
    КонецЕсли;
    
    // Удаляем реквизит
    УдалитьРеквизиты(Новый Массив("ДополнительноеПоле"));
    
КонецПроцедуры

Ключевые компоненты

Этапы добавления:

  • Добавить реквизит формы через ДобавитьРеквизиты()
  • Создать элемент контейнера Элементы.Добавить()
  • Связать элемент с реквизитом через ПутьДанных
  • Добавить обработчик события

Особенности:

  • Процедура должна быть &НаСервере
  • Элемент добавляется в контейнер элементов
  • Обработчик связывается через ОбработчикиСобытий
  • Всё автоматически сохраняется в конфигурацию

Преимущества программного добавления:

  • Условное добавление элементов
  • Динамическое управление интерфейсом
  • Нет необходимости снимать форму с поддержки