Как настроить автоматическое проведение перенесенных документов в базе-приемнике при обмене через КД2?

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

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

Почему не стоит проводить документы сразу при загрузке объекта

Первая идея, которая часто приходит разработчику — написать команду проведения непосредственно в обработчике После загрузки объекта (на уровне правила конвертации объекта или конвертации в целом). Однако такой подход несет в себе серьезные технические риски. Проанализируем основные из них:

  1. Неполнота данных при потоковом чтении XML: Файл выгрузки читается последовательно. Если документ проводится в момент своего считывания, связанные с ним зависимые объекты (например, договоры, спецификации или документы-основания), описанные ниже по тексту XML-файла, еще физически отсутствуют в базе-приемнике. Это гарантированно вызовет ошибку проведения.
  2. Длинные транзакции и блокировки: Стандартная обработка загрузки часто выполняет запись порциями в транзакциях. Проведение ресурсоемких документов внутри открытой транзакции загрузки резко увеличивает риск взаимных блокировок и при любой ошибке откатывает загрузку всей пачки объектов.
  3. Отказ загрузки: Если один документ не сможет провестись (например, из-за нехватки остатков на момент загрузки), возникшее исключение может прервать весь процесс переноса данных.

Оптимальное решение: сбор документов и проведение после загрузки данных

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

Шаг 1. Накопление документов в обработчике «После загрузки объекта»

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

Посмотрим на пример реализации данного кода:


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

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

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

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


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

Параметры.Удалить("ТаблицаДокументов");

Важные особенности логики платформы 1С

Выделим ключевые технические нюансы, которые необходимо учитывать при проведении документов после загрузки:

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

Альтернативные варианты

В зависимости от архитектуры обмена можно использовать и другие подходы:

  1. Перенос движений (регистров): Если структуры метаданных источника и приемника идентичны, можно переносить готовые движения документов по регистрам без повторного проведения в приемнике. Однако при миграции между разными конфигурациями (например, из УПП в ERP) этот вариант неприменим из-за различий в структуре регистров.
  2. Отложенное проведение через БСП: В современных типовых конфигурациях при регулярном обмене документы загружаются непроведенными, а их проведение выполняется в фоновом режиме специальным регламентным заданием подсистемы БСП.
  3. Групповое перепроведение: Документы загружаются исключительно в режиме записи, а после завершения миграции администратор запускает типовую обработку «Групповое перепроведение документов» за перенесенный период.
← На главную