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