Перенос накопленного массива данных между двумя одинаковыми конфигурациями 1С — распространенная задача. Типичный сценарий: создание архивной копии базы для закрытия месяца, выверки учета и исправления ошибок с последующим возвратом накопленных в рабочей базе оперативных документов обратно в исправленную копию. Рассмотрим, какие механизмы платформы использовать для решения этой задачи, как избежать критического разрастания файлов обмена и защитить данные от повреждения.
Обязательное правило: перед началом любых масштабных операций загрузки данных всегда создаем резервную копию базы-приемника.
При попытке выгрузить данные за несколько недель или месяцев стандартными универсальными средствами разработчики часто сталкиваются с тем, что файл выгрузки занимает десятки гигабайт, а процесс зависает на сутки. Проанализируем, почему это происходит:
ХранилищеЗначения, при сериализации кодируются в Base64, что увеличивает их размер на треть.ПередЗаписью и ПриЗаписи, повторно валидируя каждый реквизит.Для конфигураций с полностью идентичной структурой метаданных базовым инструментом является внешняя обработка с диска ИТС «Выгрузка и загрузка данных XML» (ВыгрузкаЗагрузкаДанныхXML.epf). В отличие от обработки «Универсальный обмен данными XML», она не требует составления правил конвертации и оперирует прямыми структурами метаданных платформы.
Разберем по шагам правильную настройку выгрузки:
Если объем данных велик, а ручная выгрузка XML-файлов занимает много времени, рассмотрим механизм планов обмена. В платформе 1С сериализация данных через сообщения обмена оптимизирована на уровне ядра:
ПланОбмена без признака РИБ.ПланыОбмена.ЗарегистрироватьИзменения().ЗаписьСообщенияОбмена. Платформа сериализует только дельту изменений в компактный формат.Посмотрим на пример программной регистрации документов по периоду:
УзелОбмена = ПланыОбмена.ОбменДанными.НайтиПоКоду("КопияБазы");
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(НачалоПериода, КонецПериода);
Пока Выборка.Следующий() Цикл
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.Ссылка);
КонецЦикла;
Для автоматизации переноса без создания тяжелых промежуточных файлов на диске используем прямое подключение к базе через V83.COMConnector. Загрузка выполняется в контексте целевой базы порциями с управлением транзакциями.
Рассмотрим пример создания объектов с отключением проверок через свойство ОбменДанными.Загрузка:
Подключение = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "Srvr=""ServerName"";Ref=""SourceBase"";Usr=""Admin"";Pwd=""Password"";";
Попытка
БазаИсточник = Подключение.Connect(ПараметрыПодключения);
Исключение
ВызватьИсключение "Не удалось подключиться к базе-источнику: " + ОписаниеОшибки();
КонецПопытки;
Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка,
| Реализация.Номер КАК Номер,
| Реализация.Дата КАК Дата,
| Реализация.Организация.УникальныйИдентификатор КАК ОрганизацияGUID,
| Реализация.Контрагент.УникальныйИдентификатор КАК КонтрагентGUID
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоПериода);
Запрос.УстановитьПараметр("ДатаОкончания", КонецПериода);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого СтрокаCOM Из Результат Цикл
GUID_Документа = СтрокаCOM.Ссылка.УникальныйИдентификатор();
СсылкаВПриемнике = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID_Документа));
// Проверяем, существует ли документ в целевой базе
НовыйДокумент = СсылкаВПриемнике.ПолучитьОбъект();
Если НовыйДокумент = Неопределено Тогда
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.УстановитьСсылкуНового(СсылкаВПриемнике);
КонецЕсли;
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Дата = СтрокаCOM.Дата;
НовыйДокумент.Номер = СтрокаCOM.Номер;
// Поиск ссылочных реквизитов по GUID
ГУИД_Контрагента = Новый УникальныйИдентификатор(СтрокаCOM.КонтрагентGUID);
НовыйДокумент.Контрагент = Справочники.Контрагенты.ПолучитьСсылку(ГУИД_Контрагента);
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
При переносе данных между базами с общей историей сопоставление элементов справочников (номенклатура, контрагенты, склады) должно производиться по внутреннему уникальному идентификатору (UUID/GUID), а не по наименованию или коду. Обработка «Выгрузка и загрузка данных XML» по умолчанию выполняет поиск и сопоставление именно по GUID, что гарантирует сохранение ссылочной целостности и предотвращает задвоение записей.
После окончания загрузки большого массива документов обязательно выполняем следующие технические регламенты:
ОбновитьНумерациюОбъектов() для всех типов загруженных документов.