В процессе эксплуатации крупных информационных баз 1С (например, «1С:Розница» или «1С:Управление торговлей») администраторы часто сталкиваются с проблемой создания начального образа для распределенной информационной базы (РИБ). Когда объем базы данных исчисляется десятками и сотнями гигабайт, штатный механизм создания образа через конфигуратор может занимать десятки часов или вовсе завершаться аварийно из-за нехватки ресурсов. В таких ситуациях возникает необходимость создать периферийную базу альтернативным методом. Разберем подробно, как превратить независимую базу в подчиненный узел и какие «подводные камни» нас ожидают.
Рассмотрим ситуацию: центральная база весит 70 ГБ. При попытке создать начальный образ стандартными средствами платформа выполняет полную выгрузку данных, что может занять 15–20 часов. Если в этот момент произойдет сетевой сбой или переполнение временных таблиц SQL, процесс придется начинать заново. Альтернативный метод позволяет подготовить базу заранее, перенести в нее только необходимые справочники и остатки, а затем «привязать» ее к центру программно.
Первым делом нам необходимо создать пустую базу данных и привести ее структуру в полное соответствие с центральной базой. Выполним следующие действия:
.cf (Конфигурация -> Сохранить конфигурацию в файл)..cf из первого пункта и выполним обновление конфигурации базы данных.Теперь самое главное: нам нужно заставить платформу поверить, что эта независимая база является частью РИБ и имеет главного узла. Для этого мы воспользуемся встроенным методом платформы УстановитьГлавныйУзел(). Рассмотрим пример кода, который необходимо запустить во внешней обработке в будущей периферийной базе:
// Определим узел, который станет главным для нашей базы
// Код узла должен в точности совпадать с кодом центрального узла в плане обмена
ПланОбменаСсылка = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("ЦБ");
Если Не ПланОбменаСсылка.Пустая() Тогда
// Устанавливаем связь с центральным узлом
ПланыОбмена.УстановитьГлавныйУзел(ПланОбменаСсылка);
Сообщить("Связь с главным узлом успешно установлена.");
Иначе
Сообщить("Узел с указанным кодом не найден! Проверьте план обмена.");
КонецЕсли;
Проанализируем этот код: метод ПланыОбмена.УстановитьГлавныйУзел() меняет статус текущей базы. После его выполнения при запуске системы база будет считаться подчиненной, а в заголовке программы (если это предусмотрено конфигурацией) появится соответствующая индикация.
Выясним причину одной из самых опасных проблем при ручном создании базы — дублирования предопределенных элементов. Когда вы создаете базу с нуля, UUID (уникальные идентификаторы) предопределенных элементов справочников в данных могут не совпадать с теми, что созданы в центральной базе. При первом же обмене платформа может создать «двойников» для ставок НДС, видов цен или типов денежных средств.
Рекомендация: Чтобы избежать этого, вместо создания пустой базы и загрузки .cf, лучше использовать копию центральной базы, из которой удалены все документы и лишние справочники. Если же вы уже создали базу через .cf, используйте специализированные обработки для сопоставления UUID предопределенных данных.
В современных конфигурациях (Розница 2.3, УТ 11, ERP) платформенных механизмов недостаточно. После установки главного узла вы можете столкнуться с тем, что при каждом входе система выдает ошибку: Ошибка разбора XML: Extra content at the end of the document или настойчиво предлагает настроить обмен.
Это происходит потому, что в базе не завершены служебные процедуры настройки обмена. Разберем, как это исправить:
НастройкаПодчиненногоУзлаРИБЗавершена. Ее необходимо установить в значение Истина.Общие настройки узлов информационных баз. В записи, соответствующей нашему узлу, флаг Настройка завершена должен быть установлен.Рассмотрим пример кода для коррекции этих параметров:
// Установка константы завершения настройки
Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Установить(Истина);
// Фиксация настроек в регистре БСП
ЗаписьРегистра = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Узел = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел();
ЗаписьРегистра.Прочитать();
Если ЗаписьРегистра.Выбран() Тогда
ЗаписьРегистра.НастройкаЗавершена = Истина;
ЗаписьРегистра.Записать();
КонецЕсли;
После того как техническая связь установлена, нужно убедиться, что коды узлов в обеих базах «зеркальны»:
ЭтотУзел.Код = "ЦБ", ПериферийныйУзел.Код = "ПБ".ЭтотУзел.Код = "ПБ", ГлавныйУзел.Код = "ЦБ".Важный момент: После ручного создания базы центральный узел «не знает», что в периферийной базе уже есть какие-то данные. Чтобы справочники начали синхронизироваться, необходимо в центральной базе принудительно зарегистрировать изменения для этого узла с помощью обработки «Регистрация изменений для обмена данными».
Если ручное создание кажется слишком сложным, проанализируем еще один эффективный метод:
Ложь в правилах).Этот способ гарантирует корректность всех внутренних идентификаторов системы (Object ID базы, UUID предопределенных элементов) и избавляет от необходимости вручную править регистры БСП.