Как управлять доступностью кнопки Записать и закрыть с помощью флажка в 1С 8.3 и избежать ошибки приведения к Булево?

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

В процессе разработки интерфейсов на управляемых формах в «1С:Предприятие 8.3» начинающие программисты часто сталкиваются с задачей интерактивного управления доступностью элементов. Классический сценарий: на форме расположен флажок (например, ДаюСогласиеНаОбработкуМоихПерсональныхДанных), и до тех пор, пока пользователь не установит этот флажок, стандартная кнопка «Записать и закрыть» должна оставаться недоступной.

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

Выясняем причину ошибки приведения к Булево

Давайте проанализируем ситуацию, которая приводит к сбою программы. Ошибка возникает тогда, когда в коде условий (например, в операторе Если ... Тогда) разработчик пытается обратиться напрямую к элементу формы, отображающему флажок, ожидая получить его логическое значение (Истина или Ложь). Типичный ошибочный код выглядит следующим образом:


// ОШИБОЧНЫЙ КОД, вызывающий сбой приведения типов!
Если НЕ ЭтаФорма.Элементы.ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
    Отказ = Истина;
КонецЕсли;

Почему этот код не работает? Дело в том, что в управляемом приложении 1С реализовано строгое разделение между данными (моделью) и интерфейсом (представлением):

  1. Элементы формы (доступные через коллекцию Элементы или ЭтаФорма.Элементы) — это исключительно визуальные объекты управления на экране. Объект Элементы.ДаюСогласиеНаОбработкуМоихПерсональныхДанных имеет тип ПолеФормы. Он отвечает за свойства отображения: цвет, видимость, доступность, положение на экране и шрифт. У него нет и не может быть логического значения Булево. Попытка применить оператор НЕ к объекту типа ПолеФормы закономерно вызывает крах системы.
  2. Реквизиты формы или объекта (данные) — это сущности, в которых непосредственно хранятся значения. Именно реквизит хранит в себе состояние флажка — Истина (флажок установлен) или Ложь (флажок снят).

Таким образом, для проверки состояния флажка нам нужно обращаться не к визуальному элементу формы, а к связанному с ним реквизиту данных.

Шаг 1. Исправляем обращение к значению флажка

Посмотрим на пример правильного обращения к данным в зависимости от того, где именно объявлен наш реквизит флажка.

Вариант А. Флажок является реквизитом объекта (документа, справочника). Если реквизит создан в самом объекте конфигурации (например, в справочнике «Пользователи»), то обращаться к нему на форме нужно через префикс Объект. Корректный код проверки будет выглядеть так:


// Правильное обращение к реквизиту объекта
Если НЕ Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
    // Действия, если согласие не получено
КонецЕсли;

Вариант Б. Флажок является реквизитом самой формы. Если реквизит создан непосредственно на вкладке «Реквизиты» редактора формы (локальный реквизит формы), обращаться к нему следует напрямую по имени, без каких-либо префиксов:


// Правильное обращение к реквизиту управляемой формы
Если НЕ ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
    // Действия, если согласие не получено
КонецЕсли;

Соблюдение этого простого правила полностью избавит вас от ошибок преобразования типов.

Шаг 2. Программное управление доступностью кнопки Записать и закрыть

Стандартные командные кнопки формы (такие как «Записать», «Записать и закрыть») по умолчанию формируются платформой автоматически в специальной командной панели. Напрямую управлять доступностью этих автогенерируемых кнопок неудобно, поскольку платформа может динамически менять их внутренние имена.

Рассмотрим детальный алгоритм, как красиво решить эту задачу:

  1. Откройте редактор вашей управляемой формы и перейдите в дерево элементов.
  2. Найдите основную командную панель формы (обычно она находится на самом верху структуры элементов).
  3. В панели свойств командной панели найдите свойство «Автозаполнение» и снимите с него флажок. Это позволит нам самостоятельно управлять составом и свойствами кнопок на панели.
  4. Перейдите на вкладку «Команды» в правой верхней части редактора формы, выберите подвкладку «Стандартные команды».
  5. Найдите стандартную команду ЗаписатьИЗакрыть (или Записать) и перетащите её мышкой в вашу командную панель в дереве элементов формы.
  6. Выделите созданную кнопку и задайте ей уникальное имя в свойствах, например, КнопкаЗаписатьИЗакрыть.

Теперь мы можем легко управлять доступностью этой кнопки из кода формы. Напишем обработчик события изменения флажка:


&НаКлиенте
Процедура ДаюСогласиеНаОбработкуМоихПерсональныхДанныхПриИзменении(Элемент)
    
    // Получаем актуальное логическое значение из реквизита (в данном примере - реквизит объекта)
    СостояниеФлажка = Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных;
    
    // Управляем доступностью созданной нами кнопки командной панели
    Элементы.КнопкаЗаписатьИЗакрыть.Доступность = СостояниеФлажка;
    
КонецПроцедуры

Не забудем также инициализировать правильное состояние кнопки при открытии формы. Если пользователь открывает уже записанный элемент, где согласие ранее было дано, кнопка должна быть доступна, а если нет — заблокирована. Добавим аналогичную проверку в процедуру создания формы на сервере:


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

Шаг 3. Обеспечение надежности (Двойной контроль)

Отключение доступности кнопки на форме — отличный шаг для улучшения юзабилити (UX), однако этого недостаточно для гарантированной безопасности данных. Пользователи могут инициировать запись объекта другими путями:

Для надежной защиты мы обязательно должны продублировать логику проверки в предопределенном событии формы ПередЗаписью. Это перехватит любую попытку записи объекта без согласия и выведет пользователю информативное предупреждение.

Проанализируем следующий код для модуля формы:


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    
    // Проверяем значение реквизита, а не элемента!
    Если НЕ Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
        
        // Устанавливаем признак отказа от записи
        Отказ = Истина; 
        
        // Оповещаем пользователя о необходимости заполнения флажка
        ПоказатьПредупреждение(, "Для сохранения данных необходимо выразить согласие на обработку персональных данных!");
        
    КонецЕсли;
    
КонецПроцедуры

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

← На главную