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