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