Skip to content

Реализация РИБ в базах без БСП

Перед началом работы

Что это такое

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

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

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

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

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

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

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

Колхозное решение “на коленке”

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

Все)

  1. Создаем начальные образы подчиненных баз В пользовательском режиме открываем созданный план обмена, настраиваем предопределенный узел текущей базы Все созданные узлы в этом плане будут подчинены текущей базе. описание

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

В подчиненных базах для в пользовательском режиме можно будет посмотреть, какому узлу база подчинена описание

Реализация выборочной регистрации изменений

Создаем подписки на событие:

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

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

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