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