Как в дерево значений на обычной форме добавить колонку с выбором из нескольких значений?

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

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

Постановка задачи и анализ структуры

Для начала проанализируем ситуацию. Когда мы работаем с элементом формы типа Табличное поле, отображающим ДеревоЗначений, мы имеем дело с двумя объектами:

  1. Объект данных — само ДеревоЗначений, которое хранится в памяти и содержит строки и колонки с данными.
  2. Элемент управления — визуальное представление на форме (колонки табличного поля), которое отвечает за то, как пользователь видит данные и как он с ними взаимодействует (флажки, поля ввода, списки выбора).

Чтобы добавить функциональную колонку с выбором, нам необходимо внести изменения в оба этих объекта.

Шаг 1. Подготовка структуры данных в объекте ДеревоЗначений

Прежде чем настраивать визуальное поле выбора, мы должны убедиться, что в самом объекте данных существует колонка с соответствующим типом. Если мы планируем выбирать текст, тип должен быть Строка. Если планируется выбор документов разных видов, необходимо использовать составной тип данных.

Рассмотрим пример создания колонки со списком документов двух видов:


// Подготовим массив типов для составного типа
НовыйТип = Новый Массив;
НовыйТип.Добавить(Тип("ДокументСсылка.ПриходныйКассовыйОрдер"));
НовыйТип.Добавить(Тип("ДокументСсылка.РасходныйКассевыйОрдер"));

// Добавляем колонку в объект ДеревоЗначений (реквизит формы)
ДеревоЗначений.Колонки.Добавить("ВидДокумента", Новый ОписаниеТипов(НовыйТип), "Вид документа");

Шаг 2. Программное создание колонки на форме

Частой ошибкой является использование метода СоздатьКолонки(). Рассмотрим, почему это происходит. Метод СоздатьКолонки() полностью удаляет текущие колонки элемента формы и создает новые на основе структуры объекта данных. Если вы до этого настраивали колонки интерактивно в конфигураторе, они исчезнут.

Чтобы сохранить существующие колонки и добавить новую программно, используем метод Добавить() коллекции колонок табличного поля:


// Добавляем визуальную колонку в ТабличноеПоле (элемент управления)
НоваяКолонка = ЭлементыФормы.Дерево.Колонки.Добавить("ВидДокумента");
НоваяКолонка.Данные = "ВидДокумента"; // Привязываем к колонке объекта данных
НоваяКолонка.Заголовок = "Выберите вид документа";
НоваяКолонка.Ширина = 20;

Шаг 3. Настройка элемента управления "ПолеВыбора"

Теперь разберем самое важное — как заставить колонку предлагать выбор из списка. Существует два пути: использовать ПолеВвода с режимом выбора из списка или специализированное ПолеВыбора. В обычных формах для жестко заданных списков удобнее использовать второй вариант.

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


// Устанавливаем тип элемента управления для колонки
НоваяКолонка.УстановитьЭлементУправления(Тип("ПолеВыбора"));

// Теперь можно обратиться к элементу управления и заполнить список
СЗ = Новый СписокЗначений;
СЗ.Добавить(Документы.ПриходныйКассовыйОрдер.ПустаяСсылка(), "Приходный кассовый ордер");
СЗ.Добавить(Документы.РасходныйКассовыйОрдер.ПустаяСсылка(), "Расходный кассовый ордер");

// Присваиваем список элементу управления
НоваяКолонка.ЭлементУправления.СписокВыбора = СЗ;

Шаг 4. Настройка режима редактирования и отображения

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

НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;

Также важно помнить про иерархию. Если ваша колонка должна отображать кнопки развертывания дерева (плюсики), у одной из колонок должно быть установлено свойство ОтображатьИерархию.

ЭлементыФормы.Дерево.Колонки.Наименование.ОтображатьИерархию = Истина;

Шаг 5. Заполнение данными и обновление интерфейса

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

Посмотрим на пример правильного обновления данных без потери структуры:


// Выгружаем результат запроса во временную переменную
Результат = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

// Присваиваем данные реквизиту формы
ДеревоЗначений = Результат;

// Принудительно обновляем строки на форме, чтобы увидеть изменения
ЭлементыФормы.Дерево.ОбновитьСтроки();

Тонкости работы с NULL в итогах

Проанализируем ситуацию, когда в узлах дерева (группировках) новые колонки отображаются как пустые или содержат NULL. Это происходит потому, что при обходе результата запроса по группировкам 1С заполняет только те поля, которые указаны в секции ИТОГИ. Если вы добавили колонку программно и хотите, чтобы она была доступна на всех уровнях, вам может потребоваться перебор строк дерева после загрузки для установки значений по умолчанию.

Резюме

Для реализации выбора из двух значений в дереве на обычных формах необходимо:

  1. Добавить колонку в объект ДеревоЗначений с нужным типом.
  2. Добавить колонку в табличное поле программно через Колонки.Добавить(), не используя СоздатьКолонки().
  3. Назначить элемент управления ПолеВыбора.
  4. Заполнить список выбора через свойство ЭлементУправления.СписокВыбора.
  5. Установить режим редактирования "Непосредственно" для удобства пользователя.

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

← На главную