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