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