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