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