Вопрос архитектуры подписок на события в 1С является классической дилеммой для разработчиков. С одной стороны, хочется сохранить чистоту дерева метаданных, с другой — обеспечить удобство поддержки и высокую скорость работы системы. В данной статье мы детально проанализируем подходы к созданию подписок, разберем аргументы за и против каждого метода и выясним, какой вариант считается эталонным с точки зрения современных стандартов разработки.
Этот подход предполагает создание отдельной подписки на каждую конкретную бизнес-задачу. Например, вместо одной общей подписки ПередЗаписью для всех документов, создаются подписки вида ПроверитьЗаполнениеАкцизов, ОбновитьСтатусыЗаказов или СформироватьДвиженияПоВозвратам. Разберем преимущества этого метода:
Данный подход предполагает создание одной подписки (например, ОбщийОбработчикПередЗаписью), в которую включены все необходимые типы объектов. Вся логика в этом случае выносится в программный код модуля.
Проанализируем пример реализации такой подписки:
Процедура ОбщийОбработчикПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
ТипИсточника = ТипЗнч(Источник);
Если ТипИсточника = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
ОбработатьРеализацию(Источник);
ИначеЕсли ТипИсточника = Тип("ДокументОбъект.ВозвратТоваровОтКлиента") Тогда
ОбработатьВозврат(Источник);
КонецЕсли;
// Общая логика для всех типов
ДобавитьКомментарийОбИсточнике(Источник);
КонецПроцедуры
Основные аргументы "за":
Во-первых, это гарантирует строгую очередность выполнения. В 1С порядок выполнения разных подписок на одно событие определяется их положением в дереве объектов (сверху вниз). Однако при большом количестве подписок разработчику сложно контролировать, какая из них сработает первой. Внутри одной процедуры порядок вызовов функций определяется кодом, что гораздо прозрачнее.
Во-вторых, дерево метаданных остается "чистым". Вам не нужно пролистывать сотни объектов в поиске нужного обработчика.
Рассмотрим вопрос быстродействия подробнее. Существует мнение, что одна подписка работает быстрее, так как платформе не нужно многократно инициализировать контекст вызова. Выясним причину:
ТипЗнч() в коде 1С происходит крайне быстро.Однако на практике разница в производительности составляет сотые доли секунды. В масштабах одного документа это незаметно, но при массовой загрузке данных или групповом проведении документов оптимизация количества подписок может дать ощутимый прирост.
Проанализируем, как эта задача решена в Библиотеке стандартных подсистем (БСП). Фирма «1С» рекомендует использовать функциональную группировку. Это "золотая середина" между двумя крайностями.
Суть метода заключается в том, что подписки разделяются не по документам и не по событиям "вообще", а по подсистемам. Рассмотрим на примерах имен подписок из типовых конфигураций:
ВерсионированиеОбъектовПриЗаписи — отвечает только за историю изменений.ОбменДаннымиСобытиеПриЗаписи — отвечает только за регистрацию изменений для обмена.ПрефиксацияОбъектовПриУстановкеНовогоНомера — только для логики номеров.Преимущества функциональной группировки:
При выборе стратегии важно помнить о расширениях конфигурации. Если вы разрабатываете подписки в расширении, помните правило: сначала всегда выполняются подписки основной конфигурации, а затем — подписки расширений в порядке подключения самих расширений. Если ваша логика зависит от данных, которые должна подготовить "типовая" подписка, разделение на разные подписки может быть оправдано именно для соблюдения этого порядка.
Разберем по шагам, как стоит проектировать подписки в современном проекте:
ОбработкаПроведенияЧекаККМ и вызовите из неё три процедуры.КонтрольАкцизныхМарокПередЗаписьюДокумента.Таким образом, использование функционально-ориентированного подхода позволяет достичь баланса между производительностью платформы и удобством сопровождения кода программистами.