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

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

Настройка синхронизации между двумя базами 1С (например, «Бухгалтерия предприятия» и «Управление холдингом») часто превращается в серьезное испытание, когда объем данных исчисляется сотнями гигабайт или миллионами записей. Стандартный механизм «Начальной выгрузки данных» в помощнике настройки синхронизации может работать часы, а иногда и сутки, создавая огромные XML-файлы, которые база-приемник рискует не «переварить». В этой статье мы разберем, как обойти этот этап и выполнить начальное наполнение базы альтернативными способами, сохранив при этом целостность обмена.

Зачем нужна начальная выгрузка и можно ли от нее отказаться?

При штатной настройке синхронизации система автоматически регистрирует все объекты, попадающие под фильтры, к выгрузке. Основная цель этого процесса — гарантировать, что в обеих базах данные идентичны и, что немаловажно, установлены связи между ними в служебном регистре сведений СоответствияОбъектовИнформационныхБаз. Однако, если мы уже перенесли данные с помощью обработки «Универсальный обмен данными в формате XML», мы можем захотеть «подключить» план обмена уже к существующим данным.

Рассмотрим ситуацию: вы перенесли документы и справочники сторонними средствами, GUID-ы (уникальные идентификаторы) совпали. Теперь вам нужно, чтобы в будущем измененные объекты уходили в другую базу. Можно ли просто очистить регистрацию и начать обмен с «чистого листа»? Давайте проанализируем технические последствия такого решения.

Проблема регистра «Соответствия объектов информационных баз»

Этот регистр является связующим звеном в распределенных системах. В нем хранится информация о том, какому объекту в базе «А» соответствует объект в базе «Б». Разберем подробнее, на что влияет его отсутствие:

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

Пошаговый алгоритм настройки обмена без начальной выгрузки

Если мы решили сэкономить время и выполнить перенос вручную, выполним следующие действия вместе:

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

Шаг 2. Создание настройки синхронизации. Настраиваем синхронизацию в обеих базах обычным способом через «Администрирование — Синхронизация данных». Проходим все этапы, кроме фактического запуска обмена.

Шаг 3. Очистка регистрации изменений. После того как узлы планов обмена созданы, система автоматически зарегистрирует все данные. Нам нужно это отменить. Для этого воспользуемся стандартной обработкой «Регистрация изменений для обмена». Выбираем наш узел и выполняем команду «Снять регистрацию» для всех объектов. Теперь план обмена «пуст» и готов фиксировать только новые изменения.

Как правильно заполнить регистр соответствий программно?

Чтобы избежать проблем с производительностью и удалением объектов в будущем, проанализируем ситуацию: нам нужно создать записи в РС СоответствияОбъектовИнформационныхБаз для всех перенесенных данных. Если объектов много, делать это вручную через стандартный помощник сопоставления невозможно. Рассмотрим пример кода, который поможет автоматизировать этот процесс.

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


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

Этот подход гарантирует, что штатный механизм синхронизации будет считать эти объекты «уже синхронизированными». Разберем ситуацию, когда конфигурации разные (например, БП и УХ). В этом случае в ТипПриемника и ТипОбъектаИсточника должны быть указаны строки метаданных, соответствующие правилам обмена.

Особенности использования формата Enterprise Data

Если ваша синхронизация работает через современный формат EnterpriseData, стоит обратить внимание на номера сообщений. Выясним причину, по которой обмен может сломаться после ручных манипуляций. При обмене база-источник и база-приемник хранят номера принятых и отправленных сообщений. Если вы просто очистите регистрацию, но не сбросите счетчики или не синхронизируете их, вы можете получить ошибку: «Номер сообщения меньше или равен ранее принятому».

Посмотрим на пример решения этой проблемы: после настройки узлов, зайдите в параметры синхронизации и убедитесь, что «Номер принятого сообщения» и «Номер отправленного сообщения» установлены в «0» или «1» в обеих базах, либо соответствуют последним успешным итерациям, если таковые были.

Резюме и рекомендации

Подведем итог: избежать начальной выгрузки можно, и это часто является единственным способом запустить обмен на больших базах. Однако просто «снести» регистрацию недостаточно. Проанализируем наши шаги:

Таким образом, мы выяснили, что комбинированный метод (ручной перенос + штатная синхронизация изменений) является рабочим инструментом в арсенале программиста 1С, позволяющим значительно ускорить ввод систем в эксплуатацию.

← На главную