Перенос данных между различными конфигурациями 1С — задача, с которой рано или поздно сталкивается любой разработчик. В нашем случае мы рассматриваем ситуацию, когда необходимо перенести несколько справочников из тяжеловесной УПП 1.3 в абсолютно пустую конфигурацию на платформе 8.3.12. Мы разберем по шагам несколько эффективных методов: от использования стандартных обработок до программного переноса через COM-соединение.
Прежде чем переносить сами данные (записи в таблицах БД), нам необходимо подготовить структуру в целевой базе. Если мы просто создадим справочники вручную, велика вероятность ошибиться в типах реквизитов или их именах, что сделает автоматическую загрузку данных невозможной. Рассмотрим, как сделать это правильно через механизм сравнения.
Разберем последовательность действий:
.cf).Проанализируем ситуацию с общими модулями. Часто справочники содержат код в модуле объекта или менеджера, который обращается к общим модулям УПП. Чтобы конфигурация прошла проверку синтаксиса, нам придется либо перенести нужные модули, либо временно закомментировать вызовы функций, которые в новой базе не нужны.
Мало кто пользуется этим приемом, но он крайне эффективен для небольшого объема метаданных. Мы можем открыть два окна Конфигуратора одновременно: одно с исходной базой УПП, другое — с пустой.
Выполним следующие шаги:
Ctrl+C.Ctrl+V.Этот метод быстрее сравнения, так как позволяет точечно переносить объекты, не дожидаясь полного сопоставления огромной конфигурации УПП с пустой базой.
Когда структура метаданных в обеих базах стала идентичной (совпадают имена справочников, имена реквизитов и их типы), мы можем приступить к переносу самих записей. Самый простой инструмент для этого — универсальная обработка ВыгрузкаЗагрузкаДанныхXML82.epf (она корректно работает и на платформе 8.3).
Рассмотрим алгоритм работы с обработкой:
Важный нюанс: Данная обработка переносит данные "один в один", сохраняя УникальныйИдентификатор (GUID) каждого объекта. Это позволит в будущем синхронизировать объекты без создания дублей.
Если нам не нужна полная идентичность структур или мы хотим трансформировать данные в процессе (например, объединить два поля в одно), лучше всего написать простую процедуру. Мы подключимся из новой базы к УПП и прочитаем данные напрямую.
Разберем пример кода для переноса справочника Контрагенты:
Процедура ПеренестиКонтрагентовЧерезCOM()
// Создаем соединение с базой УПП
COMConnector = Новый COMОбъект("V83.COMConnector");
СтрокаСоединения = "Srvr='ServerName';Ref='UPP_Base';Usr='admin';Pwd='123';";
Попытка
Соединение = COMConnector.Connect(СтрокаСоединения);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Выбираем данные из УПП
ВыборкаУПП = Соединение.Справочники.Контрагенты.Выбрать();
Пока ВыборкаУПП.Следующий() Цикл
// Создаем элемент в новой базе
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.Наименование = ВыборкаУПП.Наименование;
НовыйЭлемент.ИНН = ВыборкаУПП.ИНН;
// Чтобы сохранить GUID, используем специальный метод
СсылкаУПП = Соединение.String(ВыборкаУПП.Ссылка.УникальныйИдентификатор());
НовыйGUID = Новый УникальныйИдентификатор(СсылкаУПП);
// УстановитьСсылкуНового работает до первой записи объекта
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(НовыйGUID));
Попытка
НовыйЭлемент.Записать();
Исключение
Сообщить("Не удалось записать: " + ВыборкаУПП.Наименование);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Этот метод хорош тем, что нам не нужно добиваться 100% схожести конфигураций. Мы можем программно сопоставить реквизит ПолноеНаименование из УПП с реквизитом Наименование в новой базе или пропустить ненужные группы элементов.
Если перенос планируется делать регулярно или структура данных в целевой базе сильно отличается, рекомендуется использовать конфигурацию Конвертация данных 2.0. Она позволяет создать правила обмена (XML), которые описывают логику сопоставления объектов.
Проанализируем шаги работы с КД 2.0:
MD82Exp.epf.xml.УниверсальныйОбменДаннымиXML для выгрузки, а в новой базе — её же для загрузки.Выясним причину возможных ошибок при переносе. Основная проблема — "битые ссылки". Если справочник Номенклатура ссылается на ЕдиницыИзмерения, а вы переносите только Номенклатуру, то в новой базе в поле единицы измерения будет пусто или отобразится "Объект не найден".
Чтобы этого избежать, при использовании ВыгрузкаЗагрузкаДанныхXML обязательно оставляйте включенным флаг "Выгружать объекты по ссылкам". В этом случае система автоматически найдет все связанные элементы и включит их в файл выгрузки, что обеспечит корректность данных в целевой базе.
Рассмотрим подробнее вопрос УникальныхИдентификаторов. При любом способе переноса (кроме ручного набора текста) старайтесь сохранять исходные GUID. В 1С это "ключ" к объекту. Если вы сохраните GUID, то в будущем сможете легко связать эти базы через COM или EnterpriseData, так как система будет понимать, что "Контрагент А" в УПП и "Контрагент А" в новой базе — это один и тот же физический объект, даже если их наименования изменятся.
Таким образом, для разового переноса пары справочников с минимальными затратами оптимальным будет сочетание Copy-Paste метаданных и обработки ВыгрузкаЗагрузкаДанныхXML.