Как изменить отображение наименования справочника на строку из нескольких реквизитов в 1С?

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

При разработке конфигураций на платформе 1С часто возникает задача изменить стандартное отображение объекта в списках и полях ввода. Типичный пример: вместо простого наименования товара («Стол») пользователь хочет видеть расширенную информацию, включающую артикул или цвет («Стол [Арт. 123, Синий]»). Если такая потребность возникает в рамках одной табличной части документа, мы можем решить её локально, но чаще всего требуется системный подход. В этой статье мы разберем, как правильно переопределить представление объекта во всей системе, сохранив при этом высокую производительность базы данных.

Глобальное изменение через модуль менеджера

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

Для начала нам необходимо определить, какие данные потребуются платформе для формирования строки. Если мы просто укажем текст в представлении, система не будет знать, что ей нужно заранее прочитать из базы данных дополнительные поля (Реквизит1 и Реквизит2). Для этого используется обработчик полей представления.

Рассмотрим пример кода в модуле менеджера:


Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
    
    // Отключаем стандартную логику формирования полей (только Код или Наименование)
    СтандартнаяОбработка = Ложь;
    
    // Добавляем наши реквизиты в массив полей, которые платформа выберет из БД
    Поля.Добавить("Наименование");
    Поля.Добавить("Реквизит1");
    Поля.Добавить("Реквизит2");
    
КонецПроцедуры

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


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    // Отключаем стандартное формирование строки
    СтандартнаяОбработка = Ложь;
    
    // Формируем результирующую строку. 
    // Данные — это структура, ключи которой мы определили в предыдущем обработчике.
    Представление = Данные.Наименование + " " + Данные.Реквизит1 + " " + Данные.Реквизит2;
    
КонецПроцедуры

Почему важно избегать обращения к ссылке?

Проанализируем распространенную ошибку начинающих разработчиков. Часто в коде пишут так: Представление = Данные.Ссылка.Наименование.... На первый взгляд это работает, но такой подход несет в себе огромную угрозу производительности, известную как «проблема N+1».

Когда система выводит динамический список, например, из 100 строк, использование Данные.Ссылка.Реквизит заставит платформу выполнить 100 отдельных микро-запросов к базе данных, чтобы получить значение реквизита для каждого элемента. Если же мы используем ОбработкаПолученияПолейПредставления, платформа сформирует один эффективный SQL-запрос, который сразу выберет все необходимые данные для всех 100 строк. Всегда используйте поля структуры Данные напрямую, без обращения через точку от ссылки.

Сложное форматирование и проверка заполнения

В реальных задачах данные могут быть не заполнены, и простая склейка строк через «+» может привести к некрасивым результатам (например, лишним пробелам или странным символам). Разберем более продвинутый метод формирования наименования, используя встроенные функции работы со строками СтрШаблон и СтрСоединить.

Допустим, мы формируем наименование банковского счета, где должны присутствовать номер, валюта и вид счета, но только если они заполнены:


// Пример логики формирования внутри ОбработкаПолученияПредставления
Слова = Новый Массив;

Если ЗначениеЗаполнено(Данные.НомерСчета) Тогда
    Слова.Добавить(СтрШаблон(НСтр("ru = '№ %1'"), СокрЛП(Данные.НомерСчета)));
КонецЕсли;

Если ЗначениеЗаполнено(Данные.Валюта) Тогда
    Слова.Добавить(СтрШаблон(НСтр("ru = 'в %1'"), Строка(Данные.Валюта)));
КонецЕсли;

Если ЗначениеЗаполнено(Данные.ВидСчета) Тогда
    Слова.Добавить(СокрЛП(Данные.ВидСчета));
КонецЕсли;

// Объединяем все элементы массива в одну строку через пробел
Представление = СтрСоединить(Слова, " ");

// Если ничего не заполнено, можно вернуть стандартное наименование
Если ПустаяСтрока(Представление) Тогда
    Представление = Данные.Наименование;
КонецЕсли;

Использование СтрШаблон делает код более читаемым, а СтрСоединить автоматически решает проблему двойных пробелов, если какой-то из средних элементов отсутствует.

Влияние на поиск и выбор объектов

Выясним, как изменение представления влияет на пользовательский опыт. Когда вы переопределяете представление в модуле менеджера, это напрямую отражается на автоподборе. Пользователь при вводе текста в поле справочника будет видеть ваши новые сформированные строки в выпадающем списке. Однако стоит помнить следующее:

  1. Поиск: По умолчанию поиск в поле ввода ведется по полям, указанным в свойстве справочника «Ввод по строке» (обычно это Код и Наименование). Если вы добавили «Реквизит1» в представление, но не добавили его в «Ввод по строке», пользователь будет видеть этот реквизит в списке, но не сможет найти объект, просто начав печатать значение этого реквизита.
  2. Отчеты (СКД): Система компоновки данных при выводе полей типа «Ссылка» также будет использовать ваше новое представление. Это очень удобно для создания информативных отчетов без настройки каждого отдельного поля.
  3. Сортировка: Сортировка в списках по-прежнему будет происходить по основному реквизиту (Наименованию), если пользователь не выберет иное. Визуальный порядок строк может не совпадать с алфавитным порядком сформированных представлений.

Альтернатива: Локальное изменение в конкретной форме

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

  1. Добавление вычисляемой колонки в Табличную Часть: На форме документа в элемент «Таблица» можно добавить новую колонку. В её свойстве ПутьКДанным нельзя будет указать реквизит справочника напрямую. Вместо этого нужно формировать текст в событии ПриПолученииДанныхНаСервере или через обработку события ПриАктивизацииСтроки (хотя это менее эффективно).
  2. Использование события «ОбработкаВыбора»: Можно перехватывать выбор объекта и записывать расширенное наименование в отдельный текстовый реквизит табличной части, предназначенный исключительно для визуализации.

Подводя итог, можно сказать, что использование обработчиков ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления является «золотым стандартом» разработки на платформе 1С 8.3. Это позволяет централизованно управлять отображением данных, гарантирует единство интерфейса и обеспечивает максимальное быстродействие системы при работе с большими объемами данных.

← На главную