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