К статье
Практический материал

Разработка и Конфигурация · 14 мин

События в 1С: что это такое и с чем они связаны

Что такое события в 1С: обработчики, подписки на события, события форм и объектов. Разбираем виды событий, порядок вызова и типичные ошибки разработчиков.

События в 1С — это сигналы, которые платформа генерирует при определённых действиях пользователя или системы: открытии формы, записи документа, изменении реквизита, проведении документа. На каждое событие можно «подписаться» — написать процедуру-обработчик, которая выполнится автоматически, когда событие произойдёт. Именно через события реализуется большая часть прикладной логики: проверки заполнения, расчёт сумм, контроль остатков, заполнение реквизитов по умолчанию.

Механизм событий связывает между собой три уровня платформы: интерфейс (формы), прикладные объекты (документы, справочники, регистры) и общую логику конфигурации (подписки на события, общие модули). Понимание того, какое событие когда возникает и в каком контексте выполняется — клиент или сервер, — это базовый навык для разработчика и важное знание для внедренца, который дорабатывает типовую конфигурацию.

Практическая ценность темы в том, что большинство ошибок доработок связано именно с неправильным выбором события: проверку ставят в «ПриОткрытии» вместо «ПередЗаписью», обращаются к серверным данным из клиентского обработчика, дублируют логику в нескольких обработчиках. Ниже разберём виды событий, порядок их вызова и правила безопасной работы с ними.

Что такое событие и обработчик события

Событие — это факт наступления определённой ситуации, которую платформа фиксирует сама: пользователь нажал «Записать», форма открылась, значение в поле изменилось. Разработчик не вызывает событие вручную — он лишь создаёт обработчик, то есть процедуру с зарезервированным именем, которую платформа выполнит в нужный момент.

Обработчик события имеет предопределённый набор параметров. Например, у события «ПередЗаписью» есть параметр «Отказ»: если установить его в «Истина», платформа прервёт запись объекта. У события «ОбработкаПроверкиЗаполнения» есть массив «ПроверяемыеРеквизиты», из которого можно исключить стандартные проверки и добавить свои. Набор параметров жёстко задан платформой, и его нужно смотреть в синтакс-помощнике для конкретного события.

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

Какие виды событий существуют в платформе

События в 1С условно делятся на несколько групп по месту возникновения. Первая группа — события форм и элементов формы: «ПриОткрытии», «ПриСозданииНаСервере», «ПередЗакрытием», «ПриИзменении» поля, «Нажатие» кнопки. Они связаны с интерактивной работой пользователя и существуют только в контексте открытой формы.

Вторая группа — события прикладных объектов, описанные в модуле объекта и модуле менеджера: «ПередЗаписью», «ПриЗаписи», «ПриУстановкеНовогоНомера», «ОбработкаПроведения», «ОбработкаЗаполнения», «ПриКопировании». Эти события срабатывают независимо от того, открыта ли форма: запись из обмена данными или фонового задания пройдёт через те же обработчики.

Третья группа — события сеанса и системы: «ПриНачалеРаботыСистемы», «ПриЗавершенииРаботыСистемы», обработчики регламентных заданий, события журнала регистрации. Отдельно стоят подписки на события — механизм, позволяющий привязать обработчик из общего модуля к событиям сразу нескольких видов объектов, не меняя их модули.

Группа событийГде описываетсяКогда срабатывает
События формыМодуль формыТолько при интерактивной работе с открытой формой
События объектаМодуль объектаПри любой записи: из формы, программно, при обмене
Подписки на событияОбщий модульПри событиях всех объектов, указанных в источнике подписки
События сеансаМодуль управляемого приложенияПри старте и завершении работы пользователя

События формы: клиент и сервер

Форма в управляемом приложении живёт в двух контекстах одновременно: на клиенте (интерфейс пользователя) и на сервере (данные и бизнес-логика). Поэтому у обработчиков событий формы есть директивы компиляции: «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста». Событие «ПриОткрытии» выполняется на клиенте, а «ПриСозданииНаСервере» — на сервере, ещё до того как пользователь увидел форму.

Типичный сценарий: при изменении поля «Количество» нужно пересчитать сумму строки. Если расчёт простой, его выполняют прямо в клиентском обработчике «ПриИзменении». Если нужен запрос к базе — например, получить цену из регистра сведений, — клиентский обработчик вызывает серверную процедуру, потому что прямой доступ к данным с клиента невозможен.

Порядок событий при открытии формы

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

События записи и проведения документов

