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