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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в конфигурациях на обычных формах (например, в 1С:УПП или 1С:КА 1.1) разработчики нередко сталкиваются с жестким ограничением элемента управления ПолеВвода. Если реквизит имеет ссылочный тип (например, СправочникСсылка.Номенклатура или СправочникСсылка.Контрагенты), платформа по умолчанию выводит в поле его основное представление — чаще всего наименование или код. Однако бизнес-логика часто требует показать пользователю альтернативное поле, например краткое наименование, артикул или внутренний идентификатор, сохранив при этом тип данных в информационной базе.

Разберем детально несколько вариантов реализации данной задачи: от штатных механизмов платформы до обходных интерфейсных решений.

Вариант 1. Использование списка выбора поля ввода (рекомендуемый способ)

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

Разберем по шагам настройку элемента:

  1. В свойствах элемента управления ПолеВвода на форме включим свойства РежимВыбораИзСписка и КнопкаВыбора.
  2. В обработчике формы ПриОткрытии (или при смене данных в поле) сформируем элемент списка выбора, передав в качестве значения ссылку, а в качестве представления — требуемый реквизит.
  3. В обработчике события ОбработкаВыбора поля ввода или самой формы перехватим выбор пользователя и перезаполним представление.

Посмотрим на пример реализации кода в модуле обычной формы:


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

КонецПроцедуры

Процедура ПолеКонтрагентОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    СсылкаНаЭлемент = ВыбранноеЗначение;
    ОбновитьПредставлениеПоля();

КонецПроцедуры

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

Вариант 2. Разделение хранения и отображения через строковый реквизит формы

Проанализируем ситуацию, когда необходимо полностью контролировать форматирование строки и вызывать интерактивный выбор вручную. Если у разработчика возникает вопрос «где хранить значение ссылки», правильный архитектурный ответ заключается в сохранении оригинального реквизита объекта в скрытом виде.

Разберем алгоритм настройки:

  1. Основное поле реквизита объекта скрываем на форме (свойство Видимость = Ложь) либо вовсе не размещаем его как элемент управления.
  2. Добавляем на форму строковый реквизит (например, ПредставлениеОбъектаСтрокой) и связываем с ним отображаемое текстовое ПолеВвода.
  3. У строкового поля включаем отображение кнопки выбора (свойство КнопкаВыбора = Истина).
  4. В событии НачалоВыбора строкового поля программно открываем форму выбора нужного справочника.
  5. В обработчике ОбработкаВыбора формы записываем выбранную ссылку в скрытый реквизит объекта, а сформированную строку — в строковый реквизит формы.

Посмотрим на пример кода в форме:


Процедура ПолеПредставленияНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ФормаВыбора = Справочники.Контрагенты.ПолучитьФормуВыбора(, Элемент);
    ФормаВыбора.РежимВыбора = Истина;
    ФормаВыбора.Открыть();

КонецПроцедуры

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
    
    Если Источник = ЭлементыФормы.ПолеПредставления Тогда
        ЭтотОбъект.Контрагент = ЗначениеВыбора;
        ПредставлениеОбъектаСтрокой = ЗначениеВыбора.КраткоеНаименование;
    КонецЕсли;

КонецПроцедуры

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

Вариант 3. Переопределение представления в модуле менеджера объекта

В платформе 1С:Предприятие 8.3 существует стандартный платформенный механизм переопределения представления ссылок на уровне метаданных. В модуле менеджера справочника можно объявить два обработчика:


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

КонецПроцедуры

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

КонецПроцедуры

Важное ограничение: выясним причину, почему данный метод применим не всегда. В конфигурации 1С:УПП часто установлен режим совместимости с версиями 8.2.13 или 8.2.16. При таком режиме совместимости события ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления платформой игнорируются. Кроме того, этот метод меняет представление ссылки глобально во всей конфигурации (в списках, отчетах и журналах), что не подходит, если альтернативный вид нужен локально в одном документе.

Вариант 4. Наложение полей друг на друга («бутерброд») и его недостатки

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

  1. Проблемы масштабирования (DPI): при изменении масштаба шрифтов операционной системы или открытии формы на экранах с высоким разрешением границы наложенных элементов сдвигаются.
  2. Сбои перерисовки: при быстром сворачивании, разворачивании или перекрытии окон другими приложениями элементы могут мерцать или перекрывать друг друга в неверном порядке z-index.
  3. Нарушение навигации: переход по форме клавишей Tab становится непредсказуемым, так как фокус ввода может попадать на скрытые подложки.

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

← На главную