При разработке конфигураций на платформе 1С часто возникает задача изменить стандартное отображение объекта в списках и полях ввода. Типичный пример: вместо простого наименования товара («Стол») пользователь хочет видеть расширенную информацию, включающую артикул или цвет («Стол [Арт. 123, Синий]»). Если такая потребность возникает в рамках одной табличной части документа, мы можем решить её локально, но чаще всего требуется системный подход. В этой статье мы разберем, как правильно переопределить представление объекта во всей системе, сохранив при этом высокую производительность базы данных.
Самый правильный и эффективный способ изменить отображение справочника во всех формах, отчетах и ссылках — это использование специальных обработчиков событий в модуле менеджера этого справочника. Платформа предоставляет нам два ключевых события: ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления. Давайте разберем их работу на примере справочника, где нам нужно вывести строку вида «Наименование + Реквизит1 + Реквизит2».
Для начала нам необходимо определить, какие данные потребуются платформе для формирования строки. Если мы просто укажем текст в представлении, система не будет знать, что ей нужно заранее прочитать из базы данных дополнительные поля (Реквизит1 и Реквизит2). Для этого используется обработчик полей представления.
Рассмотрим пример кода в модуле менеджера:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Отключаем стандартную логику формирования полей (только Код или Наименование)
СтандартнаяОбработка = Ложь;
// Добавляем наши реквизиты в массив полей, которые платформа выберет из БД
Поля.Добавить("Наименование");
Поля.Добавить("Реквизит1");
Поля.Добавить("Реквизит2");
КонецПроцедуры
После того как мы «заказали» нужные поля у системы, мы можем приступить к формированию самой строки в обработчике получения представления. Важно использовать структуру Данные, которая придет в процедуру, так как она уже содержит значения нужных нам реквизитов.
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Отключаем стандартное формирование строки
СтандартнаяОбработка = Ложь;
// Формируем результирующую строку.
// Данные — это структура, ключи которой мы определили в предыдущем обработчике.
Представление = Данные.Наименование + " " + Данные.Реквизит1 + " " + Данные.Реквизит2;
КонецПроцедуры
Проанализируем распространенную ошибку начинающих разработчиков. Часто в коде пишут так: Представление = Данные.Ссылка.Наименование.... На первый взгляд это работает, но такой подход несет в себе огромную угрозу производительности, известную как «проблема N+1».
Когда система выводит динамический список, например, из 100 строк, использование Данные.Ссылка.Реквизит заставит платформу выполнить 100 отдельных микро-запросов к базе данных, чтобы получить значение реквизита для каждого элемента. Если же мы используем ОбработкаПолученияПолейПредставления, платформа сформирует один эффективный SQL-запрос, который сразу выберет все необходимые данные для всех 100 строк. Всегда используйте поля структуры Данные напрямую, без обращения через точку от ссылки.
В реальных задачах данные могут быть не заполнены, и простая склейка строк через «+» может привести к некрасивым результатам (например, лишним пробелам или странным символам). Разберем более продвинутый метод формирования наименования, используя встроенные функции работы со строками СтрШаблон и СтрСоединить.
Допустим, мы формируем наименование банковского счета, где должны присутствовать номер, валюта и вид счета, но только если они заполнены:
// Пример логики формирования внутри ОбработкаПолученияПредставления
Слова = Новый Массив;
Если ЗначениеЗаполнено(Данные.НомерСчета) Тогда
Слова.Добавить(СтрШаблон(НСтр("ru = '№ %1'"), СокрЛП(Данные.НомерСчета)));
КонецЕсли;
Если ЗначениеЗаполнено(Данные.Валюта) Тогда
Слова.Добавить(СтрШаблон(НСтр("ru = 'в %1'"), Строка(Данные.Валюта)));
КонецЕсли;
Если ЗначениеЗаполнено(Данные.ВидСчета) Тогда
Слова.Добавить(СокрЛП(Данные.ВидСчета));
КонецЕсли;
// Объединяем все элементы массива в одну строку через пробел
Представление = СтрСоединить(Слова, " ");
// Если ничего не заполнено, можно вернуть стандартное наименование
Если ПустаяСтрока(Представление) Тогда
Представление = Данные.Наименование;
КонецЕсли;
Использование СтрШаблон делает код более читаемым, а СтрСоединить автоматически решает проблему двойных пробелов, если какой-то из средних элементов отсутствует.
Выясним, как изменение представления влияет на пользовательский опыт. Когда вы переопределяете представление в модуле менеджера, это напрямую отражается на автоподборе. Пользователь при вводе текста в поле справочника будет видеть ваши новые сформированные строки в выпадающем списке. Однако стоит помнить следующее:
Рассмотрим ситуацию, когда заказчик просит изменить отображение справочника только в одном конкретном документе, сохранив стандартный вид во всей остальной программе. В этом случае использовать модуль менеджера нельзя. Вместо этого проанализируем другие варианты:
ПутьКДанным нельзя будет указать реквизит справочника напрямую. Вместо этого нужно формировать текст в событии ПриПолученииДанныхНаСервере или через обработку события ПриАктивизацииСтроки (хотя это менее эффективно).Подводя итог, можно сказать, что использование обработчиков ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления является «золотым стандартом» разработки на платформе 1С 8.3. Это позволяет централизованно управлять отображением данных, гарантирует единство интерфейса и обеспечивает максимальное быстродействие системы при работе с большими объемами данных.