Как правильно организовать подписки на события в 1С: одна общая или много мелких?

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

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

Вариант 1: Множество мелких функциональных подписок

Этот подход предполагает создание отдельной подписки на каждую конкретную бизнес-задачу. Например, вместо одной общей подписки ПередЗаписью для всех документов, создаются подписки вида ПроверитьЗаполнениеАкцизов, ОбновитьСтатусыЗаказов или СформироватьДвиженияПоВозвратам. Разберем преимущества этого метода:

  1. Соблюдение принципа Single Responsibility (Принцип единственной ответственности). Каждая подписка делает ровно одну вещь. Это упрощает понимание логики системы: взглянув на дерево метаданных, разработчик сразу видит, какие механизмы задействованы для данного объекта.
  2. Удобство командной разработки. Рассмотрим ситуацию при использовании хранилища конфигурации. Если разные программисты работают над разными задачами (один правит логику бонусов, другой — интеграцию с логистикой), они не будут мешать друг другу, так как каждый захватывает свою подписку. В случае с "одной мега-подпиской" возникла бы очередь на редактирование общего модуля и самой подписки.
  3. Гибкость настройки состава типов. Для каждой мелкой подписки можно указать свой уникальный набор источников (документов или справочников). Нет необходимости включать в составной тип лишние объекты, которые не относятся к данной задаче.

Вариант 2: Одна универсальная подписка на событие

Данный подход предполагает создание одной подписки (например, ОбщийОбработчикПередЗаписью), в которую включены все необходимые типы объектов. Вся логика в этом случае выносится в программный код модуля.

Проанализируем пример реализации такой подписки:


Процедура ОбщийОбработчикПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    ТипИсточника = ТипЗнч(Источник);
    
    Если ТипИсточника = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
        ОбработатьРеализацию(Источник);
    ИначеЕсли ТипИсточника = Тип("ДокументОбъект.ВозвратТоваровОтКлиента") Тогда
        ОбработатьВозврат(Источник);
    КонецЕсли;
    
    // Общая логика для всех типов
    ДобавитьКомментарийОбИсточнике(Источник);

КонецПроцедуры

Основные аргументы "за":

Во-первых, это гарантирует строгую очередность выполнения. В 1С порядок выполнения разных подписок на одно событие определяется их положением в дереве объектов (сверху вниз). Однако при большом количестве подписок разработчику сложно контролировать, какая из них сработает первой. Внутри одной процедуры порядок вызовов функций определяется кодом, что гораздо прозрачнее.

Во-вторых, дерево метаданных остается "чистым". Вам не нужно пролистывать сотни объектов в поиске нужного обработчика.

Анализ производительности: что быстрее?

Рассмотрим вопрос быстродействия подробнее. Существует мнение, что одна подписка работает быстрее, так как платформе не нужно многократно инициализировать контекст вызова. Выясним причину:

Однако на практике разница в производительности составляет сотые доли секунды. В масштабах одного документа это незаметно, но при массовой загрузке данных или групповом проведении документов оптимизация количества подписок может дать ощутимый прирост.

Рекомендации БСП и стандарты «1С»

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

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

Преимущества функциональной группировки:

  1. Модульность: Вы можете легко перенести функционал (например, подсистему "Рассылка уведомлений") в другую конфигурацию вместе со своими подписками.
  2. Предсказуемость: Легко найти код, отвечающий за конкретный функционал.
  3. Оптимальность: Количество подписок остается в разумных пределах (обычно 5-10 на один объект вместо 50).

Особенности использования расширений

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

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

Разберем по шагам, как стоит проектировать подписки в современном проекте:

  1. Избегайте крайности "одна подписка на всё". Это превращает общий модуль в "помойку" кода и блокирует работу команды в хранилище.
  2. Не создавайте подписки под каждый мелкий "чих". Если вам нужно выполнить три действия в рамках одной бизнес-логики (например, при проведении чека обновить остаток, начислить бонусы и отправить SMS), создайте ОДНУ подписку ОбработкаПроведенияЧекаККМ и вызовите из неё три процедуры.
  3. Группируйте по подсистемам. Это самый верный путь. Каждая функциональная подсистема (Логистика, УчетЗатрат, Интеграция) должна иметь свои точки входа в виде подписок.
  4. Именуйте правильно. Название подписки должно отражать СУТЬ действия и СОБЫТИЕ. Например: КонтрольАкцизныхМарокПередЗаписьюДокумента.

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

← На главную