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