Запись документа — самая насыщенная событиями операция. Последовательность такова: «ПередЗаписью» → установка номера и даты → запись в базу → «ПриЗаписи» → если включено проведение, то «ОбработкаПроведения» с движениями по регистрам. При интерактивной записи из формы дополнительно срабатывают события формы «ПередЗаписью» и «ПослеЗаписи» — они выполняются раньше и позже объектных соответственно.

Событие «ПередЗаписью» используют для финальных проверок и дозаполнения реквизитов: здесь объект ещё можно изменить или отклонить запись через параметр «Отказ». «ПриЗаписи» срабатывает, когда объект уже в базе, но транзакция не завершена — это место для записи связанных данных, которые должны быть согласованы с объектом. «ОбработкаПроведения» отвечает за формирование движений: здесь строятся запросы к остаткам и записываются наборы записей регистров.

Критически важно помнить: обработчики модуля объекта выполняются на сервере и в транзакции записи. Долгие операции — обращения к внешним сервисам, тяжёлые расчёты — внутри «ПриЗаписи» удерживают транзакцию и блокируют данные для других пользователей. Такую работу правильнее выносить в фоновые задания или отложенные механизмы.

Подписки на события: доработка без изменения типового кода

Подписка на событие — это объект конфигурации, который связывает событие (например, «ПередЗаписью» или «ОбработкаПроведения») с процедурой в общем модуле. В свойстве «Источник» указывают, к каким объектам применяется подписка: ко всем документам, к конкретному виду или к группе справочников. Когда событие наступает у любого объекта-источника, платформа вызывает обработчик подписки.

Главное назначение подписок — доработка типовых конфигураций без редактирования модулей объектов. Это упрощает обновление: типовой модуль остаётся нетронутым, а ваша логика живёт в отдельном общем модуле. В конфигурациях на БСП значительная часть встроенной логики реализована именно через подписки, и добавление своих подписок — рекомендуемый путь расширения.

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

Как создать подписку на событие
  1. 1
    Создайте общий модуль с признаками «Сервер» и напишите в нём процедуру-обработчик с параметрами по синтакс-помощнику для выбранного события
  2. 2
    Добавьте в конфигураторе объект «Подписка на событие», выберите событие, например «ПередЗаписью»
  3. 3
    В свойстве «Источник» отметьте нужные виды объектов, в свойстве «Обработчик» укажите созданную процедуру
  4. 4
    Обновите конфигурацию базы данных и проверьте срабатывание на тестовом документе
  5. 5
    Проверьте, что обработчик не ломает запись других объектов источника: отладьте ветку кода для каждого вида

Как выбрать правильное событие для своей задачи

Ошибка выбора события — причина большинства дефектов доработок. Правило первое: если логика должна работать при любом способе записи (из формы, из обмена, программно), размещайте её в модуле объекта или подписке, а не в форме. Правило второе: если логика чисто интерфейсная — показать предупреждение, подсветить поле, — ей место только в форме.

Для проверок корректности данных есть специальное событие «ОбработкаПроверкиЗаполнения» — оно стандартно вызывается при записи и проведении и умеет выводить сообщения с привязкой к полям формы. Ставить проверки в «ПриОткрытии» или «ПриИзменении» бессмысленно: программная запись их обойдёт. Для автозаполнения новых объектов предназначено «ОбработкаЗаполнения», а не «ПриСозданииНаСервере»: первое срабатывает и при программном создании.

Маршрут решения

Как выбрать место для кода

Проверка или расчёт должны работать при любой записи объектаИспользуйте событие модуля объекта или подписку на событие
Нужно заполнить реквизиты нового объекта по умолчаниюИспользуйте «ОбработкаЗаполнения» в модуле объекта
Нужно показать пользователю предупреждение или настроить видимость элементовИспользуйте события формы: «ПриОткрытии», «ПриИзменении»
Дорабатываете типовую конфигурацию и важна простота обновленийИспользуйте подписку на событие в собственном общем модуле
Действие должно выполниться после успешной записи и не блокировать транзакциюЗарегистрируйте факт в «ПриЗаписи» и выполните работу фоновым заданием

Типичные ошибки и как их избежать

Самая частая ошибка — размещение бизнес-логики только в форме. Пока документы вводят вручную, всё работает; стоит подключить обмен или загрузку из файла, как проверки и заполнение «исчезают», потому что форма при этом не открывается. Вторая ошибка — обращение к данным формы из модуля объекта: там формы просто нет, и код падает при программной записи.

