Настройка синхронизации между двумя базами 1С (например, «Бухгалтерия предприятия» и «Управление холдингом») часто превращается в серьезное испытание, когда объем данных исчисляется сотнями гигабайт или миллионами записей. Стандартный механизм «Начальной выгрузки данных» в помощнике настройки синхронизации может работать часы, а иногда и сутки, создавая огромные XML-файлы, которые база-приемник рискует не «переварить». В этой статье мы разберем, как обойти этот этап и выполнить начальное наполнение базы альтернативными способами, сохранив при этом целостность обмена.
При штатной настройке синхронизации система автоматически регистрирует все объекты, попадающие под фильтры, к выгрузке. Основная цель этого процесса — гарантировать, что в обеих базах данные идентичны и, что немаловажно, установлены связи между ними в служебном регистре сведений СоответствияОбъектовИнформационныхБаз. Однако, если мы уже перенесли данные с помощью обработки «Универсальный обмен данными в формате XML», мы можем захотеть «подключить» план обмена уже к существующим данным.
Рассмотрим ситуацию: вы перенесли документы и справочники сторонними средствами, GUID-ы (уникальные идентификаторы) совпали. Теперь вам нужно, чтобы в будущем измененные объекты уходили в другую базу. Можно ли просто очистить регистрацию и начать обмен с «чистого листа»? Давайте проанализируем технические последствия такого решения.
Этот регистр является связующим звеном в распределенных системах. В нем хранится информация о том, какому объекту в базе «А» соответствует объект в базе «Б». Разберем подробнее, на что влияет его отсутствие:
Если мы решили сэкономить время и выполнить перенос вручную, выполним следующие действия вместе:
Шаг 1. Первоначальный перенос данных. Используем обработку «Универсальный обмен данными XML». Важно убедиться, что выгрузка идет с сохранением идентификаторов. В настройках обработки проверяем, чтобы данные записывались в режиме загрузки (ОбменДанными.Загрузка = Истина). Это отключит лишние проверки бизнес-логики и подписки на события.
Шаг 2. Создание настройки синхронизации. Настраиваем синхронизацию в обеих базах обычным способом через «Администрирование — Синхронизация данных». Проходим все этапы, кроме фактического запуска обмена.
Шаг 3. Очистка регистрации изменений. После того как узлы планов обмена созданы, система автоматически зарегистрирует все данные. Нам нужно это отменить. Для этого воспользуемся стандартной обработкой «Регистрация изменений для обмена». Выбираем наш узел и выполняем команду «Снять регистрацию» для всех объектов. Теперь план обмена «пуст» и готов фиксировать только новые изменения.
Чтобы избежать проблем с производительностью и удалением объектов в будущем, проанализируем ситуацию: нам нужно создать записи в РС СоответствияОбъектовИнформационныхБаз для всех перенесенных данных. Если объектов много, делать это вручную через стандартный помощник сопоставления невозможно. Рассмотрим пример кода, который поможет автоматизировать этот процесс.
Предположим, мы хотим сопоставить справочник Номенклатура. Мы знаем, что GUID-ы в обеих базах идентичны. Нам нужно создать запись в регистре соответствий для конкретного узла обмена:
Процедура ЗаполнитьСоответствияДляСправочника(УзелОбмена, ИмяСправочника)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка
|ИЗ
| Справочник." + ИмяСправочника + " КАК Т";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
МенеджерЗаписи = РегистрыСведений.СоответствияОбъектовИнформационныхБаз.СоздатьМенеджерЗаписи();
МенеджерЗаписи.УзелИнформационнойБазы = УзелОбмена;
МенеджерЗаписи.СобственнаяСсылка = Выборка.Ссылка;
// В качестве уникального идентификатора приемника используем GUID нашей ссылки
МенеджерЗаписи.УникальныйИдентификаторПриемника = Строка(Выборка.Ссылка.УникальныйИдентификатор());
// Дополнительные параметры типа (для разных конфигураций)
МенеджерЗаписи.ТипПриемника = "СправочникСсылка." + ИмяСправочника;
МенеджерЗаписи.ТипОбъектаИсточника = "СправочникСсылка." + ИмяСправочника;
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
// Обработка ошибок, если запись уже существует
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Этот подход гарантирует, что штатный механизм синхронизации будет считать эти объекты «уже синхронизированными». Разберем ситуацию, когда конфигурации разные (например, БП и УХ). В этом случае в ТипПриемника и ТипОбъектаИсточника должны быть указаны строки метаданных, соответствующие правилам обмена.
Если ваша синхронизация работает через современный формат EnterpriseData, стоит обратить внимание на номера сообщений. Выясним причину, по которой обмен может сломаться после ручных манипуляций. При обмене база-источник и база-приемник хранят номера принятых и отправленных сообщений. Если вы просто очистите регистрацию, но не сбросите счетчики или не синхронизируете их, вы можете получить ошибку: «Номер сообщения меньше или равен ранее принятому».
Посмотрим на пример решения этой проблемы: после настройки узлов, зайдите в параметры синхронизации и убедитесь, что «Номер принятого сообщения» и «Номер отправленного сообщения» установлены в «0» или «1» в обеих базах, либо соответствуют последним успешным итерациям, если таковые были.
Подведем итог: избежать начальной выгрузки можно, и это часто является единственным способом запустить обмен на больших базах. Однако просто «снести» регистрацию недостаточно. Проанализируем наши шаги:
Таким образом, мы выяснили, что комбинированный метод (ручной перенос + штатная синхронизация изменений) является рабочим инструментом в арсенале программиста 1С, позволяющим значительно ускорить ввод систем в эксплуатацию.