Как динамически изменить основную таблицу и текст запроса в динамическом списке?

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

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

Использование встроенных функций БСП

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), например, УТ 11, ERP 2 или КА 2, наиболее правильным и безопасным способом будет использование программного интерфейса общих модулей. Это позволяет избежать ошибок инициализации и корректно передать настройки на сервер.

Рассмотрим пример кода, который позволяет установить основные свойства списка через структуру параметров:


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

// Применяем настройки к элементу формы (таблице)
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка);

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

Прямое управление свойствами объекта «Динамический список»

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


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

Важный нюанс: Свойство ОсновнаяТаблица критически важно для работы стандартных команд формы. Если оно заполнено, кнопки «Создать», «Копировать» и «Изменить» будут автоматически открывать формы соответствующего объекта метаданных. Если же оставить это поле пустым, список превратится в «просмотрщик» без возможности объектного редактирования.

Почему список «исчезает» и как с этим бороться?

Частая проблема: код выполнен без ошибок, но таблица на форме становится пустой. Выясним причину этого поведения. Динамический список на уровне платформы — это источник данных. Элементы формы (колонки таблицы) — это визуализаторы, которые «подписаны» на конкретные пути к данным (например, Список.Наименование).

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

  1. Очистка старых колонок: Перед сменой запроса необходимо удалить старые элементы формы, связанные с этим списком.
  2. Обновление реквизита: Меняем ТекстЗапроса и ОсновнаяТаблица.
  3. Программное создание колонок: Создаем новые элементы формы типа ПолеФормы и привязываем их к новым полям списка.

Посмотрим на пример реализации программного создания колонок:


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

Особенности работы с СКД в динамических списках

В современных версиях платформы динамический список часто инициализируется через Схему компоновки данных (СКД). Если вы используете расширенные настройки или сложные связи, простого изменения ТекстЗапроса может быть недостаточно. В таких случаях нужно работать с компоновщиком настроек.

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

Ограничения и рекомендации

Проанализируем основные ограничения, которые накладывает платформа на динамическое изменение списков:

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

← На главную