При переходе с одной учетной системы на другую часто встает задача переноса нормативно-справочной информации: Контрагентов, Номенклатуры, Договоров и прочих объектов. В отличие от платформы 1С 7.7, где существовали универсальные обработки типа TranRef, в современных управляемых формах 1С 8.3 подход к переносу данных требует более глубокого анализа архитектуры баз данных.
Разработчики 1С часто задаются вопросом: существует ли аналог TranRef? Важно понимать, что современные конфигурации на управляемых формах значительно сложнее своих предшественников. Различия в структуре метаданных, типах реквизитов, механизмах иерархии и наличие ссылочных связей между объектами делают создание одной универсальной обработки практически невозможной. Любая попытка универсализации натыкается на проблему ссылочной целостности: нельзя просто скопировать Контрагента, если для него не созданы связанные Банковские счета или Договоры.
Для регулярных обменов или переноса данных между сложными конфигурациями стандартом индустрии является Конвертация данных 2.1 или 3.0. Это мощный инструмент, который позволяет:
Хотя обучение работе с КД занимает время, это самый надежный способ обеспечить корректность переноса данных без ручной правки ошибок.
Если базы находятся на одном сервере или имеют доступ друг к другу, самым быстрым способом для разовой задачи будет создание собственной обработки, использующей COM-объект. Этот метод позволяет напрямую обращаться к метаданным базы-источника из базы-приемника.
Разберем логику работы такой обработки по шагам:
COMОбъект.Запрос.ИНН или Наименование).Объект.Записать().Пример простейшей структуры цикла для переноса справочника:
// Инициализация соединения
COMСоединение = Новый COMОбъект("V83.COMConnector");
БазаИсточник = COMСоединение.Connect("СтрокаСоединения");
// Выборка элементов
Запрос = БазаИсточник.NewObject("Query");
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// Поиск по ключевому реквизиту
НайденныйОбъект = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Результат.ИНН);
Если НайденныйОбъект.Пустая() Тогда
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = Результат.Наименование;
НовыйКонтрагент.ИНН = Результат.ИНН;
НовыйКонтрагент.Записать();
КонецЕсли;
КонецЦикла;
Если базы изолированы, используйте промежуточный файл. На сегодняшний день формат JSON предпочтительнее XML, так как он более компактен и нативно поддерживается функциями ЗаписатьJSON и ПрочитатьJSON.
Порядок действий:
Важным аспектом является рекурсивный обход. Если у справочника есть иерархия, необходимо сначала создать группы, а затем — элементы. При возникновении циклической зависимости (например, у Договора есть ОсновнойКонтрагент, а у Контрагента есть ОсновнойДоговор), используйте двухпроходный метод загрузки: сначала записываем объекты с пустыми ссылками на зависимые элементы, а после их создания — проводим второй проход для заполнения ссылочных полей.
Принимая решение, оцените масштаб задачи:
Конвертацию данных или механизмы EnterpriseData (если конфигурации типовые).COM или файловом обмене (JSON).Код, ИНН, Артикул). Никогда не пытайтесь переносить объекты по их внутренним GUID, так как они в разных базах всегда будут уникальными.