Программное создание элементов интерфейса в 1С — это мощный инструмент, позволяющий строить гибкие и адаптивные формы. Однако при работе с объектом ДинамическийСписок разработчики часто сталкиваются с неожиданным поведением платформы: список создан, запрос написан, но колонки на форме не отображаются, а метод ПолучитьРеквизиты() возвращает лишь стандартный набор свойств. В этой статье мы подробно разберем, почему так происходит, и как правильно «материализовать» реквизиты программного динамического списка.
При интерактивной разработке в конфигураторе платформа берет на себя огромную часть рутинной работы. Когда вы указываете текст запроса для динамического списка, система автоматически сканирует его и создает подчиненные реквизиты (колонки). Однако при программном добавлении через ИзменитьРеквизиты() вы создаете только «оболочку» — сам объект ДинамическийСписок.
Важный нюанс: поля запроса не становятся реквизитами формы автоматически. Чтобы они появились в структуре формы, их необходимо добавить принудительно. Разберем этот процесс по шагам.
Прежде чем добавлять реквизиты, нам нужно знать, какие именно поля присутствуют в нашем динамическом списке. Если мы используем произвольный запрос, мы не можем полагаться на метаданные основной таблицы. Проанализируем ситуацию: как вытащить список имен и типов полей?
Рассмотрим использование объекта ПостроительЗапроса. Это один из самых быстрых способов получить структуру колонок из текста запроса без его фактического выполнения:
Построитель = Новый ПостроительЗапроса;
Построитель.Текст = ТекстЗапросаДинамическогоСписка;
Построитель.ЗаполнитьНастройки();
// Теперь в Построитель.ВыбранныеПоля у нас есть список колонок
Для Каждого Поле Из Построитель.ВыбранныеПоля Цикл
// Здесь мы можем получить Имя и Тип поля
КонецЦикла;
Также можно использовать объект СхемаЗапроса, если требуется более глубокий анализ сложного запроса с объединениями и вложенными таблицами. Если же у списка задана ОсновнаяТаблица, можно обратиться напрямую к метаданным этой таблицы через Метаданные.НайтиПоПолномуИмени().
После того как мы определили список имен полей, необходимо добавить их в структуру формы. Для этого мы формируем массив объектов РеквизитФормы. Важно правильно указать путь к данным: он должен начинаться с имени самого динамического списка.
Проанализируем пример кода для добавления реквизитов:
ДобавляемыеРеквизиты = Новый Массив;
// Добавляем сам список, если он еще не создан
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("СписокНоменклатуры", Новый ОписаниеТипов("ДинамическийСписок")));
// Добавляем колонки списка
Для Каждого Поле Из ПоляЗапроса Цикл
ПутьКДанным = "СписокНоменклатуры." + Поле.Имя;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Поле.Имя, Поле.ТипЗнч, "СписокНоменклатуры"));
КонецЦикла;
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
Обратите внимание: если вы добавляете колонки к уже существующему на форме реквизиту-списку, третий параметр конструктора РеквизитФормы (путь) должен соответствовать имени родительского реквизита.
Создание реквизитов — это только половина дела. Чтобы пользователь увидел данные, нужно создать элементы управления. Сначала создадим элемент формы типа ТаблицаФормы, а затем вложим в неё элементы типа ПолеФормы.
Выясним, как правильно связать их с данными:
// Создаем таблицу
ТаблицаСписок = Элементы.Добавить("ТаблицаСписок", Тип("ТаблицаФормы"));
ТаблицаСписок.ПутьКДанным = "СписокНоменклатуры";
// Создаем колонки
Для Каждого Поле Из ПоляЗапроса Цикл
ИмяЭлемента = "Колонка_" + Поле.Имя;
НоваяКолонка = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ТаблицаСписок);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "СписокНоменклатуры." + Поле.Имя;
КонецЦикла;
Многие разработчики сталкиваются с тем, что стандартные команды динамического списка (Создать, Найти, Настройка списка) не появляются в командной панели таблицы при ее программном создании. Это известная особенность платформы, начиная с версии 8.3.7.
Выясним причину: платформа не всегда корректно инициализирует состав команд, если структура формы меняется слишком интенсивно «в один присест». Чтобы заставить 1С перерисовать состав команд, можно применить небольшую хитрость, упомянутую опытными разработчиками: выполнение фиктивного изменения состава элементов формы.
Рассмотрим эффективный алгоритм «обновления» формы:
Также убедитесь, что у созданной таблицы установлено свойство ИспользоватьСтандартныеКоманды = Истина, а в самом динамическом списке заполнено свойство ОсновнаяТаблица, если вы ожидаете увидеть команды создания и удаления объектов.
Подведем итог и составим четкий план действий при программном добавлении ДинамическогоСписка:
ПостроительЗапроса или анализа метаданных получаем список полей и их типы.ИзменитьРеквизиты() для создания самого списка и всех его подчиненных колонок.ЭтаФорма.СписокНоменклатуры) и устанавливаем ТекстЗапроса и ОсновнаяТаблица.ТаблицуФормы и связываем её с реквизитом. Добавляем ПоляФормы для каждой колонки.Соблюдение этой последовательности гарантирует, что ваш программно созданный динамический список будет обладать всеми возможностями интерактивного, включая сортировки, отборы и стандартные команды управления данными.