Флажок на форме 1С: реквизит, размещение и управление

· 9 мин

Содержание

Флажок в 1С 8.3 — это поле на форме, связанное с реквизитом типа Булево. Чтобы его создать, нужны два шага: завести реквизит типа Булево у объекта (документа, справочника, обработки) и разместить этот реквизит на форме. Платформа сама нарисует квадратик с галочкой.

Всё делается в Конфигураторе (или в режиме разработки на платформе 8.3 с интерфейсом «Такси»). Отдельного элемента «создать флажок» нет — флажок появляется автоматически, когда на форму попадает реквизит логического типа. Ниже — как это сделать для формы документа и справочника, как настроить внешний вид, как управлять флажком из кода и как добавить его в табличную часть.

Если вы дорабатываете типовую конфигурацию (БП 3.0, ЗУП 3.1, УТ 11), менять её напрямую не нужно: флажок добавляют через расширение конфигурации — об этом в конце. Механика одинакова для платформы 8.3 с интерфейсом «Такси», конфигурация роли не играет.

Создаём реквизит типа Булево

Флажку нужно место для хранения значения — реквизит типа Булево. У него всего два состояния: Истина (галочка стоит) и Ложь (снята).

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

Значение по умолчанию у реквизита Булево — Ложь (флажок снят). Если нужно, чтобы новый документ создавался с уже установленной галочкой, задайте начальное значение в обработчике ПриСозданииНаСервере формы или в заполнении объекта.

Этот реквизит — часть объекта, его значение сохраняется в базе вместе с документом или элементом справочника. Если же флажок нужен только на время работы с формой (например, «показать расширенные настройки») и в базу его сохранять не надо, заводите реквизит формы типа Булево, а не реквизит объекта. Делается это на вкладке Реквизиты редактора формы.

Размещаем флажок на форме документа или справочника

Реквизит создан, но на форме его пока нет. Открываем форму объекта (ветка Формы, обычно ФормаДокумента или ФормаЭлемента) и переходим на вкладку Элементы.

Есть два способа вынести флажок:

  • Перетащить реквизит. В левой части редактора формы перечислены реквизиты объекта. Найдите свой УчитыватьСкидку и перетащите его в дерево элементов формы. Платформа сама создаст поле нужного вида — для Булево это поле флажка.
  • Добавить элемент вручную. По правой кнопке в дереве элементов добавьте новый элемент типа Поле, затем в его свойстве ПутьКДанным укажите реквизит Объект.УчитыватьСкидку. Вид поля платформа подберёт автоматически.

После размещения сохраните конфигурацию и обновите её (F7, затем «Обновить конфигурацию базы данных»). Запустите 1С:Предприятие — на форме появится квадратик с подписью.

Самая частая причина «флажок не появился»: реквизит создан, но на форму его не вынесли, либо изменения не записаны в базу. Реквизит в дереве конфигурации и поле на форме — две разные сущности.

Для справочника всё точно так же: реквизит типа Булево добавляется в ветку Реквизиты справочника и выносится на ФормуЭлемента. Разницы в механике между документом и справочником нет.

Настраиваем внешний вид и заголовок

У поля флажка несколько свойств, которые меняют его вид. Настраиваются в палитре свойств элемента формы.

СвойствоЧто делаетТипичные значения
ВидФлажкаформа элементаФлажок (квадрат с галочкой), Тумблер (переключатель)
ПоложениеЗаголовкагде подпись относительно флажкаЛево, Право, Верх, Низ, Нет
Заголовоктекст подписиберётся из синонима реквизита, можно переопределить
ТриСостояниятретье состояние, кроме «вкл/выкл»Истина / Ложь

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

Своё имя заголовку задают через свойство Заголовок элемента — оно перекрывает синоним реквизита. Это удобно, когда один и тот же реквизит выводится на двух формах с разными подписями.

Трёхзначный флажок. Иногда нужно третье состояние — «не определено» (например, в отборах: «да», «нет», «не важно»). Включается свойством ТриСостояния = Истина. Но тогда реквизит должен уметь хранить не только Истина/Ложь, но и Неопределено — обычный реквизит типа Булево этого не умеет. Для трёх состояний используйте реквизит формы составного типа (Булево + возможность пустого значения) и обрабатывайте Неопределено в коде отдельно.

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

Управляем флажком из кода

Флажок часто не просто хранит значение, а влияет на форму: открывает поля, меняет доступность кнопок, пересчитывает суммы. Это делают в обработчике события ПриИзменении поля флажка.

Добавьте обработчик: выделите поле флажка на форме, в палитре свойств найдите событие ПриИзменении и нажмите на лупу — платформа создаст процедуру. Пример: при установке флажка «Учитывать скидку» открываем поле процента скидки.

&НаКлиенте
Процедура УчитыватьСкидкуПриИзменении(Элемент)
    Элементы.ПроцентСкидки.Доступность = Объект.УчитыватьСкидку;
    Элементы.ПроцентСкидки.Видимость    = Объект.УчитыватьСкидку;
КонецПроцедуры

