При разработке отчетов и обработок на обычных формах (толстый клиент) часто возникает задача: выполнить запрос, выгрузить результат в таблицу значений и вывести её в табличное поле на форме. Если среди колонок запроса есть поле логического типа (Булево), разработчики нередко сталкиваются с тем, что вместо привычных интерактивных флажков (чекбоксов) отображаются текстовые надписи «Да» или «Нет», а флажок появляется только при переходе фокуса в ячейку.
Разберем, почему возникает такое поведение, как устроены колонки табличного поля в платформе 1С:Предприятие и как правильно программно настроить отображение флажка.
Рассмотрим типовой сценарий, приводящий к ошибке отображения. Разработчик выгружает результат запроса в таблицу значений и динамически создает колонки в табличном поле:
РезультатЗапроса = Запрос.Выполнить();
Товары = РезультатЗапроса.Выгрузить();
ЭлементыФормы.Товары.СоздатьКолонки();
ЭлементыФормы.Товары.Колонки.Проверка.ДанныеФлажка = "Пометка";
ЭлементыФормы.Товары.Колонки.Проверка.УстановитьЭлементУправления(Тип("Флажок"));
В такой реализации возникают сразу несколько проблем:
СоздатьКолонки() создает колонки табличного поля с именами, совпадающими с именами колонок таблицы значений. Если в запросе колонка называлась Проверка, а в свойство ДанныеФлажка передается несуществующее имя Пометка, связь со строковыми данными теряется.Данные и ДанныеФлажка: при автогенерации колонок свойство Данные колонки заполняется именем поля таблицы значений. Из-за этого платформа выводит текстовое представление значения (строки «Да»/«Нет»). Свойство УстановитьЭлементУправления(Тип("Флажок")) активирует элемент управления только при интерактивном входе в ячейку. Пока ячейка не в фокусе, отображается текст из свойства Данные.Данные без корректной привязки ДанныеФлажка: если просто очистить Данные = "", но при этом имя в ДанныеФлажка указано с опечаткой или не связано с булевым полем источника, значение в пассивном режиме просто пропадает.Разберем по шагам правильный алгоритм настройки табличного поля после загрузки данных.
Булево (значения Истина или Ложь).СоздатьКолонки() у элемента формы.Данные: чтобы убрать вывод текста «Да»/«Нет», строковую привязку необходимо сбросить.ДанныеФлажка: указываем точное имя колонки таблицы значений, содержащей булево значение.Флажок через УстановитьЭлементУправления().Посмотрим на готовый пример кода:
РезультатЗапроса = Запрос.Выполнить();
Товары = РезультатЗапроса.Выгрузить();
// Связываем табличное поле с таблицей значений
ЭлементыФормы.Товары.Значение = Товары;
ЭлементыФормы.Товары.СоздатьКолонки();
// Получаем колонку табличного поля
КолонкаФлажка = ЭлементыФормы.Товары.Колонки.Проверка;
// 1. Очищаем отображение текста ячейки
КолонкаФлажка.Данные = "";
// 2. Связываем флажок с колонкой таблицы значений
КолонкаФлажка.ДанныеФлажка = "Проверка";
// 3. Устанавливаем редактор ячейки
КолонкаФлажка.УстановитьЭлементУправления(Тип("Флажок"));
// 4. Настраиваем мгновенный отклик на клик мыши
КолонкаФлажка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
// 5. Разрешаем редактирование данных
КолонкаФлажка.ТолькоПросмотр = Ложь;
ЭлементыФормы.Товары.ТолькоПросмотр = Ложь;
Важный момент: метод СоздатьКолонки() всегда сбрасывает ручные настройки колонок табличного поля. Поэтому установку свойств Данные, ДанныеФлажка и назначение элемента управления всегда необходимо выполнять строго после его вызова.
Иногда требуется выводить флажок без изменения структуры привязок или в колонке, которой вообще нет в результирующей таблице значений. В этом случае мы можем настроить визуализацию через стандартные события табличного поля: ПриВыводеСтроки и ПриИзмененииФлажка.
Выясним, как это работает на практике. В свойствах колонки табличного поля очищаем свойство Данные и не назначаем элемент управления. Далее в модуле формы определяем обработчик вывода строки:
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Управляем отображением ячейки через оформление
Ячейка = ОформлениеСтроки.Ячейки.Проверка;
Ячейка.ОтображатьТекст = Ложь;
Ячейка.ОтображатьФлажок = Истина;
Ячейка.Флажок = ДанныеСтроки.Проверка;
КонецПроцедуры
Для того чтобы пользователь мог переключать состояние флажка щелчком мыши, используем событие табличного поля ПриИзмененииФлажка:
Процедура ТоварыПриИзмененииФлажка(Элемент, Колонка)
Если Колонка.Имя = "Проверка" Тогда
// Инвертируем текущее булево значение в строке
Элемент.ТекущиеДанные.Проверка = Не Элемент.ТекущиеДанные.Проверка;
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает полный контроль над отрисовкой ячеек и позволяет гибко управлять доступностью флажка в зависимости от других реквизитов строки.