Как программно добавить колонку с типом Таблица значений в дерево и реализовать выбор данных

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

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

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

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

Для добавления реквизитов в управляемую форму используется метод ИзменитьРеквизиты(). Разберем правильный синтаксис создания колонки с типом ТаблицаЗначений:


// Создаем массив для новых реквизитов
МассивДобавляемыхРеквизитов = Новый Массив;

// Правильное создание описания типа для Таблицы Значений
ТипРеквизитаТЗ = Новый ОписаниеТипов("ТаблицаЗначений");

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

// Выполняем изменение структуры реквизитов формы
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

Важное уточнение: Метод ИзменитьРеквизиты является "тяжелой" серверной операцией. Он вызывает полную переинициализацию формы. Старайтесь выполнять такие действия разово, например, при создании формы или по конкретному действию пользователя, чтобы не снижать производительность системы.

Особенности работы с вложенными таблицами в строках дерева

После того как мы программно добавили колонку, важно понимать, как 1С работает с типами данных в ячейках. Если вы создали колонку с типом ТаблицаЗначений, то по умолчанию в каждой строке дерева в этой ячейке будет лежать "пустая" таблица без колонок. Рассмотрим подробнее, что это значит для разработчика:

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

Реализация задачи «Вывод данных через запятую»

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

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

  1. Скрытая колонка (Данные): Тип СписокЗначений или Массив. Здесь хранятся реальные ссылки на объекты.
  2. Видимая колонка (Представление): Тип Строка. Здесь отображается текст "Объект1, Объект2...", который видит пользователь.

Рассмотрим пример функции, которая преобразует данные из списка в строку для отображения:


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

Интерактивное редактирование через форму подбора

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

Разберем шаги настройки:

Пример кода для обработки выбора:


&НаКлиенте
Процедура ДеревоЗадачКолонкаПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отменяем стандартный выбор
    
    // Получаем текущие данные строки
    ТекущаяСтрока = Элементы.ДеревоЗадач.ТекущиеДанные;
    
    // Описываем параметры формы подбора
    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("МножественныйВыбор", Истина;
    ПараметрыПодбора.Вставить("ЗначениеХранилище", ТекущаяСтрока.СписокОбъектов);
    
    // Открываем форму выбора (например, справочника)
    ОткрытьФорму("Справочник.ВашСправочник.ФормаВыбора", ПараметрыПодбора, Элемент);
    
КонецПроцедуры

Итоги и рекомендации

Проанализировав ситуацию, можно сделать вывод: хотя технически добавить колонку с типом ТаблицаЗначений в дерево можно, это не всегда является оптимальным решением с точки зрения производительности и удобства поддержки.

Основные советы:

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

← На главную