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