При разработке расширений часто возникает задача изменить стандартное отображение объектов (справочников, документов) в интерфейсе. Например, вы добавили в расширение новый реквизит НаименованиеДляОтображения и хотите, чтобы именно он выводился в полях ввода, заголовках форм и списках вместо стандартного наименования. Однако программисты часто сталкиваются с ситуацией, когда добавленные в модуль менеджера расширения процедуры ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления просто игнорируются системой. Разберем пошагово, как правильно настроить этот механизм и какие нюансы платформы 1С следует учитывать.
Первая и самая распространенная ошибка — создание процедур вручную простым написанием текста кода. В отличие от обычных процедур, обработчики событий должны быть "зарегистрированы" платформой как перехватчики. Даже если вы используете аннотацию &Вместо, платформа может не вызвать метод, если он не связан с событием метаданных.
Проанализируем правильный алгоритм действий:
ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления.Для событий получения представления в расширениях рекомендуется использовать аннотацию &Вместо. Это связано с тем, что формирование представления — это атомарная операция возврата строки. Если в основной конфигурации эти процедуры отсутствуют, аннотация &Вместо заставит платформу использовать вашу реализацию из расширения как основную.
Рассмотрим пример кода для подготовки полей. Нам крайне важно сообщить платформе, что при формировании ссылки нужно прочитать наш новый реквизит НаименованиеДляОтображения из базы данных:
&Вместо("ОбработкаПолученияПолейПредставления")
Процедура Расш1_ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Добавляем наш реквизит в массив полей, которые будут прочитаны платформой
Поля.Добавить("НаименованиеДляОтображения");
// Отключаем стандартную логику, чтобы платформа учла наш массив полей
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Теперь проанализируем ситуацию с самой процедурой получения представления. После того как мы добавили поле в список выбираемых, оно станет доступно в параметре Данные. Обратите внимание: крайне не рекомендуется обращаться к данным через точку от ссылки (например, Данные.Ссылка.Наименование), так как это приведет к дополнительному запросу к базе данных для каждой строки списка, что критически замедлит работу системы.
Посмотрим на пример правильной реализации:
&Вместо("ОбработкаПолученияПредставления")
Процедура Расш1_ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Устанавливаем СтандартнаяОбработка в Ложь, чтобы система приняла наш результат
СтандартнаяОбработка = Ложь;
// Проверяем, заполнено ли наше специальное поле
Если Данные.Свойство("НаименованиеДляОтображения") И ЗначениеЗаполнено(Данные.НаименованиеДляОтображения) Тогда
Представление = Данные.НаименованиеДляОтображения;
Иначе
// Если поле пустое, можем вернуть стандартное наименование,
// если оно было добавлено в ОбработкаПолученияПолейПредставления
Если Данные.Свойство("Наименование") Тогда
Представление = Данные.Наименование;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если вы выполнили все действия выше, но процедуры всё равно не срабатывают, причина может крыться в настройках самого расширения в режиме "1С:Предприятие". Выясним, как на это влияет Безопасный режим.
Согласно документации и опыту разработчиков, если расширение подключено с установленным флажком "Безопасный режим", то серверные процедуры модулей менеджеров и объектов в расширении могут игнорироваться платформой в целях безопасности. Это часто случается в файловых версиях или при отсутствии настроенных профилей безопасности в кластере.
Что нужно сделать:
Иногда изменения не видны из-за агрессивного кэширования представлений платформой. 1С сохраняет строковые представления ссылок, чтобы не пересчитывать их постоянно. Если вы изменили код, а в динамическом списке видите старые данные, попробуйте следующее:
Важный момент: если вы работаете с динамическим списком, убедитесь, что в его запросе не переопределено поле представления и не используются специфические настройки, которые могут подавлять стандартную генерацию представления ссылки. В большинстве случаев правильная связка двух процедур и отключение безопасного режима решают проблему полностью.