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

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

При программной разработке и динамическом формировании интерфейса управляемой формы нередко возникает задача: скопировать существующий элемент формы (или целую группу элементов) и применить к новому элементу все настройки и свойства оригинала. Разберем особенности получения свойств элементов формы и способы их быстрого переноса.

Особенности доступа к свойствам элементов в управляемых формах

В отличие от прикладных объектов конфигурации (справочников, документов), у которых структуру реквизитов можно динамически прочитать через объект Метаданные, для элементов формы встроенной рефлексии метаданных платформой не предусмотрено. Коллекция Элементы содержит различные типы элементов интерфейса (ПолеФормы, ГруппаФормы, КнопкаФормы, ТаблицаФормы, ДекорацияФормы), каждый из которых обладает своим набором свойств.

Программное создание и модификация состава элементов формы выполняются исключительно в серверном контексте (в обработчиках формы ПриСозданииНаСервере или отдельных процедурах с директивой &НаСервере).

Использование процедуры ЗаполнитьЗначенияСвойств

Для быстрого переноса свойств между объектами в платформе 1С предусмотрена универсальная глобальная процедура ЗаполнитьЗначенияСвойств. Она сопоставляет имена свойств объекта-источника и объекта-приемника и копирует совпадающие значения.

Выясним причину частой ошибки разработчиков: ЗаполнитьЗначенияСвойств является процедурой, а не функцией. Попытка присвоить результат её выполнения переменной или вызвать её в выражении приведет к синтаксической ошибке компиляции «Обращение к процедуре как к функции».

Посмотрим на правильный синтаксис вызова:


ЗаполнитьЗначенияСвойств(Приемник, Источник, СписокСвойств, ИсключаемыеСвойства);

Разберем по шагам создание нового элемента и копирование свойств из исходного элемента с учетом ограничений платформы:

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

Рассмотрим пример программного копирования поля ввода на форме:


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

Нюансы переноса свойств и связей элементов

Проанализируем важные ограничения, которые следует учитывать при массовом копировании элементов формы:

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