Как перенести данные регистров сведений между базами 1С без использования «Конвертации данных»

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

Перенос данных между конфигурациями 1С — задача, с которой регулярно сталкивается любой разработчик. Часто для этих целей используется мощный инструмент Конвертация данных (КД), однако бывают ситуации, когда разворачивать правила обмена слишком долго или нецелесообразно. Особенно это актуально для регистров сведений (РегСВ), которые не имеют уникальных идентификаторов (GUID) в привычном понимании и требуют особого подхода при записи. В этой статье мы подробно разберем, как эффективно перенести записи регистров, используя стандартные и альтернативные инструменты.

Метод 1: Использование универсальной обработки «Выгрузка и загрузка данных XML»

Проанализируем самый доступный способ — стандартную обработку от фирмы «1С». Она предназначена для обмена данными между идентичными или очень похожими конфигурациями. Важно понимать, что существует две основные версии этой обработки: для обычных форм (ОФ) и для управляемых форм (УФ).

Особенности использования:

  1. Выгрузка данных: В списке объектов необходимо найти нужный регистр сведений. Если базы идентичны, достаточно просто отметить его галочкой.
  2. Проблема отборов: В версии для управляемых форм часто отсутствует возможность наложить гибкий фильтр (например, по периоду или конкретному измерению). Рассмотрим, как это можно обойти. Если нам не нужны все данные, мы можем воспользоваться модифицированными версиями этой обработки (так называемыми «PRO» версиями), которые поддерживают систему компоновки данных (СКД) для настройки отборов.
  3. Загрузка: В базе-приемнике мы просто выбираем файл и нажимаем «Загрузить». Обработка автоматически создаст наборы записей.

Выясним причину, почему иногда регистры не переносятся. Часто это связано с тем, что в базе-источнике или приемнике стоят разные версии метаданных (например, добавлены новые измерения). В этом случае XML-схема может не совпасть, и данные будут проигнорированы.

Метод 2: Программный перенос через COM-соединение

Если нам требуется перенос с жесткой логикой или специфическими отборами, разберем вариант написания небольшого скрипта, использующего COMConnector. Этот метод позволяет напрямую подключаться из одной базы к другой и «перекладывать» данные.

Посмотрим на пример кода, который считывает данные из внешней базы и записывает их в текущую:


// Создаем подключение к базе-источнику
COMСоединение = Новый COMОбъект("V83.COMConnector");
ПараметрыСвязи = "Srvr='ServerName';Ref='BaseName';Usr='Login';Pwd='Password';";
Попытка
    БазаИсточник = COMСоединение.Connect(ПараметрыСвязи);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Выбираем данные из регистра источника
Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст = 
"ВЫБРАТЬ
|   Регистр.Период,
|   Регистр.Сотрудник,
|   Регистр.Должность
|ИЗ
|   РегистрСведений.ТекущиеКадровыеДанные КАК Регистр";

Выборка = Запрос.Выполнить().Выбрать();

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

Проанализируем ситуацию с производительностью: использование МенеджерЗаписи подходит для небольших объемов данных. Если записей десятки тысяч, лучше использовать СоздатьНаборЗаписей(), предварительно отобрав данные по измерениям.

Метод 3: Перенос через буфер обмена и «Загрузку данных из таб. документа»

Разберем «ленивый», но крайне эффективный способ для разового переноса небольших объемов данных (до нескольких тысяч записей). Этот метод не требует программирования и специализированных обработок.

Пошаговая инструкция:

  1. В базе-источнике откройте список регистра сведений.
  2. Настройте нужный отбор в списке.
  3. Нажмите «Еще» — «Вывести список». Выберите все колонки.
  4. Полученную таблицу выделите (Ctrl+A) и скопируйте (Ctrl+C).
  5. В базе-приемнике воспользуйтесь стандартной обработкой ЗагрузкаДанныхИзТабличногоДокумента.epf (она часто встроена в типовые конфигурации на БСП).
  6. Вставьте данные из буфера обмена, сопоставьте колонки с измерениями и ресурсами регистра и нажмите «Загрузить».

Этот метод хорош тем, что позволяет визуально проконтролировать данные перед загрузкой в Excel или непосредственно в форме обработки.

Метод 4: Современный подход с использованием JSON и REST API

Рассмотрим более продвинутые способы, которые появились в последних версиях платформы 1С v8.3. Если базы находятся в одной сети, мы можем использовать встроенный механизм OData.

При включении автоматического REST-сервиса, данные любого регистра становятся доступны по HTTP-ссылке. Мы можем получить их в формате JSON, который значительно компактнее XML. Выясним преимущество: сериализация набора записей в JSON происходит практически мгновенно.

Пример сериализации в JSON:


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата());
НаборЗаписей.Прочитать();

СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, НаборЗаписей);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Полученную строку можно сохранить в файл или отправить по HTTP

Метод 5: Профессиональные инструменты разработчика

Существует пакет инструментов, известный как «Инструменты разработчика» (авторства Сергея Старых и других участников сообщества). В его состав входит мощная замена стандартной XML-выгрузке. Рассмотрим подробнее, почему стоит обратить на неё внимание:

Критически важные нюансы при записи данных

Независимо от выбранного способа, необходимо помнить о технических особенностях записи в регистры сведений. Проанализируем два параметра, которые могут повлиять на результат:

1. Режим загрузки данных. Всегда используйте свойство ОбменДанными.Загрузка = Истина. Это отключает выполнение прикладных проверок в модуле набора записей (например, проверки на пересечение периодов или заполненность реквизитов), что позволяет загрузить данные «как есть» и значительно ускоряет процесс.

2. Замещение существующих записей. При использовании метода Записать() для набора записей, по умолчанию используется параметр Истина (замещать). Это означает, что если вы записываете пустой набор с установленным отбором по Организации, то все старые записи по этой Организации в базе-приемнике будут удалены. Если ваша задача — дополнить данные, действуйте аккуратно: сначала прочитайте существующий набор, добавьте в него новые записи и только потом записывайте.

Подводя итог, можно сказать: если базы одинаковые — используйте ВыгрузкаЗагрузкаXML. Если базы разные и данных немного — копирование через Excel. Если нужен регулярный и сложный перенос — пишите скрипт на COM или используйте JSON.

← На главную