Перенос данных между разными версиями платформы — это классическая задача, с которой сталкиваются специалисты при обновлении или миграции систем. В ситуации, когда реквизитный состав справочников в базах на платформе 8.1 и 8.2 полностью идентичен, процесс значительно упрощается, так как нам не требуется сложная трансформация данных. Рассмотрим подробнее несколько проверенных методов реализации этой задачи: от использования профессиональных инструментов до написания простых программных скриптов.
Если нам необходимо выполнить перенос корректно и системно, наиболее правильным путем будет использование конфигурации «Конвертация данных 2.1». Даже если структуры баз идентичны, этот инструмент обеспечит контроль целостности данных и корректный перенос ссылок.
Разберем по шагам, как подготовить необходимые файлы, если они не были найдены в стандартных каталогах:
.../tmplts/1c/Conversion/[версия]/ExtFiles.MD81Exp.epf. Она предназначена для выгрузки описания структуры справочника в файл XML.MD81Exp.epf в базе-источнике (8.1), выберем наш справочник и нажмем кнопку «Выгрузить». Полученный файл структуры загрузим в конфигурацию «Конвертация данных».V8Exch81.epf, а для загрузки в 8.2 — ее аналог для соответствующей версии платформы.Этот метод считается одним из самых эффективных, так как он позволяет избежать создания промежуточных файлов (XML, Excel или TXT). Мы установим прямое соединение между базами и перенесем элементы программно. Проанализируем пример кода, который можно запустить в базе-приемнике (8.2):
// Устанавливаем соединение с базой 8.1
Connector = Новый COMОбъект("V81.COMConnector");
Connection = Connector.Connect("Srvr='ИмяСервера';Ref='ИмяБазы';Usr='Логин';Pwd='Пароль'");
// Выбираем данные из справочника в источнике
ВыборкаИсточник = Connection.Справочники.Номенклатура.Выбрать();
Пока ВыборкаИсточник.Следующий() Цикл
// Проверяем, существует ли уже такой элемент (например, по коду или наименованию)
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
// Заполняем реквизиты. Так как структуры совпадают, обращаемся напрямую
НовыйЭлемент.Наименование = ВыборкаИсточник.Наименование;
НовыйЭлемент.Код = ВыборкаИсточник.Код;
НовыйЭлемент.Артикул = ВыборкаИсточник.Артикул;
// Если есть иерархия, нужно отдельно обрабатывать родителя
Попытка
НовыйЭлемент.Записать();
Исключение
Сообщить("Ошибка при записи элемента: " + ВыборкаИсточник.Наименование);
КонецПопытки;
КонецЦикла;
Важно помнить, что при использовании COMConnector необходимо, чтобы на компьютере были зарегистрированы соответствующие библиотеки нужных версий платформ. Этот способ идеально подходит для разового переноса небольших и средних справочников.
Если нам нужно перенести «плоский» справочник без сложных ссылочных связей, выясним, как это сделать без написания кода. Для этого воспользуемся типовой обработкой ЗагрузкаДанныхИзТабличногоДокумента.epf.
Выполним следующие действия:
Рассмотрим ситуацию, когда нам нужно быстро перенести объект целиком, сохраняя все его свойства. Платформа 1С поддерживает механизмы XDTO и базовую XML-сериализацию, которые работают очень быстро при идентичных метаданных.
Пример кода для выгрузки из 8.1:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\TransferData.xml");
ЗаписьXML.ЗаписатьОбъявлениеXML();
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеОбъекта = Выборка.ПолучитьОбъект();
ЗаписатьXML(ЗаписьXML, ДанныеОбъекта);
КонецЦикла;
ЗаписьXML.Закрыть();
В базе на платформе 8.2 мы проделаем обратную операцию для чтения:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\TransferData.xml");
Пока ВозможноЧтениеXML(ЧтениеXML) Цикл
Данные = ПрочитатьXML(ЧтениеXML);
Если Данные <> Неопределено Тогда
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Обратите внимание: использование свойства ОбменДанными.Загрузка = Истина позволяет обойти прикладные проверки в модулях объекта (например, проверки при записи), что критически важно для корректного переноса исторических данных.
Проанализируем технический момент, который часто упускают из виду. Каждый объект в 1С имеет внутренний уникальный идентификатор (GUID). Если на переносимый справочник ссылаются другие данные (документы, другие справочники), которые вы планируете переносить позже, крайне важно сохранять эти идентификаторы.
При использовании Конвертации данных или метода XML-сериализации ссылки сохраняются автоматически. Однако при ручном создании элементов через COM-соединение или Excel будут созданы новые GUID. Чтобы этого избежать при программном переносе, используйте следующий подход:
// В базе 8.2 создаем ссылку с тем же GUID, что был в 8.1
УникальныйИдентификатор = Новый УникальныйИдентификатор(СтрокаGUIDИзИсточника);
НоваяСсылка = Справочники.НашСправочник.ПолучитьСсылку(УникальныйИдентификатор);
// Создаем объект с этой ссылкой
НовыйОбъект = Справочники.НашСправочник.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
// ... заполнение реквизитов ...
НовыйОбъект.Записать();
Выбор метода зависит от объема данных и ваших навыков программирования. Если конфигурации абсолютно идентичны (например, это одна и та же конфигурация, переведенная на новую платформу), самым простым решением будет использование типовой обработки «Выгрузка и загрузка данных XML», которая работает без настройки правил обмена и сохраняет всю структуру ссылочных связей. Если же справочник переносится в другую конфигурацию, рекомендуем остановиться на Конвертации данных.