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