При обновлении доработанных конфигураций (например, 1С:Управление торговлей 11) или исправлении ошибок в метаданных часто возникает ситуация: документы уже присутствуют в целевой базе, но по определенному регистру накопления движения были затерты или не сформировались. Попытка перенести движения из резервной или старой копии базы с помощью конфигурации «Конвертация данных 2.1» (КД 2) стандартным правилом для документа нередко приводит к тому, что обработка рапортует об успешной загрузке объектов, но в самой базе движения появляются лишь у единичных документов или отсутствуют вовсе.
Проанализируем технические причины такого поведения платформы 1С:Предприятие 8 и разберем проверенные способы восстановления движений.
Объект.Движения, платформа не сохраняет эти наборы в базу автоматически при обычном вызове Объект.Записать() в режиме РежимЗаписиДокумента.Запись. Для сохранения требуется явно взвести свойство Записывать = Истина у конкретного набора записей.ПередЗаписью и ПриЗаписи могут принудительно сбрасывать флаги записи движений или очищать наборы, если документ не перепроводится.Если перенос выполняется через ПКО документа, разберем по шагам, как заставить платформу зафиксировать набор записей при загрузке.
В конфигурации «Конвертация данных» откроем правило конвертации нашего документа и перейдем в обработчик «После загрузки» (или «При загрузке»). Напишем код, который принудительно выставляет признак записи для нужного набора движений:
Объект.Движения.ИмяРегистраНакопления.Записывать = Истина;
Также при настройке правил конвертации свойств (ПКС) для набора записей убедимся, что отключены параметры очистки или пропуска пустых коллекций.
Чтобы избежать влияния логики проведения документа, надежнее переносить не документ целиком, а непосредственно сам регистр накопления.
РегистрНакопленияЗапись.ИмяРегистра (или набор записей).Регистратор.При таком подходе платформа выполняет прямую запись в таблицу регистра через НаборЗаписей.Записать() с отбором по регистратору, не вызывая логику модулей проведения документа.
Если требуется быстро перенести движения без развертывания сложных правил конвертации, рассмотрим эффективный вариант с использованием сериализации в файл.
В исходной базе создадим и выполним обработку, которая выгрузит наборы записей по нужным регистраторам в таблицу значений:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ДокументСсылка");
ТЗ.Колонки.Добавить("Движения");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Регистр.Регистратор КАК Регистратор
|ИЗ
| РегистрНакопления.ИмяРегистра КАК Регистр";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Регистратор.ПолучитьОбъект();
Если ДокОбъект = Неопределено Тогда
Продолжить;
КонецЕсли;
Набор = ДокОбъект.Движения.ИмяРегистра;
Набор.Прочитать();
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.ДокументСсылка = Выборка.Регистратор;
СтрокаТЗ.Движения = Набор.Выгрузить();
КонецЦикла;
ЗначениеВФайл("C:\MovementsData.dat", ТЗ);
Затем в целевой базе прочитаем сохраненный файл и загрузим движения напрямую в наборы записей целевых документов:
ТЗ = ЗначениеИзФайла("C:\MovementsData.dat");
Для Каждого Стр Из ТЗ Цикл
// Ищем документ в новой базе по ссылке или реквизитам поиска
ДокСсылка = Стр.ДокументСсылка;
Если Не ЗначениеЗаполнено(ДокСсылка) Тогда
Продолжить;
КонецЕсли;
НаборПриемник = РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей();
НаборПриемник.Отбор.Регистратор.Установить(ДокСсылка);
НаборПриемник.Загрузить(Стр.Движения);
НаборПриемник.Записать(Истина);
КонецЦикла;
Если базы имеют идентичные метаданные по данному регистру, а ключевые объекты (документы, справочники) переносились с сохранением Уникального Идентификатора (GUID), воспользуемся стандартной обработкой ВыгрузкаЗагрузкаДанныхXML.epf: