Перенос справочников между информационными базами 1С — распространенная задача при обновлении конфигураций, объединении баз данных, переходе на новые системы или синхронизации нормативно-справочной информации (НСИ). Рассмотрим основные варианты решения этой задачи: от использования готовых типовых инструментов платформы до программного переноса данных через прямое подключение.
Если конфигурации в базе-источнике и базе-приемнике имеют одинаковый релиз и полностью совпадающую структуру метаданных, самым быстрым и надежным инструментом является типовая обработка «Выгрузка и загрузка данных XML».
Разберем по шагам порядок работы с этой обработкой:
Файл — Открыть.Преимущество данного способа заключается в том, что он не требует написания правил обмена и полностью сохраняет уникальные идентификаторы (GUID), иерархическую структуру, реквизиты и табличные части объектов. Однако структуры переносимого справочника и связанных с ним метаданных в обеих базах должны быть полностью идентичны.
Когда конфигурации баз различаются по структуре или требуется настроить гибкое сопоставление полей во избежание дублирования записей, используют конфигурацию «1С:Конвертация данных» и обработку «Универсальный обмен данными в формате XML».
Рассмотрим порядок действий:
Универсальный обмен данными в формате XML, загружаем правила, выбираем справочник и формируем файл с данными.Если требуется автоматизировать процесс или выполнить перенос данных напрямую между базами без создания промежуточных файлов, применим прямое подключение через COMConnector. Проанализируем пример программного кода, который подключается к удаленной базе, считывает данные запросом и выполняет поиск или создание элементов в текущей базе:
Перем Соединение;
Процедура Подключение() Экспорт
Попытка
Сервер = "ИмяСервера";
База = "ИмяБазы";
Параметры = "Srvr=" + Сервер + "; Ref=" + База + ";";
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(Параметры);
Сообщить("Подключение успешно установлено.");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура ПеренестиСправочник() Экспорт
Если Соединение = Неопределено Тогда
Подключение();
КонецЕсли;
Попытка
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка,
| Наименование,
| Код,
| КраткоеНаименование
|ИЗ
| Справочник.Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Выполняем поиск элемента в текущей базе по наименованию
СсылкаНайденная = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование, Истина);
Если СсылкаНайденная.Пустая() Тогда
ОбъектСправочника = Справочники.Номенклатура.СоздатьЭлемент();
ОбъектСправочника.Наименование = ВыборкаДетальныеЗаписи.Наименование;
ОбъектСправочника.Код = ВыборкаДетальныеЗаписи.Код;
Иначе
ОбъектСправочника = СсылкаНайденная.ПолучитьОбъект();
КонецЕсли;
ОбъектСправочника.КраткоеНаименование = ВыборкаДетальныеЗаписи.КраткоеНаименование;
ОбъектСправочника.Записать();
КонецЦикла;
Сообщить("Перенос справочника успешно завершен.");
Исключение
Соединение = Неопределено;
Сообщить("Ошибка переноса данных: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для простых справочников, содержащих преимущественно текстовые и числовые реквизиты, отлично подходит перенос через табличный документ (Excel, MXL, CSV):
Выясним основные риски, с которыми можно столкнуться при переносе данных, и способы их предотвращения:
ЕдиницыИзмерения, СтавкиНДС, Контрагенты), при изолированном переносе одного справочника эти реквизиты в базе-приемнике примут вид «<Объект не найден>». Связанную нормативно-справочную информацию необходимо переносить комплексно.V83.COMConnector требует совпадения разрядности процессов (32 или 64 бита), совпадения версий и номеров сборок платформы, а также не поддерживается нативно на серверах под управлением Linux (в качестве современной альтернативы рекомендуется использовать OData REST API или HTTP-сервисы).