Зачем дорабатывать проведение документа через подписку?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Доработка проведения документа через подписку на события
Использование подписок на события для доработки проведения документов — это одна из ключевых техник в расширениях 1С конфигураций.
Почему использовать подписки
Преимущества подписок:
- Инкапсуляция: дополнительная логика отделена от стандартного кода
- Модульность: не нужно менять исходный модуль документа
- Обновляемость: расширение не ломается при обновлении конфигурации
- Переиспользуемость: одна подписка может применяться к разным документам
- Контролируемость: логика находится в одном месте
Альтернативные подходы и их недостатки
Прямое изменение модуля документа:
// ❌ Плохо: теряется при обновлении типовой конфигурации
Процедура ПриПроведении(Отмена, РежимПроведения) Экспорт
// Стандартная логика 1С
// Наша дополнительная логика
МояДополнительнаяОбработка();
КонецПроцедуры;
Расширение (Extension):
// Более правильно, но ограничено перекрытием методов
// Нельзя добавить логику "вокруг" стандартного кода
Процедура ПриПроведении(Отмена, РежимПроведения) Экспорт
// Полное переопределение
КонецПроцедуры;
Подписка на событие:
// ✅ Хорошо: максимальная гибкость
// Дополнительная логика не трогает стандартный код
Практические примеры
Пример 1: Дополнительные проверки при проведении
Процедура ПриПроведенииПриходнойНакладной(Источник, Отмена) Экспорт
// Проверка статуса товаров
Если НедопустимыеТовары(Источник.Товары) Тогда
Отмена = Истина;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Некоторые товары недопустимы";
Сообщение.Сообщить();
КонецЕсли;
// Заполнение дополнительных реквизитов
Источник.ДатаРегистрации = ТекущаяДата();
Источник.СотрудникПроведения = ПользователиИРоли.ТекущийПользователь();
КонецПроцедуры;
Пример 2: Запись в дополнительные регистры
Процедура ПриПроведенииДокумента(Источник, Отмена) Экспорт
Если Отмена Тогда
Возврат; // Если отмена проведения, не делаем ничего
КонецЕсли;
// Записываем в реестр платежей
НаборЗаписей = РегистрыСведений.РеестрПлатежей.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Документ.Значение = Источник.Ссылка;
НаборЗаписей.Отбор.Документ.Использование = Истина;
Запись = НаборЗаписей.Добавить();
Запись.Документ = Источник.Ссылка;
Запись.Сумма = Источник.Сумма;
Запись.Дата = Источник.Дата;
НаборЗаписей.Записать();
КонецПроцедуры;
Где регистрировать подписку
В модуле менеджера приложения:
Процедура ПриНачалеРаботыСистемы()
// Подписываемся на проведение разных документов
НовПодписка = Новый Подписка();
НовПодписка.Источник = Метаданные.Документы.ПриходнаяНакладная;
НовПодписка.Событие = "ПриПроведении";
НовПодписка.Обработчик = ОбщийМодуль.ОбработчикиПроведения;
ЦентрУведомлений.ПолучитьЦентрУведомлений().Подписать(НовПодписка);
КонецПроцедуры;
В расширении (наиболее правильно):
Процедура ПриНачалеРаботыСистемы(Контекст)
// Расширение автоматически подписывает на события
Подписка = Контекст.ЦентрУведомлений.СоздатьПодписку();
Подписка.Источник = Метаданные.Документы.ПриходнаяНакладная;
Подписка.Событие = "ПриПроведении";
Подписка.Обработчик = ОбщийМодуль.ДополнительнаяЛогика;
КонецПроцедуры;
Порядок вызова подписок
При проведении документа:
1. Вызывается модуль документа "ПриПроведении"
2. Выполняется стандартная логика 1С
3. Вызываются все зарегистрированные подписки
4. Выполняется дополнительная логика расширений
5. Документ проводится
Возможности и ограничения
Что можно делать в подписке:
- Добавлять проверки перед проведением
- Записывать данные в дополнительные регистры
- Отменять проведение (установить Отмена = Истина)
- Логировать события проведения
- Вызывать интеграции
Что нельзя делать:
- Менять стандартную логику проведения
- Обращаться к глобальным переменным
- Выполнять долгие операции (заблокирует проведение)
- Создавать новые документы (может вызвать deadlock)
Лучшие практики
1. Обработка ошибок:
Процедура ПриПроведении(Источник, Отмена)
Попытка
ВыполнитьДополнительнуюЛогику(Источник);
Исключение
Отмена = Истина;
ЗаписатьОшибку(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры;
2. Проверка отмены:
Процедура ПриПроведении(Источник, Отмена)
Если Отмена Тогда
Возврат; // Если уже отмена, не продолжаем
КонецЕсли;
// Логика
КонецПроцедуры;
3. Производительность:
- Минимизировать запросы к БД
- Использовать индексы
- Избегать циклов
- Кэшировать результаты
Использование подписок для доработки проведения — это правильный подход при разработке расширений, позволяющий добавлять функциональность без нарушения модульности и обновляемости системы.