Разработка и Конфигурация · 11 мин
Как назначить обработчик события в 1С
Как назначить обработчик события в 1С: через палитру свойств, в модуле формы и программно. Примеры кода, типичные ошибки и способы проверки результата.
Обработчик события в 1С — это процедура в модуле, которая автоматически вызывается платформой при наступлении определённого события: нажатии кнопки, изменении поля, открытии формы, записи объекта. Назначить обработчик можно двумя способами: через палитру свойств элемента в конфигураторе либо программно — методами УстановитьДействие и ДобавитьОбработчик. Выбор способа зависит от того, где создаётся элемент — в конфигураторе или динамически в коде.
Основная масса задач решается в конфигураторе: вы выбираете элемент формы или объект метаданных, открываете палитру свойств, находите раздел «События» и привязываете процедуру. Платформа сама создаёт заготовку процедуры в нужном модуле с корректными параметрами. Программное назначение требуется реже — например, когда кнопки или поля создаются кодом в момент работы программы и заранее не существуют в конфигурации.
Ошибки при назначении обработчиков проявляются предсказуемо: процедура не вызывается, возникает ошибка «Процедура или функция с указанным именем не определена» или обработчик срабатывает не в том контексте (на клиенте вместо сервера). Ниже разобраны все способы назначения, проверка результата и типичные проблемы.
Где в 1С существуют события и их обработчики
События есть практически у всех объектов конфигурации. Управляемые формы генерируют события ПриСозданииНаСервере, ПриОткрытии, ПередЗаписью, ПослеЗаписи и другие. Элементы формы — поля ввода, кнопки, таблицы — имеют собственные наборы событий: Нажатие у кнопки, ПриИзменении у поля, ПриАктивизацииСтроки у таблицы.
Объекты метаданных — справочники, документы, регистры — имеют события модуля объекта: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения. Эти обработчики работают на сервере и не связаны с формой. Отдельная группа — подписки на события, которые позволяют реагировать на события объектов, не меняя их модули.
Важно понимать различие контекстов. Обработчики формы могут выполняться на клиенте или на сервере (директивы &НаКлиенте, &НаСервере), а обработчики модуля объекта — только на сервере. Попытка вызвать серверную процедуру из клиентского контекста без правильной директивы — частая причина ошибок.
Назначение обработчика через палитру свойств
Стандартный способ для управляемой формы: откройте форму в конфигураторе, выделите нужный элемент (кнопку, поле, таблицу) и откройте палитру свойств — правый клик по элементу, пункт «Свойства». В нижней части палитры находится раздел «События» со списком доступных для данного элемента событий.
Найдите нужное событие, например Нажатие у кнопки или ПриИзменении у поля, и нажмите кнопку с лупой (или символ выбора) в поле значения. Платформа предложит создать обработчик и автоматически сформирует процедуру в модуле формы с правильным именем и сигнатурой параметров. Для некоторых событий будет предложен выбор контекста выполнения — на клиенте, на сервере или клиент-серверный вариант.
Если обработчик уже существует, его можно выбрать из списка вместо создания нового. Это удобно, когда несколько элементов должны реагировать одинаково — например, несколько полей вызывают общий пересчёт суммы документа.
- 1Откройте форму объекта в конфигураторе
- 2Выделите элемент формы и откройте «Свойства»
- 3В разделе «События» найдите нужное событие
- 4Нажмите кнопку выбора и создайте новый обработчик
- 5Выберите контекст выполнения (клиент/сервер), если платформа предложит
- 6Допишите логику в созданной процедуре модуля формы
- 7Обновите конфигурацию базы данных и проверьте работу
Обработчики событий формы и модуля объекта
События самой формы назначаются аналогично: откройте свойства корневого элемента формы (клик по заголовку формы в дереве элементов или выбор формы в редакторе) и в разделе «События» создайте обработчик, например ПриСозданииНаСервере. Это событие чаще всего используют для инициализации данных, заполнения реквизитов и настройки видимости элементов.
Для событий объекта метаданных (не формы) палитра свойств не нужна. Откройте модуль объекта — в дереве конфигурации правый клик по справочнику или документу, пункт «Открыть модуль объекта». Внутри модуля напишите процедуру с зарезервированным именем события, например:
// Модуль объекта документа
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если СуммаДокумента < 0 Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Платформа распознаёт такие процедуры по имени и сигнатуре. Если ошибиться в имени или параметрах, обработчик просто не будет вызван — без сообщения об ошибке. Поэтому сигнатуру удобно брать из синтакс-помощника (Ctrl+F1 по имени события).
Программное назначение: УстановитьДействие
Когда элемент формы создаётся кодом, обработчик ему тоже назначается кодом. Для этого служит метод УстановитьДействие, доступный у элементов управляемой формы. Первый параметр — имя события строкой, второй — имя процедуры-обработчика в модуле формы.
&НаСервере
Процедура СоздатьКнопку()
НоваяКнопка = Элементы.Добавить("КнопкаПечать", Тип("КнопкаФормы"));
НоваяКнопка.Заголовок = "Печать";
НоваяКнопка.ИмяКоманды = Команды.Добавить("КомандаПечать").Имя;
Команды.КомандаПечать.Действие = "Подключаемый_Печать";
КонецПроцедуры
Для полей ввода и таблиц используется УстановитьДействие:
НовоеПоле = Элементы.Добавить("ПолеКонтрагент", Тип("ПолеФормы"), Родитель);
НовоеПоле.ПутьКДанным = "Объект.Контрагент";
НовоеПоле.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзменении");
Процедура-обработчик должна существовать в модуле формы до момента вызова события и иметь параметры, соответствующие событию. Имена с префиксом «Подключаемый_» — общепринятая практика: такие обработчики легко отличить от созданных в конфигураторе.
// Назначение обработчика динамически созданному полю
НовоеПоле = Элементы.Добавить("ПолеСумма", Тип("ПолеФормы"), Родитель);
НовоеПоле.ПутьКДанным = "Объект.Сумма";
НовоеПоле.УстановитьДействие("ПриИзменении", "Подключаемый_СуммаПриИзменении");Подписки на события и ДобавитьОбработчик
Подписка на событие — механизм конфигурации, позволяющий назначить обработчик событию объекта, не изменяя его модуль. В дереве конфигурации: ветка «Общие» → «Подписки на события». Создайте подписку, укажите источник (тип объекта, например «ДокументОбъект.РеализацияТоваровУслуг»), событие (например, ПередЗаписью) и обработчик — процедуру в общем модуле.
Подписки удобны, когда одна логика должна работать для многих объектов (например, заполнение поля «Ответственный» у всех документов) или когда нельзя менять типовой модуль объекта, чтобы не усложнять обновление конфигурации. Обработчик подписки выполняется на сервере и должен находиться в общем модуле с соответствующими флагами.
Метод ДобавитьОбработчик применяется в тонком клиенте для обработки событий COM-объектов, объектов внешних компонент и некоторых других случаев, где событие генерируется внешним источником:
ДобавитьОбработчик ВнешнийОбъект.Событие, МойОбработчик;
Для удаления используется УдалитьОбработчик с той же парой «событие — процедура». В управляемых формах этот механизм нужен редко — чаще всего в интеграционных сценариях с внешним оборудованием.
Способы назначения обработчика
Подходит для всех статических элементов формы. Быстро, платформа сама создаёт сигнатуру. Не работает для динамически создаваемых элементов.
Для элементов, созданных программно в управляемой форме. Требует готовой процедуры в модуле формы.
Для событий объектов без изменения их модулей и для единой логики на множество объектов. Только серверный контекст, обработчик в общем модуле.
Для событий внешних объектов и компонент. Узкая область применения, требует парного УдалитьОбработчик.
Проверка результата и типичные ошибки
После назначения обработчика обновите конфигурацию базы данных (F7) и проверьте работу в режиме предприятия. Самый надёжный способ убедиться, что обработчик вызывается, — поставить точку останова в отладчике (F9 на строке процедуры) и выполнить действие, вызывающее событие. Если отладчик не остановился, обработчик не привязан или событие не наступает.
Частые причины неработающего обработчика: процедура создана, но событие в палитре свойств осталось пустым; имя процедуры в УстановитьДействие не совпадает с реальным именем (опечатка вызовет ошибку в момент события); обработчик размещён не в том модуле — например, в модуле объекта вместо модуля формы; неверный контекст — клиентская процедура пытается выполнить серверный код.
Ещё одна группа проблем — двойное срабатывание. Например, у поля назначены обработчики и на ПриИзменении, и на ОкончаниеВводаТекста, и логика выполняется дважды. Проверяйте, какие события уже заняты, прежде чем добавлять новые.
Как проверить, что обработчик работает
Точка останова в отладчике срабатывает при действии пользователя
Отладчик не останавливается — привязка отсутствует или событие не наступает
Директива &НаКлиенте/&НаСервере соответствует используемым внутри вызовам
Ошибка компиляции или недоступность серверных методов из клиентского кода
В палитре свойств у события указано имя процедуры
Поле события пустое — обработчик не привязан
Часто задаваемые вопросы
Можно ли назначить один обработчик нескольким элементам?
Да. В палитре свойств у каждого элемента выберите уже существующую процедуру из списка вместо создания новой. Внутри обработчика параметр Элемент покажет, какой именно элемент вызвал событие, что позволяет разветвлять логику.
Почему обработчик ПриОткрытии не видит данные объекта?
Данные объекта заполняются на сервере до открытия формы. Если нужно работать с реквизитами объекта, используйте ПриСозданииНаСервере — там объект уже доступен. ПриОткрытии выполняется на клиенте и подходит для интерфейсных действий, а не для обращения к базе данных.
Как отменить действие пользователя в обработчике?
Многие события имеют параметр Отказ или СтандартнаяОбработка. Установка Отказ = Истина прерывает операцию (например, запись), а СтандартнаяОбработка = Ложь отключает встроенное поведение платформы, позволяя реализовать своё.
Чем подписка на событие лучше изменения модуля объекта?
Подписка не меняет типовой код, поэтому конфигурация проще обновляется. Кроме того, одна подписка может охватывать сразу несколько типов объектов. Минус — логика разнесена по общим модулям, и её сложнее найти при сопровождении.
Можно ли назначить обработчик в расширении конфигурации?
Да. В расширении заимствуются формы и модули, после чего обработчики событий можно назначать так же — через палитру свойств заимствованной формы или аннотации &Перед, &После, &Вместо для перехвата существующих процедур модуля. Это основной способ доработки типовых конфигураций на поддержке.
Что важно запомнить
Для статических элементов формы назначайте обработчики через палитру свойств — платформа создаст процедуру с правильной сигнатурой. Для динамических элементов используйте УстановитьДействие, для событий объектов без изменения их модулей — подписки на события. Проверяйте работу отладчиком с точкой останова и следите за контекстом выполнения: клиентский обработчик не может напрямую выполнять серверный код.