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

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

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

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

Способ 1. Статическое создание колонок в редакторе формы

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

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

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

Посмотрим на пример серверного кода:


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

Способ 2. Динамическое создание структуры колонок и элементов

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

Разберем по шагам алгоритм динамического построения:

  1. Если форма заполняется повторно, удалим ранее созданные динамические элементы формы, вызвав метод Элементы.Удалить().
  2. Удалим старые динамические колонки из структуры формы через метод ИзменитьРеквизиты(), передав массив имен удаляемых реквизитов.
  3. На основе колонок выгруженной таблицы значений сформируем массив новых объектов РеквизитФормы, указав имя реквизита-родителя (нашей таблицы).
  4. Применим изменения структуры формы вызовом метода ИзменитьРеквизиты(МассивДобавляемыхРеквизитов).
  5. Для каждой колонки создадим визуальный элемент формы через Элементы.Добавить() с указанием пути к данным.
  6. Загрузим полученные данные в реквизит формы методом ЗначениеВРеквизитФормы().

Посмотрим на программную реализацию:


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

Альтернативные варианты отображения данных

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

  1. Динамический список с произвольным запросом. Если данные выбираются непосредственно из базы без необходимости их интерактивного редактирования и сложной постобработки в коде, рекомендуется использовать объект ДинамическийСписок. Он автоматически оптимизирует запросы, считывает данные порциями при скроллинге и не расходует лишнюю оперативную память клиентского приложения.
  2. Поле табличного документа. Если требуется вывести сложную отчетную форму с произвольным количеством колонок, группировками или цветовым выделением, данные можно вывести в реквизит с типом ТабличныйДокумент с помощью макета или процессора вывода СКД.
← На главную