Как отобразить тип документа вместо его представления в ссылочном реквизите

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает специфическая задача: пользователю необходимо видеть в поле ввода не стандартное представление документа (например, «Реализация №1 от 01.01.2023»), а название его типа (например, «Реализация товаров и услуг»). При этом сам реквизит должен сохранять ссылочный тип, чтобы документ мог участвовать в движениях, проводках и других механизмах системы. Рассмотрим подробнее, как реализовать этот функционал, используя возможности управляемых форм и механизмы метаданных.

Метод 1. Использование вспомогательного реквизита формы

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

Во-первых, мы создаем на форме вспомогательный реквизит (например, ИмяТипаДокумента) с типом Строка. Именно это поле мы выводим в интерфейс вместо основного реквизита объекта.

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

  1. ПриЧтенииНаСервере: здесь мы заполняем строковый реквизит при открытии формы, получая синоним типа из метаданных.
  2. ПриИзменении основного реквизита: если значение меняется программно, обновляем строку.
  3. НачалоВыбора вспомогательного реквизита: здесь мы программно вызываем диалог выбора типа или документа.

Рассмотрим пример кода для получения названия типа:


&НаСервере
Процедура ОбновитьОтображениеТипа()
    Если ЗначениеЗаполнено(Объект.СсылкаНаДокумент) Тогда
        ЭтаФорма.ИмяТипаДокумента = Объект.СсылкаНаДокумент.Метаданные().Синоним;
    Иначе
        ЭтаФорма.ИмяТипаДокумента = "";
    КонецЕсли;
КонецПроцедуры

Метод 2. Глобальная подмена через ОбработкаПолученияПредставления

Если бизнес-логика подразумевает, что данный документ всегда и везде должен отображаться как название его типа, мы можем использовать механизм переопределения представления в модуле менеджера объекта. Выясним, как это работает.

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


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Представление = Метаданные().Синоним;
КонецПроцедуры

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

Метод 3. Программное управление списком выбора (ChoiceList)

Для реквизитов составного типа мы можем управлять процессом выбора более тонко. Проанализируем ситуацию: когда пользователь нажимает на кнопку выбора, система сначала предлагает выбрать тип метаданных. Мы можем перехватить этот момент.

Установим у элемента формы свойство ВыбиратьТип в значение Истина. В событии ОбработкаВыбора мы можем получить выбранную пустую ссылку нужного типа. Посмотрим на пример реализации:

Если пользователю достаточно выбрать только тип, а конкретный документ не важен (или он выбирается позже), мы можем записывать в реквизит пустую ссылку выбранного типа. Это позволит сохранить типизацию реквизита, а в поле ввода будет отображаться название типа (стандартное поведение 1С для пустых ссылок).

Метод 4. Использование события «АвтоПодбор» и «ОбработкаВыбора»

Разберем еще один продвинутый способ «обмана» интерфейса. Мы оставляем основной реквизит на форме, но программно манипулируем текстом, который видит пользователь в поле ввода.

В событии ОбработкаВыбора (ChoiceProcessing) мы перехватываем выбранную ссылку и записываем её в реквизит объекта. После этого мы используем свойство элемента формы ОтображениеВыбора или принудительно устанавливаем текст через вспомогательные механизмы.

Однако наиболее стабильным вариантом в среде управляемых форм остается использование события ПриИзменении в связке с методом Метаданные.НайтиПоТипу. Рассмотрим, как правильно получить синоним типа, зная только тип значения:


// Получение синонима типа для любого значения
ТипОбъекта = ТипЗнч(Объект.ИмяРеквизита);
Если ТипОбъекта <> Тип("Неопределено") Тогда
    НазваниеТипа = Метаданные.НайтиПоТипу(ТипОбъекта).Синоним;
КонецЕсли;

Метод 5. Декорации и визуальные трюки (UI Overlay)

Рассмотрим необычный, но эффективный способ для веб-клиента и тонкого клиента. Мы можем разместить надпись (декорацию) поверх поля ввода.

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

Это позволяет сохранить все стандартные кнопки выбора и очистки у поля ввода, при этом визуально скрывая текст ссылки («Реализация №...») и заменяя его «красивым» названием типа.

Резюме и рекомендации

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

Если же задача стоит глобально для всей системы — рассмотрите Метод 2. Но помните, что это может затруднить работу бухгалтеров и аналитиков, так как поиск конкретного документа в журнале станет невозможен по представлению.

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

← На главную