Работа с обычными формами в 1С:Предприятии 8 часто требует динамической настройки интерфейса. Одной из распространенных задач является добавление в существующее дерево значений колонки, в которой пользователь мог бы выбирать значение из фиксированного списка (например, текстовые значения или типы документов). Рассмотрим подробно, как реализовать этот механизм программно, избежав типичных ошибок с потерей данных и исчезновением колонок.
Для начала проанализируем ситуацию. Когда мы работаем с элементом формы типа Табличное поле, отображающим ДеревоЗначений, мы имеем дело с двумя объектами:
ДеревоЗначений, которое хранится в памяти и содержит строки и колонки с данными.Чтобы добавить функциональную колонку с выбором, нам необходимо внести изменения в оба этих объекта.
Прежде чем настраивать визуальное поле выбора, мы должны убедиться, что в самом объекте данных существует колонка с соответствующим типом. Если мы планируем выбирать текст, тип должен быть Строка. Если планируется выбор документов разных видов, необходимо использовать составной тип данных.
Рассмотрим пример создания колонки со списком документов двух видов:
// Подготовим массив типов для составного типа
НовыйТип = Новый Массив;
НовыйТип.Добавить(Тип("ДокументСсылка.ПриходныйКассовыйОрдер"));
НовыйТип.Добавить(Тип("ДокументСсылка.РасходныйКассевыйОрдер"));
// Добавляем колонку в объект ДеревоЗначений (реквизит формы)
ДеревоЗначений.Колонки.Добавить("ВидДокумента", Новый ОписаниеТипов(НовыйТип), "Вид документа");
Частой ошибкой является использование метода СоздатьКолонки(). Рассмотрим, почему это происходит. Метод СоздатьКолонки() полностью удаляет текущие колонки элемента формы и создает новые на основе структуры объекта данных. Если вы до этого настраивали колонки интерактивно в конфигураторе, они исчезнут.
Чтобы сохранить существующие колонки и добавить новую программно, используем метод Добавить() коллекции колонок табличного поля:
// Добавляем визуальную колонку в ТабличноеПоле (элемент управления)
НоваяКолонка = ЭлементыФормы.Дерево.Колонки.Добавить("ВидДокумента");
НоваяКолонка.Данные = "ВидДокумента"; // Привязываем к колонке объекта данных
НоваяКолонка.Заголовок = "Выберите вид документа";
НоваяКолонка.Ширина = 20;
Теперь разберем самое важное — как заставить колонку предлагать выбор из списка. Существует два пути: использовать ПолеВвода с режимом выбора из списка или специализированное ПолеВыбора. В обычных формах для жестко заданных списков удобнее использовать второй вариант.
Выясним причину, по которой у многих программистов не получается сразу задать список выбора. Список значений принадлежит не самой колонке, а ее элементу управления. Рассмотрим правильный порядок действий:
// Устанавливаем тип элемента управления для колонки
НоваяКолонка.УстановитьЭлементУправления(Тип("ПолеВыбора"));
// Теперь можно обратиться к элементу управления и заполнить список
СЗ = Новый СписокЗначений;
СЗ.Добавить(Документы.ПриходныйКассовыйОрдер.ПустаяСсылка(), "Приходный кассовый ордер");
СЗ.Добавить(Документы.РасходныйКассовыйОрдер.ПустаяСсылка(), "Расходный кассовый ордер");
// Присваиваем список элементу управления
НоваяКолонка.ЭлементУправления.СписокВыбора = СЗ;
Для того чтобы пользователь мог выбрать значение одним кликом, проанализируем настройки редактирования. По умолчанию в 1С используется режим "Вход в редактирование", когда первый клик только активирует ячейку. Для удобства лучше установить режим "Непосредственно".
НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
Также важно помнить про иерархию. Если ваша колонка должна отображать кнопки развертывания дерева (плюсики), у одной из колонок должно быть установлено свойство ОтображатьИерархию.
ЭлементыФормы.Дерево.Колонки.Наименование.ОтображатьИерархию = Истина;
Если вы выгружаете данные из запроса в уже существующее дерево, важно не затереть структуру колонок. Вместо прямой замены значения ЭлементыФормы.Дерево.Значение = РезультатЗапроса, лучше использовать загрузку данных в существующий объект или аккуратное присвоение с последующим вызовом обновления.
Посмотрим на пример правильного обновления данных без потери структуры:
// Выгружаем результат запроса во временную переменную
Результат = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
// Присваиваем данные реквизиту формы
ДеревоЗначений = Результат;
// Принудительно обновляем строки на форме, чтобы увидеть изменения
ЭлементыФормы.Дерево.ОбновитьСтроки();
Проанализируем ситуацию, когда в узлах дерева (группировках) новые колонки отображаются как пустые или содержат NULL. Это происходит потому, что при обходе результата запроса по группировкам 1С заполняет только те поля, которые указаны в секции ИТОГИ. Если вы добавили колонку программно и хотите, чтобы она была доступна на всех уровнях, вам может потребоваться перебор строк дерева после загрузки для установки значений по умолчанию.
Для реализации выбора из двух значений в дереве на обычных формах необходимо:
ДеревоЗначений с нужным типом.Колонки.Добавить(), не используя СоздатьКолонки().ПолеВыбора.ЭлементУправления.СписокВыбора.Следуя этой методике, вы сможете создавать динамические и интерактивные интерфейсы, которые сохраняют свою работоспособность и визуальные настройки даже при частой смене данных в дереве.