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