Третья группа ошибок — рекурсия и лишние срабатывания. Если в обработчике «ПриЗаписи» записать сам объект или связанный объект, который в своём «ПриЗаписи» трогает первый, получится зацикливание. Защита — проверка условий перед записью и использование параметра «ОбменДанными.Загрузка» при обмене, чтобы пропускать лишние проверки. Также не стоит дублировать одну проверку в нескольких событиях: это удваивает стоимость поддержки.

Типичные ошибки
01
Логика только в форме: при обмене данными или программной записи проверки не срабатывают, в базу попадают некорректные данные
02
Вызов сервера в цикле из клиентского обработчика: форма «подвисает» при каждом изменении строки табличной части
03
Тяжёлые операции в «ПриЗаписи»: транзакция удерживается долго, растут блокировки и конфликты между пользователями
04
Запись объекта внутри его же обработчика записи: рекурсивные вызовы и ошибка переполнения стека
05
Игнорирование параметра «Отказ»: вместо корректного отказа от записи выбрасывается исключение, и пользователь теряет введённые данные
Контрольные точки

Как проверить результат

Запись документа из формы
Норма

Обработчики срабатывают, сообщения выводятся с привязкой к полям

Тревожный признак

Проверки не выполняются или сообщения появляются без привязки

Программная запись из обработки или обмена
Норма

Логика модуля объекта и подписок отрабатывает так же, как из формы

Тревожный признак

Данные записываются без проверок — логика осталась в форме

Скорость открытия формы
Норма

Форма открывается без заметной паузы

Тревожный признак

Задержка из-за множества серверных вызовов в обработчиках

Поведение при отказе от записи
Норма

Пользователь видит понятное сообщение, данные в форме сохраняются

Тревожный признак

Необработанное исключение и закрытие формы с потерей ввода

Как отладить срабатывание событий

Основной инструмент — конфигуратор с отладкой: точка останова в обработчике покажет, когда событие срабатывает, с какими параметрами и в каком контексте. Если обработчик не вызывается, проверьте три вещи: совпадает ли имя процедуры с именем события, назначен ли обработчик в палитре свойств формы (для событий форм) и не отключена ли подписка в свойствах.

Для анализа порядка событий полезен приём с выводом сообщений: временно вставьте «Сообщить» с именем события в каждый обработчик цепочки и запишите документ — в окне сообщений будет виден реальный порядок вызовов. После отладки такие сообщения нужно удалить. Для серверных обработчиков в клиент-серверном режиме убедитесь, что в конфигураторе включена отладка на сервере, иначе точки останова в модуле объекта просто не сработают.

При поиске причины странного поведения документа смотрите по цепочке: события формы → модуль объекта → подписки на события → переопределяемые модули БСП. В типовых конфигурациях основная логика часто находится именно в подписках и общих модулях, а модуль объекта почти пуст.
ПЗ
Практическое замечание

Частые вопросы о событиях в 1С

Чем событие формы «ПередЗаписью» отличается от события модуля объекта «ПередЗаписью»?

Событие формы срабатывает только при интерактивной записи из открытой формы и имеет доступ к элементам интерфейса. Событие модуля объекта выполняется при любой записи — программной, при обмене, из фонового задания — и работает только на сервере. Бизнес-проверки размещайте в модуле объекта, интерфейсные вопросы пользователю — в форме.

Почему мой обработчик «ПриИзменении» не срабатывает?

Чаще всего обработчик просто не назначен: в палитре свойств элемента формы поле события пустое или привязано к другой процедуре. Вторая причина — значение меняется программно на сервере: событие «ПриИзменении» возникает только при интерактивном изменении пользователем, программное присвоение его не вызывает.

Можно ли из события отменить проведение документа?

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

Сколько подписок можно повесить на одно событие?

Технических ограничений на количество подписок нет — на одно событие одного объекта может срабатывать несколько подписок. Однако порядок их вызова не гарантирован, поэтому подписки не должны зависеть друг от друга. Каждая подписка должна корректно работать независимо от остальных.

Почему в обработчике записи нельзя использовать предупреждения и вопросы пользователю?

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

Где посмотреть полный список событий для конкретного объекта?

В конфигураторе откройте синтакс-помощник и найдите раздел для нужного типа объекта — например, «ДокументОбъект» или «УправляемаяФорма»: там перечислены все события с параметрами и контекстом выполнения. Также список событий формы виден в палитре свойств формы и её элементов.

Итог

Что важно запомнить

События — это точки жизненного цикла форм и объектов, в которых платформа вызывает ваш код. Бизнес-логику размещайте в модуле объекта или подписках, интерфейсную — в форме; для доработки типовых конфигураций используйте подписки на события. Проверяйте работу обработчиков не только интерактивно, но и при программной записи.