Как вывести таблицу значений на управляемую форму в 1С 8.3?

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

Переход с обычных форм на управляемые в 1С:Предприятие 8 часто вызывает вопросы у разработчиков, привыкших к простому присваиванию ЭлементыФормы.Таблица.Значение = ТЗ. В управляемом интерфейсе логика работы с данными и их визуализацией была в корне пересмотрена. Давайте разберем, как правильно выводить таблицу значений (ТЗ) на управляемую форму, рассмотрим программный и статический способы, а также проанализируем нюансы производительности.

Понимание архитектуры: Данные против Элементов

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

  1. Создание реквизита формы с типом ДанныеФормыКоллекция (именно в этом типе "живет" таблица на форме).
  2. Создание элемента формы типа ТаблицаФормы и связывание его с этим реквизитом.

Способ 1: Статический (через конфигуратор)

Если структура вашей таблицы (состав колонок) известна заранее, это самый простой и правильный путь. Рассмотрим его по шагам:

Во-первых, в редакторе формы на закладке "Реквизиты" создадим новый реквизит, назовем его, например, МояТаблица и укажем тип "Таблица значений". Добавим в него необходимые колонки с нужными типами данных.

Во-вторых, просто перетащим этот реквизит мышкой в левую часть редактора — в дерево "Элементы". Платформа автоматически создаст элемент управления "Таблица" и колонки внутри него.

В-третьих, для заполнения этой таблицы данными на сервере используем специальный метод:


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

Способ 2: Программное создание (динамические колонки)

Часто возникают ситуации, когда состав колонок таблицы заранее неизвестен (например, в универсальных отчетах или консолях запросов). В этом случае нам придется строить таблицу "на лету". Разберем по шагам, как это реализовать.

Шаг 1: Подготовка структуры реквизитов. Для добавления новых реквизитов формы используется метод ИзменитьРеквизиты. Важно помнить, что это тяжелая операция, требующая обращения к серверу и перегенерации формы.

Шаг 2: Создание элементов интерфейса. После того как данные созданы, нам нужно добавить визуальные поля (колонки) в объект Элементы.

Проанализируем пример кода, который динамически создает таблицу на основе переданной таблицы значений:


&НаСервере
Процедура ВывестиТЗНаФорму(ТаблицаИсточник, ИмяРеквизита)

    // 1. Удаляем старые реквизиты, если они были созданы ранее
    // Это критически важно, чтобы избежать ошибки "Реквизит с таким именем уже существует"
    МассивУдаляемыхРеквизитов = Новый Массив;
    СтарыйРеквизит = ЭтаФорма.НайтиРеквизит(ИмяРеквизита);
    Если СтарыйРеквизит <> Неопределено Тогда
        // Нужно также удалить элементы формы, связанные с этим реквизитом
        ЭлементТаблица = Элементы.Найти(ИмяРеквизита);
        Если ЭлементТаблица <> Неопределено Тогда
            Элементы.Удалить(ЭлементТаблица);
        КонецЕсли;
        МассивУдаляемыхРеквизитов.Добавить(ИмяРеквизита);
    КонецЕсли;

    // 2. Формируем массив новых реквизитов
    МассивРеквизитов = Новый Массив;
    
    // Добавляем саму таблицу
    РеквизитТаблица = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("ТаблицаЗначений"), , "Заголовок таблицы");
    МассивРеквизитов.Добавить(РеквизитТаблица);
    
    // Добавляем колонки таблицы
    Для Каждого Колонка Из ТаблицаИсточник.Колонки Цикл
        НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизита);
        МассивРеквизитов.Добавить(НоваяКолонка);
    КонецЦикла;
    
    // Применяем изменения на форме
    ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов, МассивУдаляемыхРеквизитов);
    
    // 3. Создаем визуальное отображение - Таблицу
    ТаблицаФормы = Элементы.Добавить(ИмяРеквизита, Тип("ТаблицаФормы"));
    ТаблицаФормы.ПутьКДанным = ИмяРеквизита;
    
    // 4. Создаем визуальные колонки
    Для Каждого Колонка Из ТаблицаИсточник.Колонки Цикл
        НовыйЭлементКолонка = Элементы.Добавить(ИмяРеквизита + "_" + Колонка.Имя, Тип("ПолеФормы"), ТаблицаФормы);
        НовыйЭлементКолонка.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлементКолонка.ПутьКДанным = ИмяРеквизита + "." + Колонка.Имя;
    КонецЦикла;
    
    // 5. Заполняем данными
    ЗначениеВРеквизитФормы(ТаблицаИсточник, ИмяРеквизита);

КонецПроцедуры

Важные нюансы и советы по оптимизации

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

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

Производительность. Метод ИзменитьРеквизиты заставляет платформу полностью перерисовать форму. Если у вас 50 колонок и 1000 строк, это может быть заметно пользователю. Старайтесь выполнять все изменения структуры за один вызов этого метода, собирая все реквизиты в один массив.

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

Использование Табличного Документа. Если ваша задача — просто показать данные пользователю без возможности их редактирования в ячейках, проанализируем альтернативу. Иногда гораздо эффективнее вывести результат в ПолеТабличногоДокумента. Это работает быстрее, так как не требует манипуляций с реквизитами формы и позволяет задать любое оформление (цвета, шрифты, группировки) стандартными средствами вывода отчетов.

Сохранение текущей строки. При использовании ЗначениеВРеквизитФормы курсор в таблице часто сбрасывается на первую строку. Чтобы этого избежать, перед обновлением данных запомните значение ключевого поля текущей строки, а после обновления найдите строку с этим ключом в реквизите формы и установите её в свойство Элементы.ИмяТаблицы.ТекущаяСтрока.

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

← На главную