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