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