Как перенести справочники между разными конфигурациями 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе с одной учетной системы на другую часто встает задача переноса нормативно-справочной информации: Контрагентов, Номенклатуры, Договоров и прочих объектов. В отличие от платформы 1С 7.7, где существовали универсальные обработки типа TranRef, в современных управляемых формах 1С 8.3 подход к переносу данных требует более глубокого анализа архитектуры баз данных.

Почему нет «универсальной кнопки» для переноса?

Разработчики 1С часто задаются вопросом: существует ли аналог TranRef? Важно понимать, что современные конфигурации на управляемых формах значительно сложнее своих предшественников. Различия в структуре метаданных, типах реквизитов, механизмах иерархии и наличие ссылочных связей между объектами делают создание одной универсальной обработки практически невозможной. Любая попытка универсализации натыкается на проблему ссылочной целостности: нельзя просто скопировать Контрагента, если для него не созданы связанные Банковские счета или Договоры.

Вариант 1: Использование «Конвертации данных» (КД)

Для регулярных обменов или переноса данных между сложными конфигурациями стандартом индустрии является Конвертация данных 2.1 или 3.0. Это мощный инструмент, который позволяет:

  1. Настроить правила обмена, определяющие, какой реквизит источника соответствует реквизиту приемника.
  2. Установить правила поиска объектов, чтобы избежать дублей (например, по ИНН или коду).
  3. Определить последовательность загрузки данных с учетом зависимостей (сначала справочники-родители, затем зависимые объекты).

Хотя обучение работе с КД занимает время, это самый надежный способ обеспечить корректность переноса данных без ручной правки ошибок.

Вариант 2: Прямое подключение через COM-соединение

Если базы находятся на одном сервере или имеют доступ друг к другу, самым быстрым способом для разовой задачи будет создание собственной обработки, использующей COM-объект. Этот метод позволяет напрямую обращаться к метаданным базы-источника из базы-приемника.

Разберем логику работы такой обработки по шагам:

  1. Инициализация подключения к базе-источнику через COMОбъект.
  2. Выборка объектов из источника с помощью Запрос.
  3. Циклическая обработка элементов с проверкой на наличие объекта в приемнике (поиск по ключевому полю, например, ИНН или Наименование).
  4. Заполнение данных и запись объекта в приемник через Объект.Записать().

Пример простейшей структуры цикла для переноса справочника:


// Инициализация соединения
COMСоединение = Новый COMОбъект("V83.COMConnector");
БазаИсточник = COMСоединение.Connect("СтрокаСоединения");

// Выборка элементов
Запрос = БазаИсточник.NewObject("Query");
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты";
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    // Поиск по ключевому реквизиту
    НайденныйОбъект = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Результат.ИНН);
    
    Если НайденныйОбъект.Пустая() Тогда
        НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
        НовыйКонтрагент.Наименование = Результат.Наименование;
        НовыйКонтрагент.ИНН = Результат.ИНН;
        НовыйКонтрагент.Записать();
    КонецЕсли;
КонецЦикла;

Вариант 3: Обмен через промежуточные форматы (JSON/XML)

Если базы изолированы, используйте промежуточный файл. На сегодняшний день формат JSON предпочтительнее XML, так как он более компактен и нативно поддерживается функциями ЗаписатьJSON и ПрочитатьJSON.

Порядок действий:

  1. Напишите обработку выгрузки, которая преобразует данные справочника в массив структур и сохраняет их в текстовый файл.
  2. Напишите обработку загрузки, которая считывает файл и по заданному алгоритму сопоставления создает элементы в новой базе.

Важным аспектом является рекурсивный обход. Если у справочника есть иерархия, необходимо сначала создать группы, а затем — элементы. При возникновении циклической зависимости (например, у Договора есть ОсновнойКонтрагент, а у Контрагента есть ОсновнойДоговор), используйте двухпроходный метод загрузки: сначала записываем объекты с пустыми ссылками на зависимые элементы, а после их создания — проводим второй проход для заполнения ссылочных полей.

Заключение: что выбрать?

Принимая решение, оцените масштаб задачи:

← На главную