Как перенести документы с движениями между базами 1С с разной структурой реквизитов?

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

При сопровождении систем на базе 1С часто возникает ситуация, когда необходимо перенести данные из прошлогодней базы или старой копии в актуальную рабочую систему. Если конфигурации идентичны, проблем не возникает. Однако, если в новой базе были добавлены новые реквизиты, стандартная обработка «Выгрузка и загрузка данных XML» может выдавать ошибку из-за несоответствия схем. Ситуация осложняется, если нужно перенести не только сами документы, но и их движения (записи в регистрах), которые могли быть скорректированы вручную.

В данной статье мы разберем несколько эффективных стратегий решения этой задачи: от классического использования конфигурации «Конвертация данных» до программных методов с использованием COM-соединения и JSON.

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

Многие разработчики опасаются «Конвертации данных», считая, что написание правил займет много времени. На самом деле, для близких конфигураций этот процесс автоматизирован. Рассмотрим алгоритм действий:

  1. Выгружаем описания конфигураций источника и приемника с помощью обработки MD83Exp.epf.
  2. Загружаем описания в базу «Конвертация данных 2.0».
  3. Создаем новый «Новый план обмена» и используем Мастер настройки правил.
  4. При создании Правил Конвертации Объектов (ПКО) выбираем автоматическое сопоставление реквизитов. Те реквизиты, которые есть в приемнике, но отсутствуют в источнике, просто останутся незаполненными.
  5. Для переноса движений в ПКО документа на закладке «Движения» отмечаем нужные регистры.

Важный нюанс: Чтобы движения перенеслись «как есть», в правилах выгрузки данных для документа необходимо убедиться, что не стоит флаг «Проводить при загрузке», иначе система пересчитает движения по алгоритмам новой базы, и ручные корректировки (если они были) затрутся.

Способ 2: Метод промежуточного обновления (cf-файл)

Если нет желания работать с КД, проанализируем вариант с использованием штатных средств сравнения и объединения. Этот метод считается одним из самых надежных для разовых задач.

Рассмотрим пошагово:

  1. Создаем полную копию базы-источника (прошлогодней базы).
  2. В этой копии заходим в конфигуратор и выполняем «Конфигурация — Сравнить, объединить с конфигурацией из файла», выбрав cf-файл актуальной рабочей базы.
  3. При объединении мы добавляем в структуру старой базы те самые новые реквизиты, из-за которых возникала ошибка XML. Сами данные в базе при этом не изменятся, просто появятся пустые «поля-контейнеры».
  4. Применяем изменения (F7). Теперь структуры метаданных документа в копии источника и в приемнике идентичны.
  5. Используем стандартную обработку ВыгрузкаЗагрузкаДанныхXML.epf. Теперь она не выдаст ошибок, так как все теги в XML будут соответствовать структуре приемника.

Способ 3: Программный перенос через COM-соединение

Для программиста этот способ часто является самым быстрым, так как позволяет полностью контролировать процесс записи. Мы напишем обработку в базе-приемнике, которая будет «подтягивать» данные из источника.

Проанализируем пример кода для подключения и создания документа:


// Создаем соединение с базой-источником
ПараметрыСоединения = "File=""C:\Base\OldBase"";Usr=""Администратор"";";
Соединитель = Новый COMObject("V83.COMConnector");
Попытка
    БазаИсточник = Соединитель.Connect(ПараметрыСоединения);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Выбираем документы за период
ЗапросКИсточнику = БазаИсточник.NewObject("Запрос");
ЗапросКИсточнику.Текст = 
"ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &Начало И &Конец";
// ... установка параметров ...
Выборка = ЗапросКИсточнику.Выполнить().Выбрать();

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

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

Способ 4: Перенос через формат JSON

Начиная с платформы 8.3, 1С поддерживает эффективную сериализацию в JSON. В отличие от XML, чтение JSON более гибкое. Если в файле присутствуют данные для реквизитов, которых нет в объекте 1С, их можно просто проигнорировать при парсинге в Структуру.

Разберем алгоритм:

  1. В старой базе сериализуем документ и его движения в JSON (используя ЗаписьJSON).
  2. В новой базе читаем файл. Если мы используем функцию ПрочитатьJSON в Соответствие или Структуру, система создаст коллекцию «ключ-значение».
  3. Затем мы просто присваиваем значения из структуры реквизитам документа-приемника. Если ключа из структуры не существует в метаданных — программа просто не выполнит присвоение, не выпадая в ошибку.

Особенности переноса «результата проведения»

Если ваша цель — перенести именно результат проведения (записи в регистрах), а не просто документ для последующего перепроведения, придерживайтесь следующих правил:

Таким образом, мы рассмотрели различные подходы к переносу данных. Выбор конкретного метода зависит от объема данных и ваших навыков программирования. Для разового переноса нескольких типов документов наиболее рациональным выглядит Способ 2 (обновление через cf) или Способ 1 (автоправила КД).

← На главную