---
title: Реализация РИБ в базах без БСП
slug: общие-обмен-данными-планы-обмена-распределенная-информационная-база-реализация/реализация-риб-в-базах-без-бсп
---
# Перед началом работы

## Что это такое
Распределенная информационная база (РИБ) - это совокупность связанных информационных баз, в которых поддерживается синхронизация `конфигураций` и `данных`
РИБ служит для обмена идентичных информационных баз «1С: Предприятие 8». Чаще всего задача обменов между узлами РИБ сводится к выгрузке данных из **периферийных** узлов в **центральную базу**

В РИБ все конфигурации объеденены по строгой иерархии - центральная база может быть **только одна**, от которой создаются подчиненные узлы
![описание](/obmen-dannymi/rib/1.png)

## Особенности работы с РИБ

- Обмен данными выполняется в формате ХML документов. Изменения конфигурации распространяются в сообщениях обмена вместе с изменениями данных.
- Внесение изменений в конфигурацию возможно только в одном (корневом) узле распределённой системы. Изменения конфигурации передаются от главного узла к подчинённым
- Внесение изменений в данные возможно в любом узле системы. Изменения данных передаются между любыми связанными узлами.
- При выгрузке данных на всех объектах (справочники, документы и т. д.) невозможно внесение изменений (устанавливается блокировка). Это может парализовать рабочий процесс на длительное время. Чтобы избежать этого, рекомендуется включать обмен после работы либо выгружать небольшой объём информации за один раз.
- При обмене данными в случае, если объект был изменен в корневом и подчиненном узлах одновременно (коллизия), **ГЛАВНАЯ база перетирает изменения ПОДЧИНЕННОЙ**

# Пример работы в базах без БСП

## Создание подчиненных баз

1. Создаем план обмена. Во вкладке  `Основное` устанавливаем флаги `Распределенная информационная база` и `Включать расширения конфигурации`
2. Настраиваем состав плана обмена. `Авторегистрацию` запрещаем, т.к. необходимо будет **вручную управлять регистрацией изменений**. (Мы же не хотим отправить документы дочернего узла 2 в дочерний узел 1 и наоборот)
![описание](/obmen-dannymi/rib/2.png)
3. Реализуем префиксацию объектов любым способом. Главное, чтобы коды и номера элементов в базах в РИБ не пересекались.

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Пример создания</summary>
    
Колхозное решение "на коленке"

- Создаем константу `ПрефиксИнформационнойБазы` (строка, 2 символа), **не включаем ее в план обмена**. Нам не нужно, чтобы она затиралась
- Создаем подписки на события:

| Имя подписки | Источник | Событие | Обработчик |
|-------------|-------------|-------------|-------------|
|`УстановитьПрефиксИнформационнойБазыНомеруДокумента`| все объекты `ДокументОбъект`, которые участвуют в обмене |`ПриУстановкеНовогоНомера`|`ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы` (реализуем ниже)|
|`УстановитьПрефиксИнформационнойБазыКодуСправочника`|все объекты `СправочникОбъект`, которые участвуют в обмене|`ПриУстановкеНовогоКода`|`ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы` (реализуем ниже)|

- В общем модуле реализуем метод префиксации:
    
```bsl

#Область ПрограммныйИнтерфейс

Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт
    
    ПрефиксИБ = Константы.ПрефиксИнформационнойБазы.Получить();
    
    Если Не ЗначениеЗаполнено(ПрефиксИБ) Тогда
        Префикс = "00-";
    Иначе
        Префикс = ПрефиксИБ + "-";
    КонецЕсли;
    
КонецПроцедуры

#КонецОбласти

```

Все)

</details>

4. Создаем начальные образы подчиненных баз
В пользовательском режиме открываем созданный план обмена, настраиваем предопределенный узел текущей базы
Все созданные узлы в этом плане будут **подчинены** текущей базе.
![описание](/obmen-dannymi/rib/3.png)

Нажимаем команду `Создать начальный образ`, выбираем каталог, куда будет сохранен файл `.1cd` для файлового варианта или указываем параметры ИБ для серверного варианта
После этого просто создаем базу с теми параметрами подключения, которые указали выше (путь до папки в файловом варианте или строка подключения в серверном варианте)

В подчиненных базах для в пользовательском режиме можно будет посмотреть, какому узлу база подчинена
![описание](/obmen-dannymi/rib/4.png)

## Реализация выборочной регистрации изменений
Создаем подписки на событие:
| Имя подписки | Источник | Событие | Обработчик |
|-------------|-------------|-------------|-------------|
|`РегистрацияИзменений`| все **объекты**, которые участвуют в обмене |`ПриЗаписи`|`ОбменДаннымиРегистрацияСобытий.РИБ_РегистрацияПриЗаписи` (реализуем ниже)|
|`РегистрацияУдалений`| все **объекты**, которые участвуют в обмене |`ПередУдалением`|`ОбменДаннымиРегистрацияСобытий.РИБ_РегистрацияУдаленияПередУдалением` (реализуем ниже)|

Создаем общий модуль `ОбменДаннымиРегистрацияСобытий`, в котором определяем алгоритмы регистрации:

```bsl

#Область ПрограммныйИнтерфейс

Процедура РИБ_РегистрацияПриЗаписи(Источник, Отказ) Экспорт
    
    ЗарегистрироватьИзменениеОбъекта(Источник, Отказ);
    
КонецПроцедуры	     

Процедура РИБ_РегистрацияУдаленияПередУдалением(Источник, Отказ) Экспорт
    
    ЗарегистрироватьУдалениеОбъекта(Источник, Отказ);
    
КонецПроцедуры

#КонецОбласти

    
Процедура ЗарегистрироватьИзменениеОбъекта(Источник, Отказ)
    
    Если Отказ Тогда
        Возврат;
    КонецЕсли;

    ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка));

    // В примере подразумевается, что у всех документов есть реквизит "Магазин", по которому будем фильтровать подчиненные базы
    Магазин = ?(ЭтоДокумент, Источник.Магазин, Неопределено);

    // Получаем узлы, которые должны получить изменения выбранных документов
    УзлыОбмена = ОпределитьПолучателейОбъекта(Магазин);
    
    ПланыОбмена.ЗарегистрироватьИзменения(УзлыОбмена, Источник);
    
КонецПроцедуры

Процедура ЗарегистрироватьУдалениеОбъекта(Источник, Отказ) 
    
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка));
    Магазин = ?(ЭтоДокумент, Источник.Магазин, Неопределено);
    УзлыОбмена = ОпределитьПолучателейОбъекта(Магазин);
    
    ПланыОбмена.ЗарегистрироватьИзменения(УзлыОбмена, Новый УдалениеОбъекта(Источник.Ссылка));

КонецПроцедуры

Функция ОпределитьПолучателейОбъекта(Магазин = Неопределено)

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

    Возврат УзлыОбмена;

КонецФункции

#КонецОбласти

```