Перенос документов между идентичными или схожими конфигурациями 1С — задача тривиальная лишь на первый взгляд. Когда возникает необходимость перенести документ не просто как объект (заголовок и табличные части), но и сохранить его движения (проводки по регистрам бухгалтерии или накопления) «один в один» из источника, стандартные механизмы Конвертации данных 2.0 часто преподносят сюрпризы. В ситуациях, когда требуется быстро и удобно перенести данные между различными конфигурациями, часто выясняется, что при загрузке документа типовые алгоритмы либо пытаются перепровести документ, заменяя присланные движения новыми, либо очищают их вовсе. Для этой задачи есть правила конвертации для переноса УПП в БП.
В этой статье мы подробно разберем, почему возникают ошибки вроде «Несоответствие версии или отсутствие записи базы данных (код 26)», и проанализируем несколько проверенных способов решения задачи.
Разберем ситуацию: вы настроили ПКО (Правило Конвертации Объектов) для документа и указали в ПКС (Правилах Конвертации Свойств) соответствие для наборов записей регистров (например, Хозрасчетный). На первый взгляд, всё верно, но при загрузке в приемнике движения оказываются пустыми или возникает ошибка версии. Рассмотрим причины этого явления:
Проведение. При выполнении метода Записать(РежимЗаписиДокумента.Проведение) платформа 1С автоматически инициирует очистку старых движений и формирование новых по алгоритмам, прописанным в модуле объекта приемника.УниверсальныйОбменДаннымиXML или встроенные механизмы синхронизации в БП 3.0 содержат код, который принудительно очищает коллекции движений перед записью объекта. Для таких случаев, например, когда выполняется перенос данных из 1С:УПП 1.3 в 1С:БП 3.0, приходится использовать специализированные правила обмена.Это наиболее радикальный, но эффективный метод, если вы используете встроенную синхронизацию данных. Как выяснилось в ходе обсуждения, проблема часто кроется в процедуре ПрочитатьОбъект модуля объекта обработки КонвертацияОбъектовИнформационныхБаз. Проанализируем, какие изменения необходимо внести для обеспечения записи присланных движений.
Найдем фрагмент кода, где обрабатывается РежимЗаписиДокумента.Проведение. В этом месте типовой код обычно отменяет проведение и пытается провести документ заново. Нам же нужно внедрить вставку, которая принудительно запишет движения из файла обмена, если это наш целевой документ.
ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
// Отключаем механизм регистрации объектов при отмене проведения документа.
Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
ОтменитьПроведениеОбъектаВИБ(Объект, ТипОбъекта, ЗаписатьОбъект);
// ВСТАВКА: Логика для сохранения движений из источника
Если ТипОбъекта = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда // Укажите ваш тип документа
Для Каждого ТекДвижение Из Объект.Движения Цикл
// Устанавливаем флаг загрузки, чтобы не срабатывали проверки в модулях наборов записей
ТекДвижение.ОбменДанными.Загрузка = Истина;
КонецЦикла;
// Записываем сам объект
ЗаписатьОбъектВИБ(Объект, ТипОбъекта, ЗаписатьОбъект, ОтправкаНазад);
// Записываем присланные движения из таблицы отложенной записи
ЗаписатьРегистрыБухгалтерии(Объект.Ссылка, ТаблицыОтложеннойЗаписиДвижений);
КонецЕсли;
// КОНЕЦ ВСТАВКИ
КонецЕсли;
Разберем, что делает этот код: мы принудительно устанавливаем свойство ОбменДанными.Загрузка = Истина для каждого набора движений и используем типовую функцию ЗаписатьРегистрыБухгалтерии, передавая в неё ТаблицыОтложеннойЗаписиДвижений, которые были наполнены парсером XML при чтении файла.
Если вы не хотите менять код системных обработок, можно попытаться решить задачу внутри самих правил конвертации. Рассмотрим использование события «ПослеЗагрузки» в ПКО документа. В этом событии мы можем вручную перехватить данные движений.
Для этого в источнике в событии «ПриВыгрузке» необходимо поместить таблицу движений в параметры объекта. А в приемнике выполнить следующий код:
// Событие ПослеЗагрузки в ПКО документа
Отказ = Истина; // Предотвращаем стандартную запись объекта обработкой КД
ИмяНабора = "Хозрасчетный"; // Имя вашего регистра
НаборЗаписей = Объект.Движения[ИмяНабора];
ТаблицаДвиженийРегистра = НаборЗаписей.Выгрузить(); // Получаем то, что пришло в коллекции
Если НЕ ОбъектНайден Тогда
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Важный нюанс: установив Отказ = Истина, мы берем ответственность за запись объекта на себя. Это позволяет избежать двойной записи и ошибки несоответствия версий КодСообщения = 26.
В конфигурациях, основанных на Библиотеке Стандартных Подсистем (например, БП 3.0), у большинства документов есть реквизит РучнаяКорректировка. Рассмотрим, как это поможет нам при переносе.
Если в приемнике у документа установлен флаг РучнаяКорректировка = Истина, типовые механизмы проведения при записи документа игнорируют формирование движений, полагая, что пользователь изменил их вручную. Выясним, как это использовать в КД 2.0:
РучнаяКорректировка.Истина или передавайте его из базы-источника.Записывать (не проводить!).В этом случае документ запишется со статусом Проведен = Истина (если это было передано), но программный код модуля объекта не будет перезаписывать ваши присланные проводки.
Если ваши базы абсолютно идентичны по структуре метаданных (одинаковые релизы конфигураций), проанализируем альтернативный инструмент — обработку ВыгрузкаЗагрузкаДанныхXML83.epf. Это сервисное решение работает на уровне платформенной сериализации. Для более гибкой работы часто применяется выгрузка и загрузка данных XML с дополнительными опциями, которая позволяет искать объекты по полям и фильтровать по подсистемам.
Преимущества этого метода:
UUID).Для переноса данных между не полностью идентичными конфигурациями лучше использовать адаптивную выгрузку и загрузку XML, которая обладает гибкими отборами. Это самый надежный способ, если нужно выполнить разовый перенос данных без долгой настройки правил в Конвертации данных.
При переносе проводок бухгалтерского учета обратите внимание на следующие моменты:
Код и Наименование в ПКО счета.Истина при программной записи. Это отключает проверки в модулях, что критично при переносе «исторических» данных. Если вам требуется передать данные в зашифрованном виде, может пригодиться универсальная выгрузка – загрузка с возможностью шифрования.Рассмотренные нами методы позволяют гибко подойти к решению задачи. Для разового переноса между одинаковыми конфигурациями лучше использовать Способ №4. Если же перенос является частью регулярной синхронизации, рекомендуем обратить внимание на Способ №3 с ручной корректировкой или Способ №1 с модификацией загрузочного модуля.