Как программно модифицировать запрос динамического списка, если основная таблица задана жестко?

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

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

Шаг 1: Переключение динамического списка в режим произвольного запроса

Первым делом нам нужно разрешить платформе использовать наш собственный текст запроса вместо стандартного. Для этого в событии ПриСозданииНаСервере формы (или расширения формы) необходимо программно включить флаг ПроизвольныйЗапрос.

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


РеквизитДС = ЭтотОбъект.ДС;
РеквизитДС.ПроизвольныйЗапрос = Истина;
РеквизитДС.ТекстЗапроса = "ВЫБРАТЬ * ИЗ " + РеквизитДС.ОсновнаяТаблица;

После выполнения этих строк динамический список станет доступен для полноценной модификации через объект СхемаЗапроса.

Шаг 2: Модификация запроса с помощью СхемаЗапроса

Использование СхемаЗапроса — это наиболее профессиональный и компактный метод. Он позволяет изменять структуру запроса, не вникая в глубокий парсинг строк. Рассмотрим универсальную процедуру для добавления связей в существующий запрос:


Процедура МодификацияЗапросаСписка(Форма, ИмяСписок) Экспорт
    ТекстЗапроса = Форма[ИмяСписок].ТекстЗапроса;
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
    
    Пакет = СхемаЗапроса.ПакетЗапросов[0];
    Оператор = Пакет.Операторы[0];
    
    ОсновнойИсточник = Оператор.Источники[0];
    НовыйИсточник = Оператор.Источники.Добавить("РегистрСведений.РазрешениеНаРедактирование", "РазрешениеНаРедактирование");
    
    ОсновнойИсточникПсевдоним = ОсновнойИсточник.Источник.Псевдоним;
    НовыйИсточник.Соединения.Добавить(ОсновнойИсточник, ОсновнойИсточникПсевдоним + ".Ссылка = РазрешениеНаРедактирование.Ссылка");
    
    // Настраиваем тип соединения
    Для Каждого стрСоед из НовыйИсточник.Соединения Цикл
        стрСоед.ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
    КонецЦикла;
    
    // Добавляем вычисляемое поле
    Оператор.ВыбираемыеПоля.Добавить("ВЫБОР КОГДА РазрешениеНаРедактирование.Ссылка ЕСТЬ NULL ТОГДА ЛОЖЬ ИНАЧЕ РазрешениеНаРедактирование.Редактирование КОНЕЦ");
    Пакет.Колонки[Пакет.Колонки.Количество() - 1].Псевдоним = "Редактирование";
    
    Форма[ИмяСписок].ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
КонецПроцедуры

Шаг 3: Настройка обработчиков событий для новых полей

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

В расширении формы после создания выполните следующую настройку:


// В модуле формы расширения
&После("ПриСозданииНаСервере")
Процедура МояПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЭтаФорма.Элементы.Список.УстановитьДействие("Выбор", "СписокВыбор");
КонецПроцедуры

// Обработчик события
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Реализуйте здесь свою логику обработки двойного клика
КонецПроцедуры

Важные рекомендации при работе с динамическими списками

  1. Не теряйте стандартные параметры: При формировании ТекстЗапроса убедитесь, что вы не удалили автоматические параметры, такие как &Период или параметры отборов, иначе стандартная панель отборов перестанет работать.
  2. Журналы документов: При работе с журналами документов будьте крайне осторожны. Журнал — это сложная структура данных. Любое изменение запроса должно сохранять поля, которые определяют тип документа, иначе двойной клик по строке списка не откроет нужную форму документа.
  3. Соблюдайте псевдонимы: Если вы меняете запрос, следите, чтобы псевдонимы ключевых полей (например, Ссылка, Дата) соответствовали тем, что ожидают элементы управления на форме. В противном случае вам придется вручную перенастраивать привязку колонок.
  4. Альтернатива манипуляции текстом: Если задача сводится только к отбору, попробуйте использовать КомпоновщикНастроек динамического списка. Это более «чистый» программный способ, который позволяет добавлять условия отбора без риска сломать логику формирования запроса платформой.

Использование описанного подхода позволяет сделать изменения в типовых конфигурациях максимально компактными и безопасными для обновлений, так как вся логика инкапсулирована в расширении.

← На главную