Как в 1С реализовать аналог «слушателя» событий из других языков?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработчики, приходящие в 1С из объектно-ориентированных языков, таких как Java или C#, часто сталкиваются с вопросом: как реализовать паттерн Наблюдатель (Observer), когда нужно «повесить» процедуру на определенное событие и ожидать его исполнения? В 1С нет прямого аналога классических слушателей (listeners), где можно передать ссылку на функцию как объект, но существуют платформенные механизмы, позволяющие реализовать схожую логику.

Разбираем специфику платформы 1С

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

1. Использование «Подписки на события»

Это штатный инструмент платформы. Хотя многие считают, что он предназначен только для стандартных действий (запись, проведение), его можно использовать и для собственных прикладных объектов. Вы создаете ПодпискуНаСобытие, указываете источник (ваш объект) и событие, а затем связываете их с обработчиком.

Минус подхода: подписки глобальны и определяются на этапе конфигурации, их нельзя динамически «добавить» или «удалить» во время выполнения кода.

2. Механизм оповещений (Оповестить / ОбработкаОповещения)

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

  1. Источник события вызывает метод Оповестить(<ИмяСобытия>, <Параметр>, <Источник>).
  2. Все открытые формы, ожидающие это событие, должны содержать процедуру ОбработкаОповещения(<ИмяСобытия>, <Параметр>, <Источник>).

Рассмотрим пример кода для инициатора:


// В модуле формы источника
Оповестить("ЗавершениеДлительнойОперации", Результат, ЭтотОбъект);

Рассмотрим пример кода для слушателя:


// В модуле формы приемника
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗавершениеДлительнойОперации" Тогда
        // Выполняем действия
    КонецЕсли;
КонецПроцедуры

3. Реализация через «Обработчик ожидания»

Для фоновых задач и многопоточных операций в 1С часто применяется метод ПодключитьОбработчикОжидания. Это позволяет реализовать модель опроса (polling), где система проверяет статус выполнения операции через заданные промежутки времени.

Разберем по шагам, как это работает:

  1. Вы запускаете фоновое задание, получая его УникальныйИдентификатор.
  2. Подключаете обработчик, который будет вызывать функцию проверки статуса.

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

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

4. Использование очереди событий (Регистры сведений)

Для сложных архитектур, когда нужно обеспечить гарантированную доставку сообщений между модулями, разработчики создают регистры сведений, которые выступают в роли «очереди».

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

Итоги и рекомендации

Не пытайтесь буквально перенести паттерны из Java в 1С. Платформа 1С:Предприятие диктует свои правила.

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

← На главную