Как отобразить флажок в колонке табличного поля после выгрузки результата запроса?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок на обычных формах (толстый клиент) часто возникает задача: выполнить запрос, выгрузить результат в таблицу значений и вывести её в табличное поле на форме. Если среди колонок запроса есть поле логического типа (Булево), разработчики нередко сталкиваются с тем, что вместо привычных интерактивных флажков (чекбоксов) отображаются текстовые надписи «Да» или «Нет», а флажок появляется только при переходе фокуса в ячейку.

Разберем, почему возникает такое поведение, как устроены колонки табличного поля в платформе 1С:Предприятие и как правильно программно настроить отображение флажка.

Анализ проблемы: почему отображается текст вместо флажка

Рассмотрим типовой сценарий, приводящий к ошибке отображения. Разработчик выгружает результат запроса в таблицу значений и динамически создает колонки в табличном поле:


РезультатЗапроса = Запрос.Выполнить();
Товары = РезультатЗапроса.Выгрузить();

ЭлементыФормы.Товары.СоздатьКолонки();
ЭлементыФормы.Товары.Колонки.Проверка.ДанныеФлажка = "Пометка";
ЭлементыФормы.Товары.Колонки.Проверка.УстановитьЭлементУправления(Тип("Флажок"));

В такой реализации возникают сразу несколько проблем:

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

Пошаговое решение: программная настройка колонки

Разберем по шагам правильный алгоритм настройки табличного поля после загрузки данных.

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

Посмотрим на готовый пример кода:


РезультатЗапроса = Запрос.Выполнить();
Товары = РезультатЗапроса.Выгрузить();

// Связываем табличное поле с таблицей значений
ЭлементыФормы.Товары.Значение = Товары;
ЭлементыФормы.Товары.СоздатьКолонки();

// Получаем колонку табличного поля
КолонкаФлажка = ЭлементыФормы.Товары.Колонки.Проверка;

// 1. Очищаем отображение текста ячейки
КолонкаФлажка.Данные = "";

// 2. Связываем флажок с колонкой таблицы значений
КолонкаФлажка.ДанныеФлажка = "Проверка";

// 3. Устанавливаем редактор ячейки
КолонкаФлажка.УстановитьЭлементУправления(Тип("Флажок"));

// 4. Настраиваем мгновенный отклик на клик мыши
КолонкаФлажка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;

// 5. Разрешаем редактирование данных
КолонкаФлажка.ТолькоПросмотр = Ложь;
ЭлементыФормы.Товары.ТолькоПросмотр = Ложь;

Важный момент: метод СоздатьКолонки() всегда сбрасывает ручные настройки колонок табличного поля. Поэтому установку свойств Данные, ДанныеФлажка и назначение элемента управления всегда необходимо выполнять строго после его вызова.

Альтернативное решение: вывод флажка через события оформления

Иногда требуется выводить флажок без изменения структуры привязок или в колонке, которой вообще нет в результирующей таблице значений. В этом случае мы можем настроить визуализацию через стандартные события табличного поля: ПриВыводеСтроки и ПриИзмененииФлажка.

Выясним, как это работает на практике. В свойствах колонки табличного поля очищаем свойство Данные и не назначаем элемент управления. Далее в модуле формы определяем обработчик вывода строки:


Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Управляем отображением ячейки через оформление
    Ячейка = ОформлениеСтроки.Ячейки.Проверка;
    Ячейка.ОтображатьТекст = Ложь;
    Ячейка.ОтображатьФлажок = Истина;
    Ячейка.Флажок = ДанныеСтроки.Проверка;
КонецПроцедуры

Для того чтобы пользователь мог переключать состояние флажка щелчком мыши, используем событие табличного поля ПриИзмененииФлажка:


Процедура ТоварыПриИзмененииФлажка(Элемент, Колонка)
    Если Колонка.Имя = "Проверка" Тогда
        // Инвертируем текущее булево значение в строке
        Элемент.ТекущиеДанные.Проверка = Не Элемент.ТекущиеДанные.Проверка;
    КонецЕсли;
КонецПроцедуры

Такой подход обеспечивает полный контроль над отрисовкой ячеек и позволяет гибко управлять доступностью флажка в зависимости от других реквизитов строки.

← На главную