Реализация РИБ в базах без БСП
Перед началом работы
Что это такое
Распределенная информационная база (РИБ) - это совокупность связанных информационных баз, в которых поддерживается синхронизация конфигураций
и данных
РИБ служит для обмена идентичных информационных баз «1С: Предприятие 8». Чаще всего задача обменов между узлами РИБ сводится к выгрузке данных из периферийных узлов в центральную базу
В РИБ все конфигурации объеденены по строгой иерархии - центральная база может быть только одна, от которой создаются подчиненные узлы
Особенности работы с РИБ
- Обмен данными выполняется в формате ХML документов. Изменения конфигурации распространяются в сообщениях обмена вместе с изменениями данных.
- Внесение изменений в конфигурацию возможно только в одном (корневом) узле распределённой системы. Изменения конфигурации передаются от главного узла к подчинённым
- Внесение изменений в данные возможно в любом узле системы. Изменения данных передаются между любыми связанными узлами.
- При выгрузке данных на всех объектах (справочники, документы и т. д.) невозможно внесение изменений (устанавливается блокировка). Это может парализовать рабочий процесс на длительное время. Чтобы избежать этого, рекомендуется включать обмен после работы либо выгружать небольшой объём информации за один раз.
- При обмене данными в случае, если объект был изменен в корневом и подчиненном узлах одновременно (коллизия), ГЛАВНАЯ база перетирает изменения ПОДЧИНЕННОЙ
Пример работы в базах без БСП
Создание подчиненных баз
- Создаем план обмена. Во вкладке
Основное
устанавливаем флагиРаспределенная информационная база
иВключать расширения конфигурации
- Настраиваем состав плана обмена.
Авторегистрацию
запрещаем, т.к. необходимо будет вручную управлять регистрацией изменений. (Мы же не хотим отправить документы дочернего узла 2 в дочерний узел 1 и наоборот) - Реализуем префиксацию объектов любым способом. Главное, чтобы коды и номера элементов в базах в РИБ не пересекались.
Пример создания
Колхозное решение “на коленке”
- Создаем константу
ПрефиксИнформационнойБазы
(строка, 2 символа), не включаем ее в план обмена. Нам не нужно, чтобы она затиралась - Создаем подписки на события:
Имя подписки | Источник | Событие | Обработчик |
---|---|---|---|
УстановитьПрефиксИнформационнойБазыНомеруДокумента | все объекты ДокументОбъект , которые участвуют в обмене | ПриУстановкеНовогоНомера | ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы (реализуем ниже) |
УстановитьПрефиксИнформационнойБазыКодуСправочника | все объекты СправочникОбъект , которые участвуют в обмене | ПриУстановкеНовогоКода | ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы (реализуем ниже) |
- В общем модуле реализуем метод префиксации:
#Область ПрограммныйИнтерфейс
Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт
ПрефиксИБ = Константы.ПрефиксИнформационнойБазы.Получить();
Если Не ЗначениеЗаполнено(ПрефиксИБ) Тогда Префикс = "00-"; Иначе Префикс = ПрефиксИБ + "-"; КонецЕсли;
КонецПроцедуры
#КонецОбласти
Все)
- Создаем начальные образы подчиненных баз
В пользовательском режиме открываем созданный план обмена, настраиваем предопределенный узел текущей базы
Все созданные узлы в этом плане будут подчинены текущей базе.
Нажимаем команду Создать начальный образ
, выбираем каталог, куда будет сохранен файл .1cd
для файлового варианта или указываем параметры ИБ для серверного варианта
После этого просто создаем базу с теми параметрами подключения, которые указали выше (путь до папки в файловом варианте или строка подключения в серверном варианте)
В подчиненных базах для в пользовательском режиме можно будет посмотреть, какому узлу база подчинена
Реализация выборочной регистрации изменений
Создаем подписки на событие:
Имя подписки | Источник | Событие | Обработчик |
---|---|---|---|
РегистрацияИзменений | все объекты, которые участвуют в обмене | ПриЗаписи | ОбменДаннымиРегистрацияСобытий.РИБ_РегистрацияПриЗаписи (реализуем ниже) |
РегистрацияУдалений | все объекты, которые участвуют в обмене | ПередУдалением | ОбменДаннымиРегистрацияСобытий.РИБ_РегистрацияУдаленияПередУдалением (реализуем ниже) |
Создаем общий модуль ОбменДаннымиРегистрацияСобытий
, в котором определяем алгоритмы регистрации:
#Область ПрограммныйИнтерфейс
Процедура РИБ_РегистрацияПриЗаписи(Источник, Отказ) Экспорт
ЗарегистрироватьИзменениеОбъекта(Источник, Отказ);
КонецПроцедуры
Процедура РИБ_РегистрацияУдаленияПередУдалением(Источник, Отказ) Экспорт
ЗарегистрироватьУдалениеОбъекта(Источник, Отказ);
КонецПроцедуры
#КонецОбласти
Процедура ЗарегистрироватьИзменениеОбъекта(Источник, Отказ)
Если Отказ Тогда Возврат; КонецЕсли;
ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка));
// В примере подразумевается, что у всех документов есть реквизит "Магазин", по которому будем фильтровать подчиненные базы Магазин = ?(ЭтоДокумент, Источник.Магазин, Неопределено);
// Получаем узлы, которые должны получить изменения выбранных документов УзлыОбмена = ОпределитьПолучателейОбъекта(Магазин);
ПланыОбмена.ЗарегистрироватьИзменения(УзлыОбмена, Источник);
КонецПроцедуры
Процедура ЗарегистрироватьУдалениеОбъекта(Источник, Отказ)
Если Отказ Тогда Возврат; КонецЕсли;
ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка)); Магазин = ?(ЭтоДокумент, Источник.Магазин, Неопределено); УзлыОбмена = ОпределитьПолучателейОбъекта(Магазин);
ПланыОбмена.ЗарегистрироватьИзменения(УзлыОбмена, Новый УдалениеОбъекта(Источник.Ссылка));
КонецПроцедуры
Функция ОпределитьПолучателейОбъекта(Магазин = Неопределено)
УзлыОбмена = Новый Массив;
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РИБ.Ссылка КАК Ссылка |ИЗ | ПланОбмена.РИБ КАК РИБ |ГДЕ | НЕ РИБ.ПометкаУдаления | И НЕ РИБ.ЭтотУзел";
// "РИБ.Магазин = &Магазин" - // для простоты примера принимается, что в плане обмена есть реквизит "Магазин", который заполняется для каждого узла // На практике можно сделать соответствие "Узел-Магазин" любым другим способом, регистром сведений, например Если Магазин <> Неопределено Тогда Запрос.Текст = Запрос.Текст + " |И РИБ.Магазин = &Магазин"; | Или РИБ.Магазин = &ЦентральныйМагазин)"; // Центральный получает все документы Запрос.УстановитьПараметр("Магазин", Магазин); Запрос.УстановитьПараметр("ЦентральныйМагазин", ПланыОбмена.ГлавныйУзел().Магазин); КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл УзлыОбмена.Добавить(Выборка.Ссылка); КонецЦикла;
Возврат УзлыОбмена;
КонецФункции
#КонецОбласти