Обращение к значению флажка — через Объект.ИмяРеквизита (для реквизита объекта) или напрямую по имени (для реквизита формы). Управление элементами — через коллекцию Элементы:

  • Элементы.ИмяЭлемента.Доступность — можно ли изменять поле (Ложь делает его серым);
  • Элементы.ИмяЭлемента.Видимость — показывать ли поле вообще.

Чтобы форма открывалась уже в правильном состоянии (а не только после клика по флажку), ту же логику вызывают при открытии. Вынесите её в отдельную процедуру и вызовите её и из ПриИзменении, и из ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    УстановитьДоступностьСкидки();
КонецПроцедуры

&НаСервере
Процедура УстановитьДоступностьСкидки()
    Элементы.ПроцентСкидки.Доступность = Объект.УчитыватьСкидку;
КонецПроцедуры

Событие ПриИзменении — клиентское (&НаКлиенте), а управление доступностью при открытии часто делают на сервере (&НаСервере). Это нормально: свойства Доступность и Видимость меняются и там, и там. Не пытайтесь из серверной процедуры обратиться к тому, что живёт только на клиенте.

Для простых случаев «показать/скрыть поле по флажку» вместо кода можно настроить условное оформление формы. Открывается оно из палитры свойств самой формы (свойство «Условное оформление»). Там задаётся отбор — например, «реквизит УчитыватьСкидку равен Ложь» — и оформляемое свойство, скажем, «Видимость = Ложь» для поля процента скидки. Платформа сама отслеживает изменение флажка и применяет оформление, кода писать не нужно.

Что выбрать:

ПодходКогда удобнее
Условное оформлениеодно-два поля зависят от одного флажка; логика «есть галочка — показали, нет — скрыли»
Код в ПриИзменениинесколько условий сразу; нужно не только скрыть поле, но и пересчитать суммы, заполнить реквизиты, вывести предупреждение

На практике условное оформление берут для простого «показать/скрыть», а код — когда флажок запускает цепочку действий.

Флажок в табличной части

В табличной части (строки документа) флажок делается тем же способом — через реквизит типа Булево, только у табличной части, а не у объекта целиком.

  1. В дереве конфигурации раскройте табличную часть документа (например, Товары).
  2. В её ветке Реквизиты добавьте реквизит типа Булево — скажем, Бесплатно.
  3. Откройте форму, найдите таблицу на вкладке Элементы и добавьте в неё колонку, связанную с новым реквизитом (перетащите реквизит табличной части в дерево колонок таблицы).

В режиме предприятия в этой колонке появятся флажки — по одному на строку. Пользователь ставит галочки прямо в таблице.

Если нужно реагировать на изменение флажка в строке — например, обнулять цену для бесплатных позиций — добавьте обработчик ПриИзменении уже у колонки таблицы. В обработчике доступна текущая строка через Элементы.Товары.ТекущиеДанные:

&НаКлиенте
Процедура ТоварыБесплатноПриИзменении(Элемент)
    СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТаблицы.Бесплатно Тогда
        СтрокаТаблицы.Цена = 0;
    КонецЕсли;
КонецПроцедуры

Через флажок-колонку удобно делать групповые операции. Добавьте в командную панель таблицы команду «Отметить все» — её обработчик обходит строки циклом и проставляет флажок каждой:

&НаКлиенте
Процедура ОтметитьВсе(Команда)
    Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
        СтрокаТаблицы.Бесплатно = Истина;
    КонецЦикла;
КонецПроцедуры

Команда «Снять отметки» устроена так же, только присваивает Ложь. Для обратной логики (инвертировать все галочки) в цикле пишут СтрокаТаблицы.Бесплатно = НЕ СтрокаТаблицы.Бесплатно.

Если по флажку в строке нужно автоматически менять другие колонки (цену, количество, ставку), не забудьте, что при групповой простановке через цикл обработчик ПриИзменении колонки не вызывается — платформа запускает его только при ручном клике. Пересчёт в групповой команде делайте явно, тем же циклом.

Частые ошибки и как их проверить

Большинство проблем с флажком — не в коде, а в том, что реквизит, элемент и запись в базу рассинхронизированы. Вот что встречается чаще всего.

Диагностика: выберите симптом

Отлаживают логику флажка так же, как любой код формы: поставьте точку останова в процедуре ПриИзменении, запустите отладку (Отладка → Начать отладку) и посмотрите в табло значение Объект.ИмяРеквизита после клика по флажку. Если процедура вообще не вызвалась — проблема в привязке события, а не в коде.

Добавляем флажок в типовую конфигурацию через расширение

Если форма принадлежит типовой конфигурации на поддержке (БП 3.0, ЗУП 3.1, УТ 11), снимать её с поддержки ради одного флажка не нужно. Правильный путь — расширение конфигурации (доступны с платформы 8.3.6).

Коротко порядок такой:

Флажок через расширение конфигурации
Выполнено: 0 / 5

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

Заимствование обратимо: если флажок больше не нужен, удалите объект из расширения или отключите само расширение — типовая форма вернётся к исходному виду, данные по удалённому реквизиту просто перестанут отображаться. Поэтому доработку флажком удобно сначала проверить на копии базы, а потом переносить расширение в рабочую.

Частые вопросы

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