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

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникают задачи, когда структура таблицы значений (ТЗ) заранее неизвестна и должна формироваться динамически. Одной из типичных сложностей в таких сценариях является правильное отображение логических данных (тип Булево) в виде интерактивных флажков. Рассмотрим подробно, как реализовать программное создание таблицы и настроить колонку с флажком так, чтобы она была удобна для пользователя.

Анализ базового алгоритма создания таблицы

Процесс программного вывода таблицы на форму состоит из нескольких критически важных этапов. Разберем их по порядку, опираясь на стандартные механизмы управляемого приложения. Прежде всего, необходимо понимать, что «визуальная таблица» на форме и «данные таблицы» — это разные объекты. Мы должны сначала подготовить структуру данных, а затем связать с ней элементы управления.

Проанализируем основные шаги, которые должны быть выполнены в процедуре:

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

Программная реализация создания колонок

Рассмотрим доработанный пример кода, который позволяет не просто вывести таблицу, но и корректно инициализировать поле флажка. Мы обратим особое внимание на колонку Печатать, которая должна вести себя как интерактивный чекбокс.


&НаСервере
Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений)
    
    // Шаг 1: Проверяем наличие таблицы на форме, если нет - создаем
    ЭлементТаблица = Элементы.Найти(ИмяПоляТаблицыФормы);
    Если ЭлементТаблица = Неопределено Тогда
        ЭлементТаблица = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип("ТаблицаФормы"));
        ЭлементТаблица.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция;
    КонецЕсли;
    
    // Шаг 2: Подготовка к очистке старых колонок
    УдаляемыеРеквизиты = Новый Массив;
    РеквизитыДляУдаления = ПолучитьРеквизиты(ИмяРеквизитаДанныеФормыКоллекция);
    Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
        УдаляемыеРеквизиты.Добавить(ИмяРеквизитаДанныеФормыКоллекция + "." + РеквизитУдаления.Имя);
        
        // Удаляем соответствующий визуальный элемент (колонку)
        ИмяЭлементаКолонки = ИмяПоляТаблицыФормы + РеквизитУдаления.Имя;
        Если Элементы.Найти(ИмяЭлементаКолонки) <> Неопределено Тогда
            Элементы.Удалить(Элементы[ИмяЭлементаКолонки]);
        КонецЕсли;
    КонецЦикла;
    
    // Шаг 3: Добавление новых реквизитов на основе колонок ТЗ
    ДобавляемыеРеквизиты = Новый Массив;
    Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        // Важно: для флажка тип должен быть строго Булево
        ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка.Заголовок));
    КонецЦикла;
    
    // Фиксируем изменения структуры
    ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
    
    // Шаг 4: Визуализация колонок
    Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        ИмяЭлемента = ИмяПоляТаблицыФормы + Колонка.Имя;
        НоваяКолонка = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементТаблица);
        НоваяКолонка.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка.Имя;
        
        // Настройка отображения в зависимости от имени или типа
        Если Колонка.Имя = "Печатать" Тогда
            НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка;
            // Устанавливаем режим редактирования, чтобы флажок менялся за один клик
            НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
        Иначе    
            НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
        КонецЕсли; 
    КонецЦикла;
    
    // Шаг 5: Загрузка данных
    ЗначениеВРеквизитФормы(ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция);      
    
КонецПроцедуры

Тонкости настройки «Поля флажка»

Проанализируем ситуацию, когда установка свойства Вид = ВидПоляФормы.ПолеФлажка не дает ожидаемого результата или флажок выглядит «серым» и недоступным для редактирования. Выясним причины такого поведения и способы их устранения.

1. Режим редактирования колонки. По умолчанию 1С может требовать от пользователя сначала выделить ячейку, а затем еще раз кликнуть для смены состояния флажка. Чтобы работа была комфортной, мы используем свойство РежимРедактированияКолонки.Непосредственно. Это позволяет пользователю менять галочку одним нажатием мыши.

2. Строгое соответствие типов. Если в исходной ТаблицаЗначений колонка имеет составной тип (например, Булево и Число), платформа может проигнорировать установку ПолеФлажка и оставить обычное поле ввода. При программном создании реквизитов через Новый РеквизитФормы старайтесь явно ограничивать тип данных до Булево для таких колонок.

3. Права доступа и только просмотр. Если флажок не активен, проверьте свойство ТолькоПросмотр. Оно может быть установлено как на уровне всей таблицы, так и на уровне конкретного элемента формы. Проанализируем настройки:


НоваяКолонка.ТолькоПросмотр = Ложь;
НоваяКолонка.Доступность = Истина;

Интерактивность и обработка событий

Просто нарисовать флажок недостаточно — часто нам нужно реагировать на его изменение (например, пересчитывать сумму выбранных строк). Поскольку элементы создаются программно, нам нужно также программно назначить им обработчики событий. Выясним, как это сделать с помощью метода УстановитьДействие.

Рассмотрим пример добавления события ПриИзменении:


НоваяКолонка.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииФлажкаПечати");

В модуле формы (обязательно на клиенте) должна существовать соответствующая процедура:


&НаКлиенте
Процедура Подключаемый_ПриИзмененииФлажкаПечати(Элемент)
    // Получаем текущую строку, в которой изменен флажок
    ТекущаяСтрока = Элементы.ИмяВашейТаблицы.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        Сообщить("Состояние печати изменено для строки: " + ТекущаяСтрока.ИмяОбъекта);
    КонецЕсли;
КонецПроцедуры

Работа с метаданными и производительностью

При использовании метода ИзменитьРеквизиты следует помнить, что это достаточно тяжелая операция для сервера, так как она вызывает полную перекомпиляцию контекста формы. Если ваша таблица должна менять состав колонок очень часто, проанализируйте, нельзя ли обойтись фиксированным набором колонок, управляя их видимостью через свойство Видимость.

Однако для задач построения гибких отчетов или пакетной обработки документов, динамическое создание — единственный верный путь. Мы рекомендуем группировать все изменения структуры (удаление и добавление) в один вызов ИзменитьРеквизиты, как показано в нашем примере. Это значительно ускоряет работу формы.

Дополнительные возможности оформления

Чтобы программно созданная таблица выглядела профессионально, можно добавить еще несколько штрихов:

Подводя итог, можно сказать, что программное управление элементами формы — это мощный инструмент. Правильное сочетание настройки типов данных, визуальных свойств (ПолеФлажка) и режимов редактирования позволяет создавать интерфейсы, которые ничем не уступают созданным вручную в конфигураторе, но при этом обладают неограниченной гибкостью.

← На главную