В практике разработчика 1С часто возникает задача переноса данных между базами, которые имеют схожую конфигурацию, но различаются в деталях — например, префиксами в именах объектов. Когда требуется быстро и удобно перенести данные между различными конфигурациями, можно использовать простой менеджер данных, однако часто задачу приходится решать стандартными или программными средствами. Типичный случай: нужно перенести данные из регистра СоответствиеКиосков в одной базе в регистр ЕЮ_СоответствиеКиосков в другой. Стандартные механизмы обмена могут выдать ошибку из-за несовпадения типов.
В этой статье мы подробно разберем несколько способов решения этой задачи: от использования типовых обработок до написания компактного кода на языке 1С.
Это самый быстрый способ, не требующий написания правил обмена в «Конвертации данных» (поможет подсистема обмена данными для Конвертации Данных 2.0). Данная обработка (обычно это ВыгрузкаЗагрузкаДанныхXML.epf) предназначена для полной выгрузки объектов. Для более сложных сценариев, когда требуется отбор по любому выгружаемому объекту или поиск по полям, лучше использовать выгрузку и загрузку данных XML с дополнительными опциями.
Рассмотрим пошагово алгоритм действий:
СоответствиеКиосков. Настроим необходимые фильтры и нажмем кнопку «Выгрузить». Программа сформирует XML-файл.InformationRegisterRecordSet.СоответствиеКиосков.ЕЮ_СоответствиеКиосков. Воспользуемся текстовым редактором (для больших файлов лучше использовать Notepad++ или VS Code). Применим функцию «Найти и заменить» (Ctrl+H) и заменим все вхождения СоответствиеКиосков на ЕЮ_СоответствиеКиосков.Важное ограничение: Этот метод сработает только в том случае, если состав и имена полей идентичны. Если конфигурации различаются сильнее, вам поможет адаптивная выгрузка и загрузка данных XML, позволяющая производить обмен между не полностью идентичными структурами — для этого подойдёт обработка переноса данных между измененными конфигурациями 1С.
Если вы ищете компактный код, то речь идет о механизме СериализаторXDTO. Этот объект платформы позволяет превратить любой набор записей в XML одной строкой кода. А если вам требуется гибкая конвертация между форматами, рекомендуем изучить модуль «Трансформер» для конвертации JSON/XML/CSV/TOON.
Выясним, как реализовать выгрузку программно:
// В базе-источнике
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\data.xml");
// Создаем и читаем набор записей
Набор = РегистрыСведений.СоответствиеКиосков.СоздатьНаборЗаписей();
Набор.Прочитать();
// Сериализуем данные в XML
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Набор);
ЗаписьXML.Закрыть();
Разберем процесс загрузки с подменой имени:
Для загрузки мы можем прочитать XML как текст, выполнить замену и загрузить уже исправленные данные обратно через сериализатор.
// В базе-приемнике
ЧтениеТекста = Новый ЧтениеТекста("C:\Exchange\data.xml");
ТекстXML = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
// Подменяем имя регистра в строке
ТекстXML = СтрЗаменить(ТекстXML, "СоответствиеКиосков", "ЕЮ_СоответствиеКиосков");
// Создаем чтение XML из измененной строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
// Читаем данные обратно в объект (набор записей)
НаборПриемник = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
// Записываем данные в базу
НаборПриемник.Записать();
Если вы работаете на платформе 8.3, использование формата JSON зачастую удобнее. В JSON нет жесткой привязки к типам метаданных в самой структуре текста. Такой экспорт данных в JSON позволяет легко передавать информацию, сохраняя структуру данных.
Посмотрим на пример реализации через JSON:
// Выгрузка в JSON
МассивДанных = Новый Массив;
Выборка = РегистрыСведений.СоответствиеКиосков.Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураЗаписи = Новый Структура("Склад, НомерКиоска, ДатаОбновления");
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, Выборка);
МассивДанных.Добавить(СтруктураЗаписи);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Exchange\data.json");
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
ЗаписьJSON.Закрыть();
Проанализируем преимущества загрузки из JSON:
При загрузке нам совершенно неважно, как назывался исходный регистр. Мы просто читаем массив и заполняем набор записей нового регистра.
// Загрузка из JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\Exchange\data.json");
МассивЗаписей = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Набор = РегистрыСведений.ЕЮ_СоответствиеКиосков.СоздатьНаборЗаписей();
Для Каждого Элемент Из МассивЗаписей Цикл
НоваяЗапись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, Элемент);
КонецЦикла;
Набор.Записать();
Мы рассмотрели три основных подхода. Если вам нужно разовое действие — проще всего воспользоваться типовой обработкой и текстовой заменой. Если же вы опасаетесь за сохранность данных при передаче, стоит использовать универсальную выгрузку и загрузку с возможностью шифрования.
Главные правила при переносе:
ЗаполнитьЗначенияСвойств убедитесь, что имена реквизитов совпадают.