При сопровождении систем на базе 1С часто возникает ситуация, когда необходимо перенести данные из прошлогодней базы или старой копии в актуальную рабочую систему. Если конфигурации идентичны, проблем не возникает. Однако, если в новой базе были добавлены новые реквизиты, стандартная обработка «Выгрузка и загрузка данных XML» может выдавать ошибку из-за несоответствия схем. Ситуация осложняется, если нужно перенести не только сами документы, но и их движения (записи в регистрах), которые могли быть скорректированы вручную.
В данной статье мы разберем несколько эффективных стратегий решения этой задачи: от классического использования конфигурации «Конвертация данных» до программных методов с использованием COM-соединения и JSON.
Многие разработчики опасаются «Конвертации данных», считая, что написание правил займет много времени. На самом деле, для близких конфигураций этот процесс автоматизирован. Рассмотрим алгоритм действий:
MD83Exp.epf.Важный нюанс: Чтобы движения перенеслись «как есть», в правилах выгрузки данных для документа необходимо убедиться, что не стоит флаг «Проводить при загрузке», иначе система пересчитает движения по алгоритмам новой базы, и ручные корректировки (если они были) затрутся.
Если нет желания работать с КД, проанализируем вариант с использованием штатных средств сравнения и объединения. Этот метод считается одним из самых надежных для разовых задач.
Рассмотрим пошагово:
cf-файл актуальной рабочей базы.ВыгрузкаЗагрузкаДанныхXML.epf. Теперь она не выдаст ошибок, так как все теги в XML будут соответствовать структуре приемника.Для программиста этот способ часто является самым быстрым, так как позволяет полностью контролировать процесс записи. Мы напишем обработку в базе-приемнике, которая будет «подтягивать» данные из источника.
Проанализируем пример кода для подключения и создания документа:
// Создаем соединение с базой-источником
ПараметрыСоединения = "File=""C:\Base\OldBase"";Usr=""Администратор"";";
Соединитель = Новый COMObject("V83.COMConnector");
Попытка
БазаИсточник = Соединитель.Connect(ПараметрыСоединения);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Выбираем документы за период
ЗапросКИсточнику = БазаИсточник.NewObject("Запрос");
ЗапросКИсточнику.Текст =
"ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &Начало И &Конец";
// ... установка параметров ...
Выборка = ЗапросКИсточнику.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектИсточник = Выборка.Ссылка;
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполняем только те реквизиты, которые существуют в обеих базах
ЗаполнитьЗначенияСвойств(НовыйДокумент, ОбъектИсточник);
// Важно: перенос движений
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
ПеренестиДвижения(ОбъектИсточник, НовыйДокумент);
КонецЦикла;
Для переноса движений (регистров накопления или бухгалтерии) необходимо обходить коллекции Движения объекта-источника и построчно копировать их в наборы записей приемника. Выясним причину, почему это лучше делать программно: так мы можем установить свойство Записывать = Истина для набора записей, не вызывая при этом тяжелую процедуру ОбработкаПроведения.
Начиная с платформы 8.3, 1С поддерживает эффективную сериализацию в JSON. В отличие от XML, чтение JSON более гибкое. Если в файле присутствуют данные для реквизитов, которых нет в объекте 1С, их можно просто проигнорировать при парсинге в Структуру.
Разберем алгоритм:
JSON (используя ЗаписьJSON).ПрочитатьJSON в Соответствие или Структуру, система создаст коллекцию «ключ-значение».Если ваша цель — перенести именно результат проведения (записи в регистрах), а не просто документ для последующего перепроведения, придерживайтесь следующих правил:
РежимЗаписиДокумента.Запись.РегистрНакопленияНаборЗаписей. Установите отбор по регистратору (вашему новому документу), прочитайте данные из источника, заполните ими таблицу набора и вызовите метод Записать().Проведен = Истина у самого документа, если вы загрузили движения вручную, иначе в списках документ будет отображаться как не проведенный.Таким образом, мы рассмотрели различные подходы к переносу данных. Выбор конкретного метода зависит от объема данных и ваших навыков программирования. Для разового переноса нескольких типов документов наиболее рациональным выглядит Способ 2 (обновление через cf) или Способ 1 (автоправила КД).