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

Зачем дорабатывать проведение документа через подписку?

2.3 Middle🔥 201 комментариев
#БСП#Запросы и оптимизация#Стандарты разработки

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

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

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

Доработка проведения документа через подписку на события

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

Почему использовать подписки

Преимущества подписок:

  • Инкапсуляция: дополнительная логика отделена от стандартного кода
  • Модульность: не нужно менять исходный модуль документа
  • Обновляемость: расширение не ломается при обновлении конфигурации
  • Переиспользуемость: одна подписка может применяться к разным документам
  • Контролируемость: логика находится в одном месте

Альтернативные подходы и их недостатки

Прямое изменение модуля документа:

// ❌ Плохо: теряется при обновлении типовой конфигурации
Процедура ПриПроведении(Отмена, РежимПроведения) Экспорт
    // Стандартная логика 1С
    // Наша дополнительная логика
    МояДополнительнаяОбработка();
КонецПроцедуры;

Расширение (Extension):

// Более правильно, но ограничено перекрытием методов
// Нельзя добавить логику "вокруг" стандартного кода
Процедура ПриПроведении(Отмена, РежимПроведения) Экспорт
    // Полное переопределение
КонецПроцедуры;

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

// ✅ Хорошо: максимальная гибкость
// Дополнительная логика не трогает стандартный код

Практические примеры

Пример 1: Дополнительные проверки при проведении

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

Пример 2: Запись в дополнительные регистры

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

Где регистрировать подписку

В модуле менеджера приложения:

Процедура ПриНачалеРаботыСистемы()
    // Подписываемся на проведение разных документов
    НовПодписка = Новый Подписка();
    НовПодписка.Источник = Метаданные.Документы.ПриходнаяНакладная;
    НовПодписка.Событие = "ПриПроведении";
    НовПодписка.Обработчик = ОбщийМодуль.ОбработчикиПроведения;
    
    ЦентрУведомлений.ПолучитьЦентрУведомлений().Подписать(НовПодписка);
КонецПроцедуры;

В расширении (наиболее правильно):

Процедура ПриНачалеРаботыСистемы(Контекст)
    // Расширение автоматически подписывает на события
    Подписка = Контекст.ЦентрУведомлений.СоздатьПодписку();
    Подписка.Источник = Метаданные.Документы.ПриходнаяНакладная;
    Подписка.Событие = "ПриПроведении";
    Подписка.Обработчик = ОбщийМодуль.ДополнительнаяЛогика;
КонецПроцедуры;

Порядок вызова подписок

При проведении документа:

1. Вызывается модуль документа "ПриПроведении"
2. Выполняется стандартная логика 1С
3. Вызываются все зарегистрированные подписки
4. Выполняется дополнительная логика расширений
5. Документ проводится

Возможности и ограничения

Что можно делать в подписке:

  • Добавлять проверки перед проведением
  • Записывать данные в дополнительные регистры
  • Отменять проведение (установить Отмена = Истина)
  • Логировать события проведения
  • Вызывать интеграции

Что нельзя делать:

  • Менять стандартную логику проведения
  • Обращаться к глобальным переменным
  • Выполнять долгие операции (заблокирует проведение)
  • Создавать новые документы (может вызвать deadlock)

Лучшие практики

1. Обработка ошибок:

Процедура ПриПроведении(Источник, Отмена)
    Попытка
        ВыполнитьДополнительнуюЛогику(Источник);
    Исключение
        Отмена = Истина;
        ЗаписатьОшибку(ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры;

2. Проверка отмены:

Процедура ПриПроведении(Источник, Отмена)
    Если Отмена Тогда
        Возврат; // Если уже отмена, не продолжаем
    КонецЕсли;
    // Логика
КонецПроцедуры;

3. Производительность:

  • Минимизировать запросы к БД
  • Использовать индексы
  • Избегать циклов
  • Кэшировать результаты

Использование подписок для доработки проведения — это правильный подход при разработке расширений, позволяющий добавлять функциональность без нарушения модульности и обновляемости системы.

Зачем дорабатывать проведение документа через подписку? | PrepBro