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