Как объединить существующие независимые базы 1С:Розница в распределенную информационную базу (РИБ)?

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

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

Анализ ошибки при создании начального образа

Типичный сценарий: данные из филиалов загружаются в будущую центральную базу универсальной обработкой, после чего в плане обмена создаются узлы и запускается команда создания начального образа. На этапе обработки регистров процедура аварийно завершается с ошибкой в общем модуле ОбменДаннымиСобытия на строке вида Значение = Значение[ИмяСвойства].

Выясним причину такого поведения системы. При формировании начального образа конфигурация применяет правила регистрации и фильтрации данных по конкретным реквизитам распределения (например, по магазину или организации). Модуль обращается к регистратору записи регистра и пытается динамически прочитать его реквизиты. Сбой происходит в следующих случаях:

  1. Нарушение ссылочной целостности: после нетиповой загрузки данных в регистрах (например, ТоварыОрганизаций) могут остаться записи с «битыми» ссылками на документы-регистраторы (объект не найден) либо с незаполненным регистратором.
  2. Отсутствие ожидаемых реквизитов: перенесенные документы определенных типов не содержат реквизитов, по которым план обмена выполняет разграничение данных (например, реквизита Организация или Магазин).

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

Почему синхронизация через универсальный формат (EnterpriseData) не заменяет РИБ

В попытках обойти ошибки выгрузки часто пробуют настроить регулярный обмен через синхронизацию данных в универсальном формате (EnterpriseData). Однако для однотипных баз «1С:Розница» этот подход приводит к потере данных:

  1. Ограниченный состав данных: формат EnterpriseData спроектирован для взаимодействия разнородных систем (например, «Розница» и «Бухгалтерия предприятия»). В нем принципиально отсутствуют специфические справочники и настройки торговой сети: рабочие места, кассы ККМ, эквайринговые терминалы, правила ценообразования магазина, виды цен и специализированные торговые регистры.
  2. Непроведенные документы: без передачи касс, складов и торговой структуры поступающие документы не могут быть корректно проведены в базе-приемнике.

Таким образом, для связывания баз «Розница — Розница» проектным решением является именно распределенная информационная база.

Решение: программное связывание существующих баз в РИБ

Если подчиненные базы уже содержат справочники и накопленные документы, создавать начальный образ с нуля не требуется. Платформа «1С:Предприятие 8» позволяет связать уже работающие базы напрямую. Разберем этот процесс подробно.

Шаг 1. Выравнивание версий конфигураций

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

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

Шаг 2. Настройка планов обмена в базах

Для примера рассмотрим связывание по плану обмена ПоМагазину (или Полный, в зависимости от архитектуры):

  1. В центральной информационной базе открываем используемый план обмена. Предопределенному узлу (ЭтотУзел) задаем код, например, ЦБ. Создаем подчиненные узлы с уникальными префиксами для каждой периферийной базы (например, М1, М2, М3).
  2. В каждой периферийной базе открываем тот же план обмена. Предопределенному элементу ЭтотУзел задаем код, соответствующий его магазину (например, М1 в первой базе). Создаем элемент узла для центральной базы с кодом ЦБ.

Шаг 3. Установка главного узла в периферийных базах

Чтобы подчиненная база перешла в режим периферийного узла РИБ, свяжем ее с центром программно с помощью метода ПланыОбмена.УстановитьГлавныйУзел(). Для этого в периферийной базе запустим внешнюю обработку со следующим кодом:


ГлавныйУзел = ПланыОбмена.ПоМагазину.НайтиПоКоду("ЦБ");
Если ЗначениеЗаполнено(ГлавныйУзел) Тогда
    ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);
    Сообщить("Главный узел успешно установлен.");
Иначе
    ВызватьИсключение "Узел центральной базы с указанным кодом не найден!";
КонецЕсли;

После выполнения данного кода база становится подчиненным узлом распределенной информационной базы.

Шаг 4. Сброс счетчиков сообщений и регистрация изменений

Чтобы узлы могли обмениваться файлами без ошибок рассинхронизации, необходимо согласовать номера отправленных и принятых сообщений. В обеих базах для соответствующего узла обнулим или приведем к одинаковым значениям свойства НомерОтправленного и НомерПринятого:


УзелОбъекта = ГлавныйУзел.ПолучитьОбъект();
УзелОбъекта.НомерОтправленного = 0;
УзелОбъекта.НомерПринятого = 0;
УзелОбъекта.Записать();

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


УзелЦБ = ПланыОбмена.ПоМагазину.НайтиПоКоду("ЦБ");
// Регистрируем изменения для конкретных метаданных
ПланыОбмена.ЗарегистрироватьИзменения(УзелЦБ, Метаданные.Документы.ЧекККМ);
ПланыОбмена.ЗарегистрироватьИзменения(УзелЦБ, Метаданные.Документы.ОтчетОРозничныхПродажах);

Важно: не регистрируйте сразу все метаданные одной командой, если база содержит большой объем информации, чтобы не перегрузить оперативную память и не создать гигантский XML-файл. Рекомендуется выполнять выгрузку порциями по типам объектов или периодам.

Обязательные меры предосторожности при слиянии

  1. Префиксы документов: перед связыванием убедимся, что во всех базах настроены уникальные префиксы информационных баз. Если префиксы совпадали или не были заданы, перед обменом необходимо перенумеровать документы, иначе при загрузке в центр возникнут коллизии уникальности или перезапись документов.
  2. Дублирование нормативно-справочной информации: одинаковые позиции номенклатуры или контрагенты, созданные в разных базах вручную, имеют разные уникальные идентификаторы (UUID). После передачи всех данных в центральный узел неизбежно появятся дубли. В центральной базе потребуется выполнить штатную обработку «Поиск и удаление дублей» с заменой ссылок.
← На главную