Как программно добавить новую колонку в дерево значений на управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы)
← К списку

В процессе разработки или доработки конфигураций 1С часто возникает необходимость динамически изменять структуру данных и элементов формы. Одной из таких задач является программное добавление новой колонки в


ДеревоЗначений
, которое отображается на управляемой форме. Это может потребоваться для вывода дополнительной информации, настройки пользовательского интерфейса или реализации сложной логики.

Мы с вами подробно разберем, как реализовать эту задачу, пройдя все необходимые шаги. Выясним, какие объекты и методы 1С нам понадобятся, и рассмотрим примеры кода для каждого этапа. Давайте приступим к совместному решению этой проблемы.

  1. Получаем программный объект "ДеревоЗначений" с формы

    Прежде всего, нам необходимо получить доступ к самому объекту

    
    ДеревоЗначений
    
    , который связан с реквизитом вашей формы. Без этого мы не сможем изменить его структуру. Для этого мы воспользуемся функцией
    
    РеквизитФормыВЗначение()
    
    , которая позволяет "достать" значение реквизита формы в виде программного объекта.

    Рассмотрим пример. Допустим, ваш реквизит формы, хранящий

    
    ДеревоЗначений
    
    , называется
    
    МоеДерево
    
    . Тогда код для получения объекта будет выглядеть так:

    
    ДеревоОбъект = РеквизитФормыВЗначение("МоеДерево");
    

    Здесь переменная

    
    ДеревоОбъект
    
    теперь содержит ссылку на ваше
    
    ДеревоЗначений
    
    , и мы можем начинать с ним работать.

  2. Добавляем колонку в структуру самого объекта "ДеревоЗначений"

    После того как мы получили объект

    
    ДеревоЗначений
    
    , следующим шагом будет добавление в него новой колонки. Это делается с помощью метода
    
    Колонки.Добавить()
    
    . При этом мы должны указать имя новой колонки, ее тип и, при необходимости, заголовок, который будет отображаться по умолчанию.

    Мы используем объект

    
    Новый ОписаниеТипов()
    
    для указания типа данных колонки. Давайте посмотрим на пример, где мы добавляем колонку с именем
    
    НоваяКолонка
    
    типа
    
    Строка
    
    :

    
    ДеревоОбъект.Колонки.Добавить("НоваяКолонка", Новый ОписаниеТипов("Строка"), "Заголовок новой колонки");
    

    Теперь объект

    
    ДеревоОбъект
    
    имеет новую колонку в своей структуре.

  3. Создаем новый реквизит формы для отображения колонки

    Важным моментом, который часто упускают, является то, что просто добавить колонку в

    
    ДеревоЗначений
    
    недостаточно для ее отображения на форме. Нам необходимо создать соответствующий реквизит формы, который будет "связан" с этой новой колонкой. Для этого мы используем конструктор
    
    Новый РеквизитФормы()
    
    и метод
    
    ИзменитьРеквизиты()
    
    .

    Обратите внимание на параметр

    
    ПутьКДанным
    
    в
    
    Новый РеквизитФормы()
    
    . Он должен быть сформирован в виде
    
    "<ИмяРеквизитаДереваНаФорме>.<ИмяНовойКолонки>"
    
    . Это ключевой момент для правильной привязки. Также рассмотрим параметр
    
    СохраняемыеДанные
    
    , который упоминался в исходной теме форума. Если вы хотите, чтобы данные этой колонки сохранялись вместе с формой (например, при сохранении настроек формы), установите его в
    
    Истина
    
    .

    Разберем по шагам:

    1. Создаем массив для добавляемых реквизитов:
    2. 
      МассивДобавляемыхРеквизитов = Новый Массив;
      
    3. Добавляем в него новый реквизит формы, связывая его с нашей новой колонкой:
    4. 
      МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("МоеДеревоНоваяКолонка", Новый ОписаниеТипов("Строка"), "МоеДерево.НоваяКолонка", "Заголовок новой колонки", Ложь));
      

      Здесь

      
      "МоеДеревоНоваяКолонка"
      
      - это имя нового реквизита формы, а
      
      "МоеДерево.НоваяКолонка"
      
      - это путь к данным, указывающий на нашу новую колонку внутри
      
      МоеДерево
      
      . Мы установили
      
      СохраняемыеДанные
      
      в
      
      Ложь
      
      , но вы можете изменить это по необходимости.

    5. Применяем изменения к реквизитам формы:
    6. 
      ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
      

      Этот метод фактически создает новый реквизит формы, который теперь "знает" о существовании нашей новой колонки.

  4. Выгружаем измененное "ДеревоЗначений" обратно в реквизит формы

    После всех программных манипуляций с объектом

    
    ДеревоОбъект
    
    нам необходимо обновить данные, хранящиеся в реквизите формы. Это гарантирует, что форма будет отображать актуальную структуру
    
    ДереваЗначений
    
    с добавленной колонкой. Для этого мы используем функцию
    
    ЗначениеВРеквизитФормы()
    
    .

    Посмотрим на пример:

    
    ЗначениеВРеквизитФормы(ДеревоОбъект, "МоеДерево");
    

    Эта операция "записывает" измененный объект

    
    ДеревоОбъект
    
    обратно в реквизит формы
    
    МоеДерево
    
    .

  5. Добавляем элемент формы для визуального отображения колонки

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

    
    ПолеФормы
    
    в коллекцию элементов формы и связать его с созданным ранее реквизитом формы. Для этого мы используем метод
    
    Элементы.Добавить()
    
    .

    Проанализируем шаги:

    1. Добавляем новый элемент на форму. Мы указываем его имя, тип (
      
      ПолеФормы
      
      ) и родительский элемент (в данном случае, само
      
      ДеревоЗначений
      
      на форме, которое является элементом
      
      Элементы.МоеДерево
      
      ):
    2. 
      НовыйЭлемент = Элементы.Добавить("МоеДеревоНоваяКолонкаЭлемент", Тип("ПолеФормы"), Элементы.МоеДерево);
      

      Здесь

      
      "МоеДеревоНоваяКолонкаЭлемент"
      
      - это уникальное имя нового элемента формы.

    3. Устанавливаем вид элемента. Для колонок дерева обычно используется
      
      ПолеВвода
      
      или
      
      ПолеНадписи
      
      в зависимости от требуемой интерактивности:
    4. 
      НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
      
    5. Самое главное – связываем этот элемент с данными. Мы указываем
      
      ПутьКДанным
      
      , который должен соответствовать пути нашей новой колонки в дереве:
    6. 
      НовыйЭлемент.ПутьКДанным = "МоеДерево.НоваяКолонка";
      

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

Заполнение данных в новой колонке

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


Для Каждого СтрокаДЗ Из ДеревоОбъект.Строки Цикл
    СтрокаДЗ.НоваяКолонка = "Некое значение для строки " + СтрокаДЗ.НомерСтроки;
КонецЦикла;

После заполнения данных не забудьте снова выполнить


ЗначениеВРеквизитФормы(ДеревоОбъект, "МоеДерево");
, чтобы изменения отобразились на форме.

Важные аспекты и нюансы

Рассмотрим несколько ключевых моментов, которые помогут избежать распространенных ошибок:

Следуя этим рекомендациям, вы сможете корректно и эффективно управлять структурой


ДереваЗначений
и отображением данных на ваших управляемых формах 1С.

← К списку