В процессе разработки или доработки конфигураций 1С часто возникает необходимость динамически изменять структуру данных и элементов формы. Одной из таких задач является программное добавление новой колонки в
ДеревоЗначений
, которое отображается на управляемой форме. Это может потребоваться для вывода дополнительной информации, настройки пользовательского интерфейса или реализации сложной логики.
Мы с вами подробно разберем, как реализовать эту задачу, пройдя все необходимые шаги. Выясним, какие объекты и методы 1С нам понадобятся, и рассмотрим примеры кода для каждого этапа. Давайте приступим к совместному решению этой проблемы.
Получаем программный объект "ДеревоЗначений" с формы
Прежде всего, нам необходимо получить доступ к самому объекту
ДеревоЗначений
, который связан с реквизитом вашей формы. Без этого мы не сможем изменить его структуру. Для этого мы воспользуемся функцией
РеквизитФормыВЗначение()
, которая позволяет "достать" значение реквизита формы в виде программного объекта.
Рассмотрим пример. Допустим, ваш реквизит формы, хранящий
ДеревоЗначений
, называется
МоеДерево
. Тогда код для получения объекта будет выглядеть так:
Добавляем колонку в структуру самого объекта "ДеревоЗначений"
После того как мы получили объект
ДеревоЗначений
, следующим шагом будет добавление в него новой колонки. Это делается с помощью метода
Колонки.Добавить()
. При этом мы должны указать имя новой колонки, ее тип и, при необходимости, заголовок, который будет отображаться по умолчанию.
Мы используем объект
Новый ОписаниеТипов()
для указания типа данных колонки. Давайте посмотрим на пример, где мы добавляем колонку с именем
НоваяКолонка
типа
Строка
:
ДеревоОбъект.Колонки.Добавить("НоваяКолонка", Новый ОписаниеТипов("Строка"), "Заголовок новой колонки");
Теперь объект
ДеревоОбъект
имеет новую колонку в своей структуре.
Создаем новый реквизит формы для отображения колонки
Важным моментом, который часто упускают, является то, что просто добавить колонку в
ДеревоЗначений
недостаточно для ее отображения на форме. Нам необходимо создать соответствующий реквизит формы, который будет "связан" с этой новой колонкой. Для этого мы используем конструктор
Новый РеквизитФормы()
и метод
ИзменитьРеквизиты()
.
Обратите внимание на параметр
ПутьКДанным
в
Новый РеквизитФормы()
. Он должен быть сформирован в виде
"<ИмяРеквизитаДереваНаФорме>.<ИмяНовойКолонки>"
. Это ключевой момент для правильной привязки. Также рассмотрим параметр
СохраняемыеДанные
, который упоминался в исходной теме форума. Если вы хотите, чтобы данные этой колонки сохранялись вместе с формой (например, при сохранении настроек формы), установите его в
Истина
.
Разберем по шагам:
Создаем массив для добавляемых реквизитов:
МассивДобавляемыхРеквизитов = Новый Массив;
Добавляем в него новый реквизит формы, связывая его с нашей новой колонкой:
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("МоеДеревоНоваяКолонка", Новый ОписаниеТипов("Строка"), "МоеДерево.НоваяКолонка", "Заголовок новой колонки", Ложь));
Здесь
"МоеДеревоНоваяКолонка"
- это имя нового реквизита формы, а
"МоеДерево.НоваяКолонка"
- это путь к данным, указывающий на нашу новую колонку внутри
МоеДерево
. Мы установили
СохраняемыеДанные
в
Ложь
, но вы можете изменить это по необходимости.
Применяем изменения к реквизитам формы:
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
Этот метод фактически создает новый реквизит формы, который теперь "знает" о существовании нашей новой колонки.
Выгружаем измененное "ДеревоЗначений" обратно в реквизит формы
После всех программных манипуляций с объектом
ДеревоОбъект
нам необходимо обновить данные, хранящиеся в реквизите формы. Это гарантирует, что форма будет отображать актуальную структуру
ДереваЗначений
с добавленной колонкой. Для этого мы используем функцию
После выполнения всех этих шагов, новая колонка будет успешно добавлена и отображена на вашей управляемой форме.
Заполнение данных в новой колонке
После того как колонка добавлена в структуру дерева и отображена на форме, вы можете заполнять ее значениями. Обращаться к ней можно по имени колонки в строках дерева. Рассмотрим подробнее, как это сделать:
Для Каждого СтрокаДЗ Из ДеревоОбъект.Строки Цикл
СтрокаДЗ.НоваяКолонка = "Некое значение для строки " + СтрокаДЗ.НомерСтроки;
КонецЦикла;
После заполнения данных не забудьте снова выполнить
Рассмотрим несколько ключевых моментов, которые помогут избежать распространенных ошибок:
Выполнение на сервере: Все описанные операции по изменению реквизитов формы и элементов формы должны выполняться на сервере. Типичные места для такого кода – это обработчики событий формы, такие как
ПриСозданииНаСервере
,
ПриОткрытии
(с вызовом серверной процедуры) или другие серверные процедуры, где происходит формирование дерева значений.
Динамическое формирование: Если ваше
ДеревоЗначений
формируется динамически при каждом открытии формы или изменении данных, то создание колонки и ее реквизита также может потребоваться выполнять каждый раз. В таких случаях мы рекомендуем предварительно проверять, не существует ли уже такая колонка или реквизит, чтобы избежать ошибок и дублирования.
Параметр
СохраняемыеДанные
: Как мы уже упоминали, параметр
СохраняемыеДанные
в конструкторе
Новый РеквизитФормы()
играет важную роль. Если вы хотите, чтобы данные реквизита формы (и, соответственно, вашей новой колонки) сохранялись между сеансами работы пользователя или при сохранении настроек формы, обязательно установите этот параметр в
Истина
. Это тот самый момент, на который обратил внимание автор исходной темы форума, когда "забыл, что надо куда-то сохранять дерево значений", что указывает на важность сохранения структуры и данных реквизитов формы.
Следуя этим рекомендациям, вы сможете корректно и эффективно управлять структурой
ДереваЗначений
и отображением данных на ваших управляемых формах 1С.
← К списку