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