Как программно назначить обработчик события элементу управляемой формы в 1С

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

При динамическом создании интерфейса в 1С:Предприятии 8.3 разработчики часто сталкиваются с необходимостью программно «оживить» созданные элементы (поможет инструмент динамической настройки интерфейса и событий) — поля ввода, кнопки или таблицы. В отличие от визуального проектирования в конфигураторе, программный метод требует строгого соблюдения синтаксиса и понимания клиент-серверного взаимодействия. Рассмотрим подробно, как правильно назначать обработчики событий, избегая типичных ошибок вроде «Тип не определен (Действие)».

Различие подходов: Обычные и Управляемые формы

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

Если мы попытаемся выполнить код Элемент.УстановитьДействие("ПриИзменении", Новый Действие("...")) на сервере в управляемой форме, платформа выдаст ошибку, так как тип Действие в данном контексте не определен или не ожидается методом. В управляемых формах вторым параметром метода УстановитьДействие() должна выступать строка с именем процедуры-обработчика.

Правильное использование метода УстановитьДействие

Разберем по шагам правильный алгоритм добавления реквизитов и элементов и назначения ему события ПриИзменении. Предположим, мы работаем в серверной процедуре ПриСозданииНаСервере или аналогичной.


// 1. Добавляем новый реквизит (если его еще нет)
НовыйРеквизит = Новый РеквизитФормы("СуммаОперации", Новый ОписаниеТипов("Число"));
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

// 2. Создаем элемент формы
Элемент = Элементы.Добавить("ПолеСумма", Тип("ПолеФормы"), ЭтаФорма);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "СуммаОперации";

// 3. Назначаем обработчик (используем СТРОКУ, а не "Новый Действие")
Элемент.УстановитьДействие("ПриИзменении", "ОбработкаПриИзмененииСуммы");

Контекст выполнения и сигнатура процедуры

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

Процедура, имя которой мы указали строкой, должна располагаться в модуле формы с директивой &НаКлиенте. Кроме того, критически важно соблюдать сигнатуру (набор параметров) события. Если для ПриИзменении предусмотрен один параметр (Элемент), то в процедуре должен быть ровно один параметр. Если вы ошибетесь в количестве параметров, 1С не сможет вызвать процедуру в момент события.

Рассмотрим пример правильной структуры обработчика:


&НаКлиенте
Процедура ОбработкаПриИзмененииСуммы(Элемент)
    
    // Если требуется серверная логика, вызываем серверную процедуру-обертку
    ОбработкаПриИзмененииСуммыНаСервере();
    
    Сообщить("Данные успешно обновлены!");
    
КонецПроцедуры

&НаСервере
Процедура ОбработкаПриИзмененииСуммыНаСервере()
    // Здесь выполняем сложные расчеты с БД
КонецПроцедуры

Особенности назначения событий для кнопок

Важно различать обычные поля и кнопки — для упрощения этой работы есть конструктор интерфейсов и рабочих столов для 1С. Метод УстановитьДействие работает для «Полей формы», но для кнопок логика иная. Чтобы программно создать кнопку с работающим событием, нужно сначала создать Команду формы, а затем привязать кнопку к этой команде.

Проанализируем пример создания кнопки:


// Создаем команду
ИмяКоманды = "КомандаВыполнитьРасчет";
НоваяКоманда = Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "ВыполнитьРасчетНаКлиенте"; // Имя процедуры в модуле формы
НоваяКоманда.Заголовок = "Рассчитать всё";

// Создаем кнопку и связываем её с командой
НоваяКнопка = Элементы.Добавить("КнопкаРасчета", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
НоваяКнопка.ИмяКоманды = ИмяКоманды;

Специфические случаи: Гиперссылки и Таблицы

Рассмотрим ситуацию, когда необходимо обрабатывать нажатие на картинку или текст. Чтобы событие Нажатие сработало, свойство Гиперссылка элемента должно быть установлено в значение Истина. Без этого флажка платформа может игнорировать клики пользователя.

Пример для декорации или картинки:


ЭлементКартинка = Элементы.Добавить("Портрет", Тип("ПолеФормы"), Группа);
ЭлементКартинка.Вид = ВидПоляФормы.ПолеКартинки;
ЭлементКартинка.Гиперссылка = Истина; // Обязательно для события "Нажатие"
ЭлементКартинка.УстановитьДействие("Нажатие", "ПроцедураКликаПоКартинке");

Также стоит помнить о работе с таблицами (списками). События, связанные с изменением данных в конкретной ячейке, назначаются элементу-полю внутри колонки. А события навигации (например, ПриАктивизацииСтроки) назначаются самому элементу типа ТаблицаФормы.

Полезные советы при программной работе с событиями

  1. Удаление обработчика: Если вам нужно программно отключить событие в процессе работы формы, вызовите УстановитьДействие("ИмяСобытия", ""). Пустая строка разорвет связь, а для проверки качества кода можно использовать статический анализатор кода (есть в составе консоль кода и инструменты разработчика 1С).
  2. Проверка параметров: Если процедура не срабатывает (поможет инструмент пошаговой отладки кода в пользовательском режиме), проверьте встроенную справку 1С (F1) или примените редактор форм в режиме предприятия. Сигнатура (Элемент, ДанныеВыбора, СтандартнаяОбработка) для НачалоВыбора сильно отличается от простого ПриИзменении.
  3. Область видимости: Процедуры-обработчики, назначаемые программно, не обязательно помечать словом Экспорт, так как они находятся в том же модуле формы, но они обязаны быть доступны на клиенте.
  4. Местоположение: Помните, что нельзя назначить обработчиком процедуру из Общего модуля напрямую. Всегда используйте «клиентский мостик» в модуле текущей формы.

Используя предложенные методы, мы можем создавать гибкие и динамичные интерфейсы, которые корректно реагируют на действия пользователя без ошибок в типах данных 1С.

← На главную