Как в поле ввода 1С отображать представление элемента списка выбора, а не его значение?

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

Рассмотрим частую ситуацию при разработке интерфейсов в 1С: мы программно заполняем список выбора поля управляемой формы, используя метод Элементы.ИмяПоля.СписокВыбора.Добавить(). В этот метод мы передаем два параметра — само значение (например, системный идентификатор или код) и его строковое представление (понятный текст для пользователя). Однако, при выборе нужной строки, список выглядит красиво и показывает представление, но после клика в само поле заносится "голое" значение. Выясним причину такого поведения платформы и подробно разберем по шагам несколько эффективных способов решения этой задачи.

Способ 1: Включение свойства поля "Режим выбора из списка"

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

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

В этом режиме платформа 1С автоматически берет на себя связку "значение – представление". Но здесь есть важный технический нюанс: проанализируем ситуацию с типами данных. Для корректной работы этого механизма необходимо, чтобы тип данных реквизита формы строго совпадал с типом данных самого значения в списке выбора. Если реквизит имеет тип Строка, а в список в качестве значения передано Число, платформа не сможет корректно сопоставить данные, не найдет нужное представление и снова выведет пользователю значение. Всегда следите за типизацией!

Способ 2: Программная подмена в событии "ОбработкаВыбора"

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

Для этого в событии поля ввода ОбработкаВыбора необходимо написать следующий код:


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

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

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

Способ 3: Использование обработчика "ОбработкаПолученияПредставления"

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

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

Однако выясним причину ограничений этого метода: он применим только для ссылочных типов. Если вы заполняете список выбора примитивными типами (строками, числами) или идентификаторами элементов интерфейса, этот механизм вам не поможет, так как для примитивных типов события получения представления просто не существует.

Способ 4: Использование Условного оформления управляемой формы

Проанализируем современный и безопасный подход к решению задачи. Если список значений известен заранее, либо он формируется динамически, но не слишком велик, отличным решением станет механизм "Условное оформление" управляемой формы.

Мы можем программно или через визуальный интерфейс конфигуратора добавить следующие правила для формы:

  1. В "Условии" указываем проверку: если значение нашего реквизита равно конкретному значению из списка.
  2. В "Оформлении" выбираем свойство Текст и указываем нужное нам представление элемента.
  3. В "Оформляемых полях" выбираем наше поле ввода на форме.

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

Способ 5: Архитектурное разделение на визуальный и служебный реквизиты

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

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

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

← На главную