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