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

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

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

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

Проанализируем механику работы платформы «1С:Предприятие» при загрузке данных. Свойство документа Проведен является обычным булевым реквизитом шапки. При сериализации объекта в файл обмена и последующем чтении это свойство переносится со значением Истина.

По умолчанию процесс записи любого объекта в базу-приемник выполняется в режиме РежимЗаписиДокумента.Запись. При обычной записи платформа не обращается к модулю объекта и не инициирует событие ОбработкаПроведения, в котором прописаны алгоритмы формирования проводок и записей регистров накопления. В итоге документ получает статус проведенного, но его таблицы движений остаются пустыми, если только они не переносились отдельно в виде наборов записей.

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


Если ОбменДанными.Загрузка Тогда
    Возврат;
КонецЕсли;

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

Ограничения и подводные камни проведения «на лету»

Прежде чем внедрять принудительное проведение документов в правила обмена, рассмотрим технические риски, с которыми можно столкнуться:

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

Способ 1. Использование глобальных обработчиков конвертации

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

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

В глобальном обработчике «После загрузки объекта» отбираем все загружаемые документы со статусом проведения и сохраняем ссылки на них в массив. Создадим инициализацию списка и проверку типа:


// Проверяем, что загружаемый объект является документом и был проведен
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
    Если Ссылка.Проведен Тогда
        Если Не Параметры.Свойство("МассивДокументовКПроведению") Тогда
            Параметры.Вставить("МассивДокументовКПроведению", Новый Массив);
        КонецЕсли;
        Параметры.МассивДокументовКПроведению.Добавить(Ссылка);
    КонецЕсли;
КонецЕсли;

Далее перейдем в глобальный обработчик «После загрузки данных». В этом событии весь XML-файл уже прочитан, основные данные сохранены, и мы можем выполнить проведение каждого документа в отдельной транзакции через конструкцию Попытка ... Исключение:


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

Такой подход защищает общий процесс синхронизации от аварийного завершения: некорректные документы останутся непроведенными с фиксацией текста ошибки в журнале регистрации, а все валидные документы сформируют движения.

Способ 2. Установка режима записи в ПКО документов

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

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

РежимЗаписи = "Проведение";

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

Способ 3. Перенос готовых наборов записей регистров

Рассмотрим альтернативную архитектуру обмена, исключающую необходимость проведения документов на стороне приемника. Вместо проведения можно настроить правила конвертации для самих регистров (накопления, бухгалтерии, сведений).

При таком подходе:

  1. Из базы-источника выгружаются не только документы, но и готовые движения регистров с установленным отбором по регистратору.
  2. В базе-приемнике движения просто записываются с признаком ОбменДанными.Загрузка = Истина.
  3. Алгоритмы модуля проведения в приемнике вообще не вызываются.

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

Способ 4. Использование штатных регламентных заданий и механизмов БСП

Если обмен настраивается между типовыми конфигурациями на базе Библиотеки стандартных подсистем (БСП), разработчики рекомендуют отказаться от проведения документов непосредственно во время загрузки.

В БСП предусмотрен механизм отложенного проведения:

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