← Назад к вопросам

Что такое подписки на события?

2.0 Middle🔥 61 комментариев
#Объекты метаданных#Стандарты разработки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подписки на события в 1С

Подписка на событие это механизм, при котором процедура или функция автоматически вызывается при наступлении определённого события в приложении. Это реализует паттерн "Observer" (Наблюдатель) в 1С.

Определение

Подписка на событие это:

  • Связь между событием и обработчиком события
  • Автоматический вызов обработчика при наступлении события
  • Слабая связь между компонентами приложения
  • Способ реализации взаимодействия между объектами

Синтаксис

// Подключение подписки на событие:
ПодключитьОбработчикСобытия(Объект, "ИмяСобытия", "ПроцедураОбработчик");

// Отключение подписки:
ОтключитьОбработчикСобытия(Объект, "ИмяСобытия", "ПроцедураОбработчик");

// Сгенерировать событие (в управляемом приложении):
ОповеститьОбИзменении();

Типы событий в 1С

1. События элементов управления форм

// При нажатии кнопки
Процедура КнопкаНажатие()
    Сообщить("Кнопка нажата");
КонецПроцедуры

// При изменении значения в поле
Процедура ПолеПриИзменении(Элемент)
    Сообщить("Значение изменилось: " + Элемент.Значение);
КонецПроцедуры

// При выборе строки в таблице
Процедура ТаблицаПриАктивизацииСтроки(Элемент)
    Сообщить("Выбрана строка: " + Элемент.ТекущаяСтрока);
КонецПроцедуры

2. События форм

// При открытии формы
Процедура ПриОткрытииФормы(Отмена, СтандартнаяОбработка)
    Сообщить("Форма открыта");
КонецПроцедуры

// При закрытии формы
Процедура ПриЗакрытииФормы(ВозвращаемоеЗначение)
    Сообщить("Форма закрыта");
КонецПроцедуры

// При проверке заполнения
Процедура ПриПроверкеЗаполнения(Отмена, ПроверяемыеАтрибуты)
    Если Объект.Сумма = 0 Тогда
        Отмена = Истина;
        ПроверяемыеАтрибуты.Добавить("Сумма");
    КонецЕсли;
КонецПроцедуры

3. События объектов (справочников, документов)

// При проведении документа
Процедура ПриПроведении(ПроведениеОтмена)
    ПроверитьДанныеДокумента();
КонецПроцедуры

// При записи объекта
Процедура ПриЗаписи(ОтменаПоследней = Ложь)
    СообщитьОЗаписи(Ссылка);
КонецПроцедуры

// При удалении объекта
Процедура ПриУдалении(ОтменаПоследней = Ложь)
    УдалитьСвязанныеДокументы(Ссылка);
КонецПроцедуры

Практический пример: подписка на событие объекта

// Задача: при сохранении документа отправить уведомление

Процедура ПрисоединитьПодпискиОбработчиков(Объект)
    // Подписать на событие "ПриЗаписи" документа
    ПодключитьОбработчикСобытия(
        Объект,
        "ПриЗаписи",
        "ОбработчикПиЗаписиДокумента"
    );
КонецПроцедуры

Процедура ОбработчикПиЗаписиДокумента(Объект)
    // Эта процедура вызовется автоматически
    // когда документ будет записан
    
    СообщитьОЗаписи(Объект);
    ОтправитьУведомление(Объект);
КонецПроцедуры

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

// Модуль 1: Сохранение документа
Процедура СохранитьДокумент()
    // Не вызываем напрямую другие процедуры
    // Объект = новый документ
    // Объект.Записать();
    // Это вызовет событие ПриЗаписи
КонецПроцедуры

// Модуль 2: Логирование (подписан на событие)
Процедура ПриИнициализацииСистемы()
    Объект = Документы.Счет.Создать();
    
    // Подписываемся на событие ПриЗаписи
    ПодключитьОбработчикСобытия(
        Объект,
        "ПриЗаписи",
        "ЛогироватьЗапись"
    );
КонецПроцедуры

Процедура ЛогироватьЗапись(Объект)
    Запись = РегистрыСведений.Лог.СоздатьМенеджерЗаписи();
    Запись.Дата = ТекущаяДата();
    Запись.Сообщение = "Записан документ: " + Объект.Номер;
    Запись.Записать();
КонецПроцедуры

// Модуль 3: Отправка уведомления (тоже подписан)
Процедура ПриИнициализацииСистемы()
    Объект = Документы.Счет.Создать();
    
    // Подписываемся на то же событие
    ПодключитьОбработчикСобытия(
        Объект,
        "ПриЗаписи",
        "ОтправитьУведомление"
    );
КонецПроцедуры

Процедура ОтправитьУведомление(Объект)
    ОповещениеДля = Новая Структура();
    ОповещениеДля.Вставить("Тема", "Новый документ");
    ОповещениеДля.Вставить("Текст", "Записан счёт " + Объект.Номер);
    
    ОтправитьПочту(ОповещениеДля);
КонецПроцедуры

// Результат: при записи документа
// 1. Вызовется ЛогироватьЗапись
// 2. Вызовется ОтправитьУведомление
// Оба подписаны на одно событие!
// Это слабая связь - модули независимы

Подписка на события элементов управления

// На форме есть таблица с товарами

Процедура ПриОткрытииФормы(Отмена, СтандартнаяОбработка)
    
    // Подписаться на событие выбора строки
    ПодключитьОбработчикСобытия(
        Элементы.ТаблицаТоваров,
        "ПриАктивизацииСтроки",
        "ОбработчикВыбораТовара"
    );
    
КонецПроцедуры

Процедура ОбработчикВыбораТовара(Элемент)
    
    // Эта процедура вызвется при выборе товара
    ТекущаяСтрока = Элементы.ТаблицаТоваров.ТекущаяСтрока;
    ТекущийТовар = Объект.Товары[ТекущаяСтрока];
    
    // Обновить описание
    Форма.Описание = ТекущийТовар.Описание;
    
КонецПроцедуры

Отключение подписки (важно для утечек памяти!)

// При закрытии формы ОБЯЗАТЕЛЬНО отключить подписку

Процедура ПриОткрытииФормы(Отмена, СтандартнаяОбработка)
    ПодключитьОбработчикСобытия(
        Объект,
        "ПриЗаписи",
        "МояОбработка"
    );
КонецПроцедуры

Процедура ПриЗакрытииФормы(ВозвращаемоеЗначение)
    // ОБЯЗАТЕЛЬНО отключить подписку!
    ОтключитьОбработчикСобытия(
        Объект,
        "ПриЗаписи",
        "МояОбработка"
    );
КонецПроцедуры

// Если не отключить подписку:
// - Объект не может быть удалён из памяти
// - Утечка памяти
// - Процедура может вызваться неожиданно

События уровня приложения

// В управляемом приложении можно подписаться
// на глобальные события

Процедура ПриНачалеРаботыСистемы(Отмена)
    // Подписываемся на событие, выдвигаемое другим модулем
    ПодключитьОбработчикСобытия(
        ЭтотОбъект,
        "ПользовательЗашёл",
        "ОбработчикВхода"
    );
КонецПроцедуры

Процедура ОбработчикВхода(Параметры)
    Пользователь = Параметры.Пользователь;
    Сообщить("Привет, " + Пользователь + "!");
КонецПроцедуры

Выгенерировать событие

// Создать собственное событие
// В управляемом приложении

Процедура ПроцедураМодуля()
    // Выполнить действие
    
    // Выгенерировать событие для других модулей
    // (в управляемом приложении)
    ОповеститьОбИзменении();
    
    // В системных модулях это работает через события
КонецПроцедуры

Сравнение подходов

// БЕЗ подписки (прямой вызов):
Процедура СохранитьДокумент()
    Объект.Записать();
    ЛогироватьЗапись(Объект);
    ОтправитьУведомление(Объект);
    ОбновитьОтчет(Объект);
    // Жёсткая связь - если добавить новое действие,
    // нужно менять эту процедуру
КонецПроцедуры

// С подписками (слабая связь):
Процедура ПриНачалеРаботыСистемы(Отмена)
    ПодключитьОбработчикСобытия(Объект, "ПриЗаписи", "ЛогироватьЗапись");
    ПодключитьОбработчикСобытия(Объект, "ПриЗаписи", "ОтправитьУведомление");
    ПодключитьОбработчикСобытия(Объект, "ПриЗаписи", "ОбновитьОтчет");
    // Слабая связь - новые подписчики добавляются отдельно
КонецПроцедуры

Процедура СохранитьДокумент()
    Объект.Записать();
    // Все подписчики вызовутся автоматически
КонецПроцедуры

Чеклист при использовании подписок

  • Подписка создана правильно
  • Имя процедуры-обработчика совпадает
  • Объект, на который подписываемся, правильный
  • Подписка отключена при закрытии формы
  • Нет утечек памяти (циклических ссылок)
  • Обработчик не создаёт циклических вызовов
  • Проведено тестирование

Итого: подписка на событие это механизм, при котором процедура-обработчик автоматически вызывается при наступлении определённого события, реализуя слабую связь между компонентами приложения.