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

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переносе данных между базами с помощью конфигурации 1С:Конвертация данных 2.0 разработчики часто сталкиваются с ситуацией: в базе-приемнике у документа отображается признак проведения (зеленая пиктограмма), однако проводки и движения по регистрам отсутствуют. Если открыть такой документ вручную и нажать кнопку «Провести и закрыть», движения успешно формируются.

Разберем причины такого поведения платформы 1С и рассмотрим надежные варианты настройки правил обмена для корректного формирования движений.

Причины отсутствия движений при загрузке данных

Проанализируем техническую сторону работы механизма обмена данными:

  1. Разделение признака проведения и наборов записей: Реквизит Проведен является стандартным реквизитом документа, аналогичным реквизиту ПометкаУдаления. Сам по себе этот флаг указывает лишь на состояние объекта в источнике, но не гарантирует наличие записей в таблицах регистров приемника.
  2. Режим загрузки данных: По умолчанию при использовании обработки «Универсальный обмен данными в формате XML» запись объектов в приемнике выполняется с установленным свойством ОбменДанными.Загрузка = Истина. В этом режиме платформенные обработчики ПередЗаписью и ОбработкаПроведения в модуле объекта игнорируются, а документ просто сохраняется в базу с перенесенными значениями реквизитов. Это штатное поведение, необходимое для ускорения загрузки и предотвращения блокировок.
  3. Различие структур конфигураций: Если структуры регистров источника и приемника совпадают, обычно переносят сами наборы записей (движения). Если же конфигурации существенно различаются, переносить движения напрямую нецелесообразно — требуется вызывать процедуру проведения непосредственно в базе-приемнике.

Способ 1. Использование предопределенных параметров в ПКО

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

В обработчике «Перед загрузкой» правила конвертации объекта зададим контекстные переменные:


РежимЗаписи = "Проведение";
РежимПроведения = "Неоперативный";

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

Способ 2. Программное проведение в обработчике «После загрузки»

Если для формирования проводок требуется предварительно дозаполнить реквизиты объекта (например, счета учета или аналитику номенклатуры), проведение выполняется после их заполнения.

Посмотрим на пример кода в обработчике «После загрузки» ПКО:


Если Объект.Проведен Тогда
    // Снимаем режим загрузки для запуска проверок и формирования проводок
    Объект.ОбменДанными.Загрузка = Ложь;
    
    Попытка
        Объект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    Исключение
        Сообщить("Ошибка проведения документа " + Объект.Ссылка + ": " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Важно: При явном вызове метода Записать() необходимо сбрасывать флаг Объект.ОбменДанными.Загрузка = Ложь, так как в типовых конфигурациях в модуле объекта часто прописано условие отсечения: Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;.

Способ 3. Пакетное проведение в глобальном обработчике «После загрузки данных»

Проведение документов непосредственно в момент разбора XML-файла имеет существенный недостаток: связанные объекты (договоры, спецификации, документы-основания) могут находиться ниже по тексту файла и еще не существовать в базе. Из-за этого проведение завершится ошибкой.

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

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

Способ 4. Перенос движений регистров вместо повторного проведения

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

В таком случае документы записываются в режиме загрузки вместе со своими движениями, что исключает расхождения в проводках из-за различий в алгоритмах или учетной политике баз.

← На главную