Предыстория:
Конфигурация 1С на платформе 8.3. В ней есть замечательный механизм "поиск и замена ссылок". Переносил данные из нескольких баз на платформе 7.7 в одну базу на платформе 8.3. Элементы некоторые справочников задублировались (ключевые поля имели незначительные отличия в базах, хотя описывали одну сущность). Использовав механизм "поиска и замены" свернул эти справочники. Через несколько рабочих дней выяснилось, что пропало одно подразделение. Восстановил копию, проверил, на это подразделение в копии более 7 тысяч ссылок. Предприятие отработало на свернутой базе уже несколько дней, восстанавливаться из копии не вариант.
1) С чего начал: Функция НайтиПоСсылкам(МассивСсылок) - возвращает таблицу значений, содержащую Описание метаданных и ссылку на объект, содержащий искомую ссылку. Не все прошло гладко, поэтому некоторые документы догружал, получив выборку ссылок запросом. Вначале перенес элементы справочников, которые сворачивались, и которые содержались в документах со ссылкой на восстанавливаемое подразделение.
Для выгрузки использовал вот такой кусок кода:
//Выгрузка объектов (справочников, документов) в xml используя сериализацию
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
// допустим у нас есть Выборка из запроса, которая содержит ссылки на объекты
Пока Выборка.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("НовыйОбъект");
лОбъект = Выборка.Ссылка.ПолучитьОбъект();
ЗаписатьXML(ЗаписьXML,лОбъект);
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
Для загрузки:
//Загрузка объектов (справочников, документов) из файла xml используя сериализацию
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл(ИмяФайла);
ЧтениеХМЛ.Прочитать(); // получили Root
Пока ЧтениеХМЛ.Прочитать() Цикл
Если (ЧтениеХМЛ.Имя = " НовыйОбъект ") И (ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда
ЧтениеХМЛ.Прочитать();
Если ВозможностьЧтенияXML(ЧтениеХМЛ) Тогда
ЗагружаемыйОбъект = ПрочитатьXML(ЧтениеХМЛ);
ЗагружаемыйОбъект.Записать(); // непосредственная запись объекта в базу
КонецЕсли;
КонецЕсли;
КонецЦикла;
2) Перепровел документы, но не все записи регистров сведений формируются при проведении документов.
Регистры сведений переносил через сериализацию таблицы значений.
В чем плюсы:
1) в копии выбрал данные из регистра запросом по определенному фильтру и результат выгрузил в таблицу значений (в примере тз), тз выгрузил в xml.
Код для выгрузки:
//Выгрузка таблицы значений в xml используя сериализацию
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
СериализаторXDTO.ЗаписатьXML(ЗаписьXML,тз);
ЗаписьXML.Закрыть();
2) в базе получателе (напоминаю, что это наследник копии, из которой идет перенос данных, т.е. объекты по-умолчанию существуют) загрузил данные в таблицу значений.
//Загрузка таблицы значений из xml используя сериализацию
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст());
ТипОбъектаXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core","ValueTable");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
ОбъектXDTO.Проверить();
ЧтениеXML.Закрыть();
тз = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
Таблица значений содержит уже ссылки на объекты текущей базы, ничего не нужно искать или сопоставлять. Ну, а дальше перебирал строки таблицы значений и по фильтру через МенеджерЗаписей считывал данные из текущей базы и подменял их на данные из копии, которые у меня содержались с строках таблицы значений.