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