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