Флажок в таблице формы 1С: колонка, код, выделенные строки и события
Содержание
Чтобы в табличном поле 1С установить флажок программно, меняйте не элемент формы, а данные строки: Элементы.Товары.ТекущиеДанные.Пометка = Истина для текущей строки или СтрокаТаблицы.Пометка = Истина в цикле по коллекции. Флажок в колонке — это всего лишь отображение реквизита типа Булево. Поменяли значение реквизита — платформа сама перерисует галочку.
Типичная боль выглядит так: в форме есть колонка с галочками, нужна кнопка «Отметить всё» или автоматическая отметка по условию, а код то падает с ошибкой, то ничего не меняет, то отметки пропадают после записи. Ниже — рабочие варианты кода для управляемых форм 8.3 и отдельно для обычных форм, плюс разбор ошибок, на которых спотыкаются чаще всего.
Откуда берётся флажок в таблице: реквизит и элемент
У любой галочки в таблице две стороны.
- 🗂 Данные. Колонка коллекции с типом
Булево. Это может быть реквизит табличной части документа (Объект.Товары.Пометка), колонка реквизита формы типаТаблицаЗначенийилиДеревоЗначений, пометка элементаСписокЗначений. - 🖼 Элемент формы. Поле в таблице формы с видом
Поле флажка. Оно связано с данными через свойствоПутьКДанным, напримерОбъект.Товары.Пометка.
Отсюда главное правило: код меняет данные, а не элемент. У поля флажка нет свойства «Значение», которое можно присвоить. Галочка появится, когда в строке коллекции окажется Истина.
Как добавить колонку-флажок в управляемую форму:
- В конфигураторе откройте форму, на вкладке
Реквизитыраскройте таблицу (например,Объект → Товары). - Если нужной колонки нет, добавьте её. Для реквизита формы типа
ТаблицаЗначений— кнопкой добавления колонки прямо в дереве реквизитов. Для табличной части документа — реквизитом табличной части в дереве метаданных. Тип —Булево. - Перетащите колонку в дерево элементов внутрь таблицы формы.
- В свойствах нового поля проверьте
Вид=Поле флажка. Для булевых колонок платформа обычно выставляет его сама.
Для колонки-галочки удобно отключить заголовок поля или сделать его коротким, а ширину поставить минимальной. Тогда колонка не будет занимать полэкрана.
Как установить флажок программно: три типовые ситуации
Выбор кода зависит от того, какие строки надо отметить: текущую, конкретную или найденную по условию.
Флажок в текущей строке
Текущая строка доступна через свойство таблицы формы ТекущиеДанные. Это данные именно той строки, на которой стоит курсор.
&НаКлиенте
Процедура ОтметитьТекущую(Команда)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат; // в таблице нет ни одной строки или курсор не установлен
КонецЕсли;
ТекущиеДанные.Пометка = Не ТекущиеДанные.Пометка; // переключить флажок
Модифицированность = Истина;
КонецПроцедуры
Проверка на Неопределено обязательна. Без неё на пустой таблице код упадёт.
Флажок в строке по номеру или по условию
Строки коллекции перебираются обычным циклом. Индексы начинаются с нуля: первая строка — Объект.Товары[0].
&НаКлиенте
Процедура ОтметитьБезЦены(Команда)
Для Каждого Строка Из Объект.Товары Цикл
Строка.Пометка = (Строка.Цена = 0);
КонецЦикла;
Модифицированность = Истина;
КонецПроцедуры
Запись Строка.Пометка = (Строка.Цена = 0) и ставит, и снимает флажки за один проход: строка без цены получает Истина, остальные — Ложь.
Флажок в элементе списка значений
У СписокЗначений пометка — встроенное свойство элемента, отдельную колонку создавать не нужно:
Для Каждого ЭлементСписка Из СписокВидов Цикл
ЭлементСписка.Пометка = Истина;
КонецЦикла;
В форме для такого списка включают отображение пометок у таблицы — и галочки появляются слева от значений.
Массовая отметка строк и работа с выделенными
Две частые задачи: «отметить всё / снять всё» и «отметить только то, что пользователь выделил мышью».
Отметить или снять все флажки
На клиенте хватает цикла из предыдущего раздела. Если строк много (тысячи) или отметка зависит от данных базы, выгоднее один вызов сервера:
&НаСервере
Процедура УстановитьПометкиНаСервере(Значение)
Таблица = РеквизитФормыВЗначение("ТаблицаДанных");
Таблица.ЗаполнитьЗначения(Значение, "Пометка");
ЗначениеВРеквизитФормы(Таблица, "ТаблицаДанных");
КонецПроцедуры
&НаКлиенте
Процедура ОтметитьВсе(Команда)
УстановитьПометкиНаСервере(Истина);
Модифицированность = Истина;
КонецПроцедуры
Здесь ТаблицаДанных — реквизит формы типа ТаблицаЗначений. Метод ЗаполнитьЗначения заполняет колонку одним значением без цикла. Для табличной части документа вместо "ТаблицаДанных" передают "Объект", получают объект документа и работают с его табличной частью, затем возвращают объект обратно через ЗначениеВРеквизитФормы.
Без обратного ЗначениеВРеквизитФормы изменения останутся в локальной копии на сервере, и форма их не увидит.
Инвертировать отметки
Команда «Инвертировать» полезна, когда отметить надо почти всё, кроме пары строк. Пользователь отмечает исключения, затем нажимает одну кнопку:
&НаКлиенте
Процедура ИнвертироватьОтметки(Команда)
Для Каждого Строка Из Объект.Товары Цикл
Строка.Пометка = Не Строка.Пометка;
КонецЦикла;
Модифицированность = Истина;
КонецПроцедуры
Такую команду ставят в командную панель таблицы рядом с «Отметить все» и «Снять все». Три кнопки закрывают почти все сценарии ручного отбора строк.
Отметить выделенные строки
Свойство ВыделенныеСтроки таблицы формы возвращает массив идентификаторов выделенных строк. По идентификатору строку находят методом НайтиПоИдентификатору:
&НаКлиенте
Процедура ОтметитьВыделенные(Команда)
Для Каждого Идентификатор Из Элементы.Товары.ВыделенныеСтроки Цикл
Строка = Объект.Товары.НайтиПоИдентификатору(Идентификатор);
Если Строка <> Неопределено Тогда
Строка.Пометка = Истина;
КонецЕсли;
КонецЦикла;
Модифицированность = Истина;
КонецПроцедуры
Чтобы пользователь вообще мог выделить несколько строк
, у таблицы формы должен стоять РежимВыделения = Множественный.
Сравнение способов:
| Способ | Когда подходит | На что смотреть |
|---|---|---|
ТекущиеДанные | Одна строка под курсором | Проверка на Неопределено |
| Цикл на клиенте | До нескольких сотен строк, условие по данным строки | Не вызывать сервер внутри цикла |
ЗаполнитьЗначения на сервере | Тысячи строк, условие по данным базы | Вернуть таблицу через ЗначениеВРеквизитФормы |
ВыделенныеСтроки | Отметка выделенного мышью | РежимВыделения = Множественный |
События флажка и пересчёт формы после отметки
Когда пользователь щёлкает по галочке, срабатывает событие ПриИзменении поля флажка. Обработчик создают в свойствах поля, на вкладке событий. Имя по умолчанию составляется из имени элемента: ТоварыПометкаПриИзменении.
&НаКлиенте
Процедура ТоварыПометкаПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПересчитатьИтогПоОтмеченным();
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьИтогПоОтмеченным()
СуммаОтмеченных = 0;
Для Каждого Строка Из Объект.Товары Цикл
Если Строка.Пометка Тогда
СуммаОтмеченных = СуммаОтмеченных + Строка.Сумма;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
СуммаОтмеченных — реквизит формы типа Число, выведенный в подвал или над таблицей.
Программная установка флажка событие ПриИзменении не вызывает. Это поведение платформы, а не ошибка. Если после кнопки «Отметить всё» должен пересчитаться итог, вызовите ту же процедуру явно:
&НаКлиенте
Процедура ОтметитьВсе(Команда)
УстановитьПометкиНаСервере(Истина);
ПересчитатьИтогПоОтмеченным();
Модифицированность = Истина;
КонецПроцедуры
Вынесите общую логику в отдельную процедуру — и обработчик события, и команды будут вызывать её. Так пересчёт не разъедется между ручной и программной отметкой.
Ещё один приём — доступность кнопок в зависимости от отметок. Например, кнопка «Провести отмеченные» активна, только если отмечена хотя бы одна строка:
Элементы.ФормаПровестиОтмеченные.Доступность = (Объект.Товары.НайтиСтроки(Новый Структура("Пометка", Истина)).Количество() > 0);
НайтиСтроки возвращает массив строк, подходящих под отбор. Это короче цикла и читается проще.
Флажки в управляемой форме: что нельзя и как обойти
В управляемой форме клиент и сервер разделены, и это рождает ограничения, которых не было в обычных формах.
Динамический список не хранит пометки
Таблица формы на основе динамического списка показывает данные из базы только для чтения. Добавить туда редактируемую колонку Булево и отмечать строки нельзя: колонки списка берутся из запроса и не сохраняются в форме.
Рабочие варианты:
- 📋 Таблица значений вместо списка. Заполните реквизит формы типа
ТаблицаЗначенийзапросом на сервере и добавьте колонкуПометка. Отмечать в ней можно свободно. - 🖱 Выделение вместо флажков. Оставьте динамический список, включите множественное выделение и обрабатывайте
Элементы.Список.ВыделенныеСтроки. У динамического списка в массиве лежат не идентификаторы, а ключи строк, обычно ссылки на объекты. - 💾 Хранение в базе. Если отметка — реальное свойство объекта (например, «Согласовано»), это реквизит справочника или документа. Его меняют записью объекта, а не галочкой в форме списка.
Три состояния флажка
Для дерева, где родитель отмечен «частично», Булево не хватает. Тип колонки делают Число, а у поля флажка включают свойство ТриСостояния. Значения: 0 — снят, 1 — установлен, 2 — неопределённое состояние. Состояние родителя пересчитывают кодом после изменения подчинённых строк.
Флажок нельзя нажать
Если галочка видна, но не нажимается, проверьте по порядку:
ТолькоПросмотру самой таблицы формы.ТолькоПросмотру поля флажка.Доступностьу таблицы или поля, в том числе программную установку вПриСозданииНаСервере.- Права пользователя: при отсутствии права изменения объекта вся форма открывается только для просмотра.
Обычные формы: табличное поле и колонка-флажок
В обычных формах (толстый клиент) элемент называется ТабличноеПоле, а код работает с данными напрямую, без деления на клиент и сервер.
Флажок там отображается двумя способами:
- 🔲 Колонка с элементом управления «Флажок», привязанная к булевой колонке источника данных.
- ✅ Флажок внутри обычной колонки через свойство колонки
ДанныеФлажка— галочка слева от текста в той же ячейке.
Установка флажка в текущей строке:
ТекущаяСтрока = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
ТекущаяСтрока.Пометка = Истина;
КонецЕсли;
Отметка всех строк источника данных (например, реквизита обработки типа ТаблицаЗначений):
ТаблицаТоваров.ЗаполнитьЗначения(Истина, "Пометка");
Для реакции на щелчок по галочке у ТабличноеПоле есть отдельное событие ПриИзмененииФлажка с параметрами Элемент и Колонка. По параметру Колонка проверяют, какой именно флажок изменили, если их в таблице несколько.
Если дорабатываете старую обработку под тонкий клиент или веб-клиент, обычную форму придётся переделать в управляемую. Код с ЭлементыФормы и ТекущаяСтрока там работать не будет — используйте варианты из разделов выше.
Почему флажок не ставится или слетает: ошибки и решения
ТекущиеДанные вернуло Неопределено, потому что в таблице нет строк. Добавьте проверку перед присваиванием.РеквизитФормыВЗначение, без обратного ЗначениеВРеквизитФормы. Или изменён другой реквизит, не тот, что указан в ПутьКДанным поля.Булево либо вид поля не «Поле флажка». Исправьте тип и вид в свойствах.Модифицированность = Истина после отметки.Отдельно о производительности. Не вызывайте серверную процедуру внутри клиентского цикла по строкам: каждый вызов — отдельный обмен с сервером, и на 500 строках это заметные секунды ожидания. Соберите данные, сделайте один вызов сервера, верните результат.
Частые вопросы
Как узнать, сколько строк отмечено?
НайтиСтроки(Новый Структура("Пометка", Истина)) у коллекции и возьмите Количество() у полученного массива.Можно ли поставить флажок в шапке колонки, чтобы отметить всё?
Как выделить отмеченные строки цветом?
Пометка = Истина, оформляемое поле — таблица целиком, в оформлении задайте цвет фона или жирный шрифт. Кода не требуется.