В процессе разработки интерфейсов на управляемых формах в «1С:Предприятие 8.3» начинающие программисты часто сталкиваются с задачей интерактивного управления доступностью элементов. Классический сценарий: на форме расположен флажок (например, ДаюСогласиеНаОбработкуМоихПерсональныхДанных), и до тех пор, пока пользователь не установит этот флажок, стандартная кнопка «Записать и закрыть» должна оставаться недоступной.
При попытке реализовать эту логику разработчики нередко натыкаются на неприятную ошибку платформы: «Преобразование значения к типу Булево не может быть выполнено». В этой статье мы подробно разберем, почему возникает данная ошибка, детально проанализируем разницу между реквизитами и элементами управляемой формы, а также по шагам настроим правильное управление доступностью стандартных команд.
Давайте проанализируем ситуацию, которая приводит к сбою программы. Ошибка возникает тогда, когда в коде условий (например, в операторе Если ... Тогда) разработчик пытается обратиться напрямую к элементу формы, отображающему флажок, ожидая получить его логическое значение (Истина или Ложь). Типичный ошибочный код выглядит следующим образом:
// ОШИБОЧНЫЙ КОД, вызывающий сбой приведения типов!
Если НЕ ЭтаФорма.Элементы.ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
Отказ = Истина;
КонецЕсли;
Почему этот код не работает? Дело в том, что в управляемом приложении 1С реализовано строгое разделение между данными (моделью) и интерфейсом (представлением):
Элементы или ЭтаФорма.Элементы) — это исключительно визуальные объекты управления на экране. Объект Элементы.ДаюСогласиеНаОбработкуМоихПерсональныхДанных имеет тип ПолеФормы. Он отвечает за свойства отображения: цвет, видимость, доступность, положение на экране и шрифт. У него нет и не может быть логического значения Булево. Попытка применить оператор НЕ к объекту типа ПолеФормы закономерно вызывает крах системы.Истина (флажок установлен) или Ложь (флажок снят).Таким образом, для проверки состояния флажка нам нужно обращаться не к визуальному элементу формы, а к связанному с ним реквизиту данных.
Посмотрим на пример правильного обращения к данным в зависимости от того, где именно объявлен наш реквизит флажка.
Вариант А. Флажок является реквизитом объекта (документа, справочника). Если реквизит создан в самом объекте конфигурации (например, в справочнике «Пользователи»), то обращаться к нему на форме нужно через префикс Объект. Корректный код проверки будет выглядеть так:
// Правильное обращение к реквизиту объекта
Если НЕ Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
// Действия, если согласие не получено
КонецЕсли;
Вариант Б. Флажок является реквизитом самой формы. Если реквизит создан непосредственно на вкладке «Реквизиты» редактора формы (локальный реквизит формы), обращаться к нему следует напрямую по имени, без каких-либо префиксов:
// Правильное обращение к реквизиту управляемой формы
Если НЕ ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
// Действия, если согласие не получено
КонецЕсли;
Соблюдение этого простого правила полностью избавит вас от ошибок преобразования типов.
Стандартные командные кнопки формы (такие как «Записать», «Записать и закрыть») по умолчанию формируются платформой автоматически в специальной командной панели. Напрямую управлять доступностью этих автогенерируемых кнопок неудобно, поскольку платформа может динамически менять их внутренние имена.
Рассмотрим детальный алгоритм, как красиво решить эту задачу:
ЗаписатьИЗакрыть (или Записать) и перетащите её мышкой в вашу командную панель в дереве элементов формы.КнопкаЗаписатьИЗакрыть.Теперь мы можем легко управлять доступностью этой кнопки из кода формы. Напишем обработчик события изменения флажка:
&НаКлиенте
Процедура ДаюСогласиеНаОбработкуМоихПерсональныхДанныхПриИзменении(Элемент)
// Получаем актуальное логическое значение из реквизита (в данном примере - реквизит объекта)
СостояниеФлажка = Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных;
// Управляем доступностью созданной нами кнопки командной панели
Элементы.КнопкаЗаписатьИЗакрыть.Доступность = СостояниеФлажка;
КонецПроцедуры
Не забудем также инициализировать правильное состояние кнопки при открытии формы. Если пользователь открывает уже записанный элемент, где согласие ранее было дано, кнопка должна быть доступна, а если нет — заблокирована. Добавим аналогичную проверку в процедуру создания формы на сервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Устанавливаем доступность кнопки при открытии карточки
Элементы.КнопкаЗаписатьИЗакрыть.Доступность = Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных;
КонецПроцедуры
Отключение доступности кнопки на форме — отличный шаг для улучшения юзабилити (UX), однако этого недостаточно для гарантированной безопасности данных. Пользователи могут инициировать запись объекта другими путями:
Ctrl + Enter);Для надежной защиты мы обязательно должны продублировать логику проверки в предопределенном событии формы ПередЗаписью. Это перехватит любую попытку записи объекта без согласия и выведет пользователю информативное предупреждение.
Проанализируем следующий код для модуля формы:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
// Проверяем значение реквизита, а не элемента!
Если НЕ Объект.ДаюСогласиеНаОбработкуМоихПерсональныхДанных Тогда
// Устанавливаем признак отказа от записи
Отказ = Истина;
// Оповещаем пользователя о необходимости заполнения флажка
ПоказатьПредупреждение(, "Для сохранения данных необходимо выразить согласие на обработку персональных данных!");
КонецЕсли;
КонецПроцедуры
Таким образом, мы реализовали комплексное и надежное решение: интерфейс динамически реагирует на действия пользователя, кнопка наглядно меняет свою доступность, а событие проверки перед записью гарантирует целостность бизнес-логики и защищает систему от некорректного сохранения данных.