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