← Назад к вопросам
Что такое подписки на события?
2.0 Middle🔥 61 комментариев
#Объекты метаданных#Стандарты разработки
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Подписки на события в 1С
Подписка на событие это механизм, при котором процедура или функция автоматически вызывается при наступлении определённого события в приложении. Это реализует паттерн "Observer" (Наблюдатель) в 1С.
Определение
Подписка на событие это:
- Связь между событием и обработчиком события
- Автоматический вызов обработчика при наступлении события
- Слабая связь между компонентами приложения
- Способ реализации взаимодействия между объектами
Синтаксис
// Подключение подписки на событие:
ПодключитьОбработчикСобытия(Объект, "ИмяСобытия", "ПроцедураОбработчик");
// Отключение подписки:
ОтключитьОбработчикСобытия(Объект, "ИмяСобытия", "ПроцедураОбработчик");
// Сгенерировать событие (в управляемом приложении):
ОповеститьОбИзменении();
Типы событий в 1С
1. События элементов управления форм
// При нажатии кнопки
Процедура КнопкаНажатие()
Сообщить("Кнопка нажата");
КонецПроцедуры
// При изменении значения в поле
Процедура ПолеПриИзменении(Элемент)
Сообщить("Значение изменилось: " + Элемент.Значение);
КонецПроцедуры
// При выборе строки в таблице
Процедура ТаблицаПриАктивизацииСтроки(Элемент)
Сообщить("Выбрана строка: " + Элемент.ТекущаяСтрока);
КонецПроцедуры
2. События форм
// При открытии формы
Процедура ПриОткрытииФормы(Отмена, СтандартнаяОбработка)
Сообщить("Форма открыта");
КонецПроцедуры
// При закрытии формы
Процедура ПриЗакрытииФормы(ВозвращаемоеЗначение)
Сообщить("Форма закрыта");
КонецПроцедуры
// При проверке заполнения
Процедура ПриПроверкеЗаполнения(Отмена, ПроверяемыеАтрибуты)
Если Объект.Сумма = 0 Тогда
Отмена = Истина;
ПроверяемыеАтрибуты.Добавить("Сумма");
КонецЕсли;
КонецПроцедуры
3. События объектов (справочников, документов)
// При проведении документа
Процедура ПриПроведении(ПроведениеОтмена)
ПроверитьДанныеДокумента();
КонецПроцедуры
// При записи объекта
Процедура ПриЗаписи(ОтменаПоследней = Ложь)
СообщитьОЗаписи(Ссылка);
КонецПроцедуры
// При удалении объекта
Процедура ПриУдалении(ОтменаПоследней = Ложь)
УдалитьСвязанныеДокументы(Ссылка);
КонецПроцедуры
Практический пример: подписка на событие объекта
// Задача: при сохранении документа отправить уведомление
Процедура ПрисоединитьПодпискиОбработчиков(Объект)
// Подписать на событие "ПриЗаписи" документа
ПодключитьОбработчикСобытия(
Объект,
"ПриЗаписи",
"ОбработчикПиЗаписиДокумента"
);
КонецПроцедуры
Процедура ОбработчикПиЗаписиДокумента(Объект)
// Эта процедура вызовется автоматически
// когда документ будет записан
СообщитьОЗаписи(Объект);
ОтправитьУведомление(Объект);
КонецПроцедуры
Пример: слабая связь между компонентами
// Модуль 1: Сохранение документа
Процедура СохранитьДокумент()
// Не вызываем напрямую другие процедуры
// Объект = новый документ
// Объект.Записать();
// Это вызовет событие ПриЗаписи
КонецПроцедуры
// Модуль 2: Логирование (подписан на событие)
Процедура ПриИнициализацииСистемы()
Объект = Документы.Счет.Создать();
// Подписываемся на событие ПриЗаписи
ПодключитьОбработчикСобытия(
Объект,
"ПриЗаписи",
"ЛогироватьЗапись"
);
КонецПроцедуры
Процедура ЛогироватьЗапись(Объект)
Запись = РегистрыСведений.Лог.СоздатьМенеджерЗаписи();
Запись.Дата = ТекущаяДата();
Запись.Сообщение = "Записан документ: " + Объект.Номер;
Запись.Записать();
КонецПроцедуры
// Модуль 3: Отправка уведомления (тоже подписан)
Процедура ПриИнициализацииСистемы()
Объект = Документы.Счет.Создать();
// Подписываемся на то же событие
ПодключитьОбработчикСобытия(
Объект,
"ПриЗаписи",
"ОтправитьУведомление"
);
КонецПроцедуры
Процедура ОтправитьУведомление(Объект)
ОповещениеДля = Новая Структура();
ОповещениеДля.Вставить("Тема", "Новый документ");
ОповещениеДля.Вставить("Текст", "Записан счёт " + Объект.Номер);
ОтправитьПочту(ОповещениеДля);
КонецПроцедуры
// Результат: при записи документа
// 1. Вызовется ЛогироватьЗапись
// 2. Вызовется ОтправитьУведомление
// Оба подписаны на одно событие!
// Это слабая связь - модули независимы
Подписка на события элементов управления
// На форме есть таблица с товарами
Процедура ПриОткрытииФормы(Отмена, СтандартнаяОбработка)
// Подписаться на событие выбора строки
ПодключитьОбработчикСобытия(
Элементы.ТаблицаТоваров,
"ПриАктивизацииСтроки",
"ОбработчикВыбораТовара"
);
КонецПроцедуры
Процедура ОбработчикВыбораТовара(Элемент)
// Эта процедура вызвется при выборе товара
ТекущаяСтрока = Элементы.ТаблицаТоваров.ТекущаяСтрока;
ТекущийТовар = Объект.Товары[ТекущаяСтрока];
// Обновить описание
Форма.Описание = ТекущийТовар.Описание;
КонецПроцедуры
Отключение подписки (важно для утечек памяти!)
// При закрытии формы ОБЯЗАТЕЛЬНО отключить подписку
Процедура ПриОткрытииФормы(Отмена, СтандартнаяОбработка)
ПодключитьОбработчикСобытия(
Объект,
"ПриЗаписи",
"МояОбработка"
);
КонецПроцедуры
Процедура ПриЗакрытииФормы(ВозвращаемоеЗначение)
// ОБЯЗАТЕЛЬНО отключить подписку!
ОтключитьОбработчикСобытия(
Объект,
"ПриЗаписи",
"МояОбработка"
);
КонецПроцедуры
// Если не отключить подписку:
// - Объект не может быть удалён из памяти
// - Утечка памяти
// - Процедура может вызваться неожиданно
События уровня приложения
// В управляемом приложении можно подписаться
// на глобальные события
Процедура ПриНачалеРаботыСистемы(Отмена)
// Подписываемся на событие, выдвигаемое другим модулем
ПодключитьОбработчикСобытия(
ЭтотОбъект,
"ПользовательЗашёл",
"ОбработчикВхода"
);
КонецПроцедуры
Процедура ОбработчикВхода(Параметры)
Пользователь = Параметры.Пользователь;
Сообщить("Привет, " + Пользователь + "!");
КонецПроцедуры
Выгенерировать событие
// Создать собственное событие
// В управляемом приложении
Процедура ПроцедураМодуля()
// Выполнить действие
// Выгенерировать событие для других модулей
// (в управляемом приложении)
ОповеститьОбИзменении();
// В системных модулях это работает через события
КонецПроцедуры
Сравнение подходов
// БЕЗ подписки (прямой вызов):
Процедура СохранитьДокумент()
Объект.Записать();
ЛогироватьЗапись(Объект);
ОтправитьУведомление(Объект);
ОбновитьОтчет(Объект);
// Жёсткая связь - если добавить новое действие,
// нужно менять эту процедуру
КонецПроцедуры
// С подписками (слабая связь):
Процедура ПриНачалеРаботыСистемы(Отмена)
ПодключитьОбработчикСобытия(Объект, "ПриЗаписи", "ЛогироватьЗапись");
ПодключитьОбработчикСобытия(Объект, "ПриЗаписи", "ОтправитьУведомление");
ПодключитьОбработчикСобытия(Объект, "ПриЗаписи", "ОбновитьОтчет");
// Слабая связь - новые подписчики добавляются отдельно
КонецПроцедуры
Процедура СохранитьДокумент()
Объект.Записать();
// Все подписчики вызовутся автоматически
КонецПроцедуры
Чеклист при использовании подписок
- Подписка создана правильно
- Имя процедуры-обработчика совпадает
- Объект, на который подписываемся, правильный
- Подписка отключена при закрытии формы
- Нет утечек памяти (циклических ссылок)
- Обработчик не создаёт циклических вызовов
- Проведено тестирование
Итого: подписка на событие это механизм, при котором процедура-обработчик автоматически вызывается при наступлении определённого события, реализуя слабую связь между компонентами приложения.