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