Как программно создать элемент управляемой формы и записать в него данные в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке сложных интерфейсов и динамических отборов в управляемом приложении 1С часто возникает задача создания элементов формы «на лету» во время работы пользователя. При этом начинающие разработчики сталкиваются с вопросом: как именно передать или изменить значение в таком программно сформированном поле ввода.

Разберем архитектурные особенности управляемых форм, пошаговый алгоритм создания реквизитов и элементов, а также правильный синтаксис для записи данных.

Архитектурная концепция: элементы формы и реквизиты

В управляемых формах 1С элементы интерфейса (поля ввода, флажки, переключатели) не хранят данные самостоятельно. Они являются исключительно визуальным представлением данных, находящихся в реквизитах формы. Связь между визуальным элементом и данными задается с помощью свойства ПутьКДанным.

Следовательно, для программного вывода поля со значением необходимо выполнить два обязательных действия:

  1. Создать динамический реквизит формы нужного типа с помощью метода ИзменитьРеквизиты.
  2. Создать визуальный элемент формы, связать его через ПутьКДанным с реквизитом и записать значение в созданный реквизит.

Пошаговый пример создания поля и записи значения

Рассмотрим серверную процедуру, которая создает реквизит строкового типа, связывает с ним поле ввода на форме и сразу устанавливает начальное значение.


&НаСервере
Процедура ДобавитьПолеВводаНаСервере(ИмяСуффикса, НачальноеЗначение)

    ИмяРеквизита = "РеквизитКомментарий" + ИмяСуффикса;
    ИмяЭлемента   = "ПолеКомментарий" + ИмяСуффикса;
    
    // 1. Формируем массив новых реквизитов формы
    ДобавляемыеРеквизиты = Новый Массив;
    НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
    
    // 2. Применяем изменения к структуре формы
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    // 3. Создаем визуальный элемент на форме
    НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭтаФорма.Элементы.Группа1);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = ИмяРеквизита;
    НовыйЭлемент.Заголовок = "Комментарий " + ИмяСуффикса;
    
    // 4. Записываем значение в динамически созданный реквизит
    ЭтаФорма[ИмяРеквизита] = НачальноеЗначение;

КонецПроцедуры

Обращение к созданному реквизиту на клиенте и сервере

После вызова метода ИзменитьРеквизиты созданный реквизит становится полноправным свойством формы. Так как его имя формируется динамически во время выполнения программы, прямое обращение через точку невозможно. Обращение выполняется через оператор квадратных скобок по строковому имени реквизита:


// На сервере
ЭтаФорма["Список" + ИмяСтраницы] = "Текст для серверной процедуры";

// На клиенте
ЭтаФорма["Список" + ИмяСтраницы] = "Текст, измененный на клиенте";

Такой синтаксис позволяет как считывать текущие введенные пользователем данные, так и перезаписывать их из любого контекста модуля формы.

Назначение обработчиков событий для динамического элемента

Если требуется отслеживать действия пользователя в созданном поле ввода (например, изменение значения), необходимо привязать обработчик через метод УстановитьДействие.


&НаСервере
Процедура НазначитьСобытиеЭлементу(ИмяЭлемента)
    ЭлементФормы = ЭтаФорма.Элементы[ИмяЭлемента];
    ЭлементФормы.УстановитьДействие("ПриИзменении", "ДинамическоеПолеПриИзменении");
КонецПроцедуры

&НаКлиенте
Процедура ДинамическоеПолеПриИзменении(Элемент)
    // Обработка изменения данных пользователем
    ТекущееЗначение = ЭтаФорма[Элемент.ПутьКДанным];
    ПоказатьОповещениеПользователя("Изменено значение", , ТекущееЗначение);
КонецПроцедуры

Обратите внимание: процедура-обработчик должна быть заранее объявлена в модуле формы с соответствующей директивой компиляции (обычно &НаКлиенте).

Важные правила и рекомендации по производительности

  1. Пакетное добавление: Вызов метода ИзменитьРеквизиты приводит к полной переинициализации контекста формы и передаче данных между клиентом и сервером. Если необходимо добавить несколько полей, накапливайте все объекты РеквизитФормы в один массив и вызывайте ИзменитьРеквизиты один раз, а не в цикле.
  2. Контроль уникальности имен: Попытка добавить реквизит с уже существующим именем приведет к аварийному завершению программы. Для проверки структуры реквизитов можно использовать метод ПолучитьРеквизиты().
  3. Удаление элементов и реквизитов: При динамическом удалении реквизитов сначала необходимо удалить связанный элемент интерфейса через Элементы.Удалить(...) (или очистить его свойство ПутьКДанным), и только затем вызывать ИзменитьРеквизиты с массивом удаляемых имен во втором параметре.
  4. Сохранение данных: Динамически добавленные реквизиты существуют только во время открытого сеанса формы. Если введенные данные требуется сохранить в информационной базе, их необходимо вручную перенести в реквизиты объекта или регистры перед закрытием формы.
← На главную