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