Разработчики, приходящие в 1С из объектно-ориентированных языков, таких как Java или C#, часто сталкиваются с вопросом: как реализовать паттерн Наблюдатель (Observer), когда нужно «повесить» процедуру на определенное событие и ожидать его исполнения? В 1С нет прямого аналога классических слушателей (listeners), где можно передать ссылку на функцию как объект, но существуют платформенные механизмы, позволяющие реализовать схожую логику.
Важно понимать, что в 1С событийная модель жестко ограничена инструментами платформы. Мы не можем в runtime создать динамический обработчик, передав ссылку на метод как аргумент, так как ссылки на функции в 1С — это строковые идентификаторы. Тем не менее, мы можем организовать процесс обработки событий, используя следующие подходы:
Это штатный инструмент платформы. Хотя многие считают, что он предназначен только для стандартных действий (запись, проведение), его можно использовать и для собственных прикладных объектов. Вы создаете ПодпискуНаСобытие, указываете источник (ваш объект) и событие, а затем связываете их с обработчиком.
Минус подхода: подписки глобальны и определяются на этапе конфигурации, их нельзя динамически «добавить» или «удалить» во время выполнения кода.
Если ваша задача — реализовать взаимодействие между формами, то наилучшим решением станет использование глобальных оповещений. Это классический вариант реализации паттерна Наблюдатель для GUI.
Оповестить(<ИмяСобытия>, <Параметр>, <Источник>).ОбработкаОповещения(<ИмяСобытия>, <Параметр>, <Источник>).Рассмотрим пример кода для инициатора:
// В модуле формы источника
Оповестить("ЗавершениеДлительнойОперации", Результат, ЭтотОбъект);
Рассмотрим пример кода для слушателя:
// В модуле формы приемника
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗавершениеДлительнойОперации" Тогда
// Выполняем действия
КонецЕсли;
КонецПроцедуры
Для фоновых задач и многопоточных операций в 1С часто применяется метод ПодключитьОбработчикОжидания. Это позволяет реализовать модель опроса (polling), где система проверяет статус выполнения операции через заданные промежутки времени.
Разберем по шагам, как это работает:
УникальныйИдентификатор.
// Подключаем проверку каждые 5 секунд
ПодключитьОбработчикОжидания("ПроверитьЗадание", 5);
Процедура ПроверитьЗадание() Экспорт
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
// Событие обработано, отключаем ожидание
ОтключитьОбработчикОжидания("ПроверитьЗадание");
КонецЕсли;
КонецПроцедуры
Для сложных архитектур, когда нужно обеспечить гарантированную доставку сообщений между модулями, разработчики создают регистры сведений, которые выступают в роли «очереди».
Проанализируем ситуацию: один модуль пишет запись в регистр, а регламентное задание считывает эти записи и вызывает нужные функции. Это позволяет «развязать» отправителя и получателя, обеспечивая устойчивость системы к сбоям.
Не пытайтесь буквально перенести паттерны из Java в 1С. Платформа 1С:Предприятие диктует свои правила.
Оповестить.ПодключитьОбработчикОжидания.Сочетая эти подходы, вы сможете выстроить гибкую и управляемую событийную модель, соответствующую стандартам разработки на платформе 1С.