Почему не проводится документ при обмене через Конвертацию данных 2.0 и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Многие разработчики при настройке правил обмена в Конвертации данных 2.0 сталкиваются с ситуацией, когда документ после загрузки остается в статусе «Не проведен», хотя в коде обработчика После загрузки явно прописана команда проведения. Давайте разберем, почему это происходит и какие стратегии стоит использовать для решения этой задачи.

Выясняем причину: почему проведение не срабатывает «на лету»

Основная причина кроется в архитектуре платформы 1С. Когда выполняется обмен данными, система устанавливает флаг ОбменДанными.Загрузка = Истина. Этот режим критически важен для производительности и целостности данных:

Попытки форсировать проведение прямо внутри обработчика загрузки часто приводят к ошибкам транзакции или просто не приносят результата, так как после завершения работы обработчика система может принудительно переписать статус объекта.

Рассмотрим стратегию решения проблемы

Если вам необходимо добиться автоматического проведения, давайте проанализируем доступные методы реализации.

Способ 1: Использование расширений для контроля проведения

Как было отмечено в ходе обсуждения задачи, хорошим подходом является использование Расширений конфигурации. Вместо попыток провести документ в «неудобный» момент, мы можем расширить процедуры, которые отвечают за запись или обработку объекта.

Выясним, где именно происходит сброс статуса проведения, и в расширении добавим логику, которая принудительно вернет объекту статус «Проведен» уже после того, как управление выйдет из модуля обмена. Это более надежный путь, так как он не конфликтует с внутренними алгоритмами Конвертации данных.

Способ 2: Реализация отложенного проведения

Самый правильный с точки зрения архитектуры способ — это отложенное проведение. Рассмотрим его пошагово:

  1. В обработчике После загрузки мы не пытаемся проводить документ сразу. Вместо этого мы сохраняем ссылку на загруженный объект в специальный список, массив или регистр сведений.
  2. После того как все объекты в рамках одного сеанса обмена были записаны в базу, мы обращаемся к событию После загрузки всех объектов.
  3. В этом обработчике мы запускаем цикл по нашему списку ссылок.
  4. Для каждого объекта мы вызываем проведение, предварительно сбросив флаг загрузки:

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

Этот подход позволяет избежать блокировок и ошибок проведения, связанных с тем, что какие-то справочники или документы, на которые ссылается наш документ, еще не успели записаться или обработаться в базе-приемнике.

Способ 3: Настройки плана обмена

Прежде чем приступать к написанию кода, проанализируйте настройки Плана обмена в базе. Иногда в типовых решениях (таких как Управление торговлей или Розница) предусмотрены специальные опции или регламентные задания, которые отвечают за автоматическое проведение документов, полученных из обмена. Убедитесь, что вы не пытаетесь «изобрести велосипед» там, где уже есть штатный функционал системы.

Подведем итоги

Работая над этой задачей, помните, что обмен данными в 1С — это сложный процесс, где безопасность данных стоит на первом месте. Если документ не проводится, не пытайтесь «продавить» это решение в обработчике После загрузки. Лучше:

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

← На главную