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

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

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

Шаг 1. Правильная регистрация обработчиков в модуле менеджера

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

Проанализируем правильный алгоритм действий:

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

Шаг 2. Использование аннотации &Вместо

Для событий получения представления в расширениях рекомендуется использовать аннотацию &Вместо. Это связано с тем, что формирование представления — это атомарная операция возврата строки. Если в основной конфигурации эти процедуры отсутствуют, аннотация &Вместо заставит платформу использовать вашу реализацию из расширения как основную.

Рассмотрим пример кода для подготовки полей. Нам крайне важно сообщить платформе, что при формировании ссылки нужно прочитать наш новый реквизит НаименованиеДляОтображения из базы данных:


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

Шаг 3. Реализация алгоритма формирования строки

Теперь проанализируем ситуацию с самой процедурой получения представления. После того как мы добавили поле в список выбираемых, оно станет доступно в параметре Данные. Обратите внимание: крайне не рекомендуется обращаться к данным через точку от ссылки (например, Данные.Ссылка.Наименование), так как это приведет к дополнительному запросу к базе данных для каждой строки списка, что критически замедлит работу системы.

Посмотрим на пример правильной реализации:


&Вместо("ОбработкаПолученияПредставления")
Процедура Расш1_ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
	
	// Устанавливаем СтандартнаяОбработка в Ложь, чтобы система приняла наш результат
	СтандартнаяОбработка = Ложь;
	
	// Проверяем, заполнено ли наше специальное поле
	Если Данные.Свойство("НаименованиеДляОтображения") И ЗначениеЗаполнено(Данные.НаименованиеДляОтображения) Тогда
		Представление = Данные.НаименованиеДляОтображения;
	Иначе
		// Если поле пустое, можем вернуть стандартное наименование, 
		// если оно было добавлено в ОбработкаПолученияПолейПредставления
		Если Данные.Свойство("Наименование") Тогда
			Представление = Данные.Наименование;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

Шаг 4. Настройка безопасного режима расширения

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

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

Что нужно сделать:

  1. Зайдите в меню "Администрирование" — "Печатные формы, отчеты и обработки" — "Расширения" (путь может отличаться в зависимости от конфигурации).
  2. Найдите ваше расширение.
  3. Снимите флажок "Безопасный режим".
  4. Снимите флажок "Защита от опасных действий" (иногда это требуется для корректного применения серверного кода).
  5. Перезапустите сеанс пользователя.

Шаг 5. Кэширование и нюансы платформы

Иногда изменения не видны из-за агрессивного кэширования представлений платформой. 1С сохраняет строковые представления ссылок, чтобы не пересчитывать их постоянно. Если вы изменили код, а в динамическом списке видите старые данные, попробуйте следующее:

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

← На главную