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

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

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

Понимание механизма «материализации» реквизитов

При интерактивной разработке в конфигураторе платформа берет на себя огромную часть рутинной работы. Когда вы указываете текст запроса для динамического списка, система автоматически сканирует его и создает подчиненные реквизиты (колонки). Однако при программном добавлении через ИзменитьРеквизиты() вы создаете только «оболочку» — сам объект ДинамическийСписок.

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

Шаг 1. Получение состава полей запроса

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

Рассмотрим использование объекта ПостроительЗапроса. Это один из самых быстрых способов получить структуру колонок из текста запроса без его фактического выполнения:


Построитель = Новый ПостроительЗапроса;
Построитель.Текст = ТекстЗапросаДинамическогоСписка;
Построитель.ЗаполнитьНастройки();

// Теперь в Построитель.ВыбранныеПоля у нас есть список колонок
Для Каждого Поле Из Построитель.ВыбранныеПоля Цикл
    // Здесь мы можем получить Имя и Тип поля
КонецЦикла;

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

Шаг 2. Добавление реквизитов на форму

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

Проанализируем пример кода для добавления реквизитов:


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

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

ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Обратите внимание: если вы добавляете колонки к уже существующему на форме реквизиту-списку, третий параметр конструктора РеквизитФормы (путь) должен соответствовать имени родительского реквизита.

Шаг 3. Создание визуальных элементов (Таблицы и Полей)

Создание реквизитов — это только половина дела. Чтобы пользователь увидел данные, нужно создать элементы управления. Сначала создадим элемент формы типа ТаблицаФормы, а затем вложим в неё элементы типа ПолеФормы.

Выясним, как правильно связать их с данными:


// Создаем таблицу
ТаблицаСписок = Элементы.Добавить("ТаблицаСписок", Тип("ТаблицаФормы"));
ТаблицаСписок.ПутьКДанным = "СписокНоменклатуры";

// Создаем колонки
Для Каждого Поле Из ПоляЗапроса Цикл
    ИмяЭлемента = "Колонка_" + Поле.Имя;
    НоваяКолонка = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ТаблицаСписок);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.ПутьКДанным = "СписокНоменклатуры." + Поле.Имя;
КонецЦикла;

Шаг 4. Решение проблемы с командной панелью

Многие разработчики сталкиваются с тем, что стандартные команды динамического списка (Создать, Найти, Настройка списка) не появляются в командной панели таблицы при ее программном создании. Это известная особенность платформы, начиная с версии 8.3.7.

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

Рассмотрим эффективный алгоритм «обновления» формы:

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

Также убедитесь, что у созданной таблицы установлено свойство ИспользоватьСтандартныеКоманды = Истина, а в самом динамическом списке заполнено свойство ОсновнаяТаблица, если вы ожидаете увидеть команды создания и удаления объектов.

Итоговый порядок действий

Подведем итог и составим четкий план действий при программном добавлении ДинамическогоСписка:

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

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

← На главную