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