Как настроить кастомное представление ссылочного поля в динамическом списке?

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

При разработке на управляемых формах 1С часто возникает задача: отобразить в динамическом списке данные ссылочного типа не в стандартном виде (представление объекта), а в специализированном формате. Например, нам нужно не просто вывести ссылку на документ, а отобразить строку вида «Заявка №... от ...», объединив несколько реквизитов объекта. Разберем, как решить эту задачу различными методами.

Метод 1: Использование обработчика «ПриПолученииДанныхНаСервере»

Это самый популярный способ динамической подмены текста в ячейке. Суть метода заключается в перехвате процесса формирования списка и программной модификации оформления конкретных ячеек.

Для реализации этого подхода выполним следующие шаги:

  1. В свойствах динамического списка укажем обработчик события ПриПолученииДанныхНаСервере.
  2. Для полей, которые мы хотим использовать в составе представления (например, номер или дата документа), установим флаг Использовать всегда в запросе динамического списка. Это гарантирует, что данные будут переданы на сервер для обработки, даже если они не выведены в колонки списка.
  3. В модуле формы напишем логику подмены текста через свойство Оформление.

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


&НаСервереБезКонтекста
Процедура ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    Для Каждого СтрокаСписка Из Строки Цикл 
        // Обращаемся к коллекции оформления нужного поля
        // Используем данные, которые мы предварительно включили в запрос
        ТекстПредставления = "Заявка " + СтрокаСписка.Значение.Данные.ЗаявкаНомер + 
                              " от " + Формат(СтрокаСписка.Значение.Данные.ЗаявкаДата, "ДФ=dd.MM.yy");
        
        СтрокаСписка.Значение.Оформление["ЗаявкаПриОтправке"].УстановитьЗначениеПараметра("Текст", ТекстПредставления);
    КонецЦикла;
КонецПроцедуры

Важное замечание: При использовании этого метода необходимо учитывать производительность. Если список содержит десятки тысяч строк, тяжелые вычисления внутри цикла могут замедлить работу интерфейса при прокрутке.

Метод 2: Формирование представления на уровне запроса

Если логика формирования представления простая и не требует обращения к сложным функциям, лучше всего перенести вычисления на уровень СУБД. Это позволяет разгрузить сервер 1С и повысить скорость отображения данных.

В тексте запроса динамического списка мы можем использовать функцию КОНТАКТНАЯИНФОРМАЦИЯ или простое конкатенирование строк:


ВЫБРАТЬ
    Док.Ссылка КАК Ссылка,
    "Заявка " + Док.Номер + " от " + ДОБАВИТЬКСТРОКЕ(Док.Дата, "ДФ=dd.MM.yy") КАК ПредставлениеЗаявки
ИЗ
    Документ.Заявка КАК Док

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

Метод 3: Использование условного оформления

В некоторых случаях достаточно воспользоваться механизмом УсловноеОформление. В настройках списка мы можем создать правило, где для нужного поля установим параметр Текст.

Этот метод удобен тем, что он декларативный. Однако он имеет ограничения: через него сложно реализовать динамическое склеивание нескольких полей, если они меняются в зависимости от сложных условий бизнес-логики. Тем не менее, для простых замен текста — это отличный инструмент.

Метод 4: Обработка получения представления (Подписка на событие)

Если вам нужно, чтобы представление объекта было кастомным во всей системе (в отчетах, в полях ввода, в списках), правильным архитектурным подходом будет использование подписки на событие ОбработкаПолученияПредставления.

Разберем плюсы этого метода:

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

Заключение: что выбрать?

При выборе метода ориентируйтесь на следующие критерии:

  1. Если нужно простое представление и производительность в приоритете — используйте вычисляемые поля в запросе.
  2. Если представление зависит от сложной логики, которую нельзя реализовать в запросе — используйте ПриПолученииДанныхНаСервере.
  3. Если кастомное отображение объекта требуется во всей конфигурации — используйте ОбработкаПолученияПредставления.

Не забывайте всегда включать поля, участвующие в представлении, в запрос списка с установленным флагом Использовать всегда, чтобы избежать лишних обращений к базе данных!

← На главную