РИБ в 1С 8.3

Курс

Распределенная информационная база

РИБ (Распределенная Информационная База) — это несколько информационных баз 1С, объединенных в иерархическую структуру.

РИБ основывается на планах обмена. Чтобы план обмена можно было использовать в РИБ нужно в настройках плана обмена на закладке Основные установить флаг Распределенная информационная база:

Распределенная информационная база

Узлы РИБ всегда образуют иерархическую структуру. У каждого узла, кроме корневого, есть только один главный узел и произвольное количество подчиненных узлов:

Распределенная информационная база

В данном примере База Москва — это корневой узел. У него нет главного узла и есть 2 подчиненных узла: База Новосибирск и База Питер. В свою очередь База Питер является главным узлом для двух розничных складов. То есть один узел может быть одновременно и главным и подчиненным.

Каждый узел может обмениваться данными только со своими «соседями». Москва может меняться только с Новосибирском и Питером. Питер только с розничными складами. При этом Новосибирск не может напрямую меняться с Питером, сначала обмен выполняется с Москвой (Москва является главным узлом для Новосибирска), а потом Москва меняется с Питером. В результате изменения в любом из узлов стремятся распространиться по всем узлам.

При этом в состав узлов плана обмена нужно включать только те базы, с которыми выполняется обмен. То есть в базе Москва не должно быть узлов для розничных складов. А база Питер ничего не должна знать о базе Новосибирск, потому что она с ней не обменивается. Более того, для обмена могут использоваться разные планы обмена. Например, для обмена Москва — Новосибирск и Москва — Питер используется один план обмена. А для обмена Питер — Розничные склады используется второй план обмена.

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

Создание узла РИБ

Создать узел РИБ можно несколькими способами:

  • Интерактивно
  • Программно
  • Из файла конфигурации
  • Из копии базы

Интерактивное создание начального образа РИБ

Для интерактивного создания начального образа РИБ нужно выполнить следующие шаги:

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

В процессе создания начального образа будут выполнены следующие действия:

  1. Создана новая база, согласно настройкам.
  2. В данную базу будет загружена конфигурация из главного узла (из которого создавался начальный образ).
  3. В новую базу будет выполнен перенос всех данных, которые входят в состав плана обмена для РИБ (независимо от того были ли они зарегистрированы на момент создания образа).
  4. В новой базе в списке узлов плана обмена будет создано 2 узла: предопределенный для создаваемой базы (узел Новосибирск). И главный узел, из которого был создан начальный образ — Москва:
РИБ

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

После создания начального образа будет отменена вся регистрация изменений для данного узла (если что-то было зарегистрировано).

Чтобы программно узнать какой узел является главным для текущей базы нужно вызвать метод ГлавныйУзел. Данный метод вернет ссылку на главный узел или Неопределено, если текущий узел сам является главным, или база не входит в состав РИБ:

Программное создание начального образа РИБ

Для программного создания начального образа РИБ нужно выполнить следующие шаги:

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

В результате будет создана новая база, аналогично интерактивному созданию.

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

Создание узла РИБ из файла конфигурации

Новый узел РИБ можно создать из файла конфигурации. Для этого нужно:

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

Чтобы сделать узел главным нужно вызвать метод УстановитьГлавныйУзел, передав ему параметром ссылку на тот узел, который должен стать главным:

Подчиненная база будет создана, но в отличии от предыдущих способов база будет полностью пустая.

Создание узла РИБ из копии базы

Новый узел РИБ можно создать из копии базы. Для этого нужно:

  1. В основной базе создать новый узел.
  2. В копии нужно удалить все не предопределенные узлы. а у предопределенного изменить код и наименование как у нового узла.
  3. Добавить узел плана обмена для главной базы и сделать его главным методом УстановитьГлавныйУзел.

Выполнение обмена в РИБ

Обмен в РИБ может быть выполнен полностью интерактивно. Для этого нужно:

  1. Открыть список узлов плана обмена. Выделить тот с которым нужно выполнить обмен и нажать на кнопку Записать изменения:
Записать изменения
  1. Будет открыто окно, в котором можно указать сколько элементов будет записано в одной транзакции и нужно ли сжимать файл обмена. Оставим все без изменений и нажмем Записать и сохранить файл:
Записать и сохранить файл
  1. Изменения будут записаны в файл обмена, файл будет заархивирован в zip-архив и будет предложено сохранить его на диск:
Записать и сохранить файл
  1. Сохраним его куда-нибудь.
  1. Теперь в приемнике нужно выделить узел от которого хотим получить изменения и нажать Прочитать изменения:
Прочитать изменения
  1. Будет открыто окно в котором можно указать сколько элементов записывать в базу в одной транзакции. Оставим без изменений и нажмем кнопку Выбрать файл и прочитать изменения:
Выбрать файл и прочитать изменения
  1. Выберем файл, который сохранили до этого и данные будут загружены.

Программный обмен в РИБ

Программный обмен в РИБ похож на обычный обмен между двумя узлами плана обмена. Но тут вместо сериализации объектов в XML используется один метод ЗаписатьИзменения, которому параметрами нужно передать сообщение обмена и количество элементов обрабатываемых в одной транзакции:

Если не указать второй параметр, то в все данные будут записаны в рамках одной транзакции.

Метод ЗаписатьИзменения запишет в сообщение обмена все данные, зарегистрированные для узла РИБ.

Пример программной выгрузки данных для узла РИБ:

Для загрузки используется метод ПрочитатьИзменения. Параметры такие же: сообщение обмена и количество элементов обрабатываемых в одной транзакции:

Пример загрузки данных в РИБ:

Стоит отметить, что при обмене в рамках РИБ не нужно вызывать метод УдалитьРегистрациюИзменений для удаления регистрации изменений. Это будет выполнено автоматически при вызове метода ПрочитатьИзменения.

Файл обмена в РИБ

Файл обмена в РИБ немного отличается от файла, которые используется при обычном обмене через планы обмена. Корневым узлом все также является тег Message, который содержит 2 вложенных узла:

  • Header — заголовок, такой же как и у обычного обмена
  • Body — содержит тело сообщения обмена.

Рассмотрим тег Body, так как он существенно отличается от обычного обмена. Данный узел содержит только один вложенный узел Changes. А вот Changes включает в себя все данные, передаваемые в сообщениях обмена:

  • Тег Signature — подпись плана обмена (это идентификатор объекта метаданных).
  • Тег Config — изменения конфигурации.
  • Тег Nodes — присутствует только при передаче данных от главного узла подчиненного. Содержит сведения об узлах обмена (о главном и подчиненном).
  • Тег Data — сами данные в сериализованном виде.

Пример файла обмена, выгруженного из главного узла:

Передача изменений конфигурации

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

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

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

обновить конфигурацию базы данных

После этого нужно повторно загрузить сообщение обмена, чтобы загрузились данные, которые пришли из главного узла.

В файле обмена изменения конфигурации передаются внутри узла Config. Изменения каждого объекта метаданных передаются во вложенных узлах Metadata. Если изменений не было, то не будет и узлов Metadata.

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

В периферийном узле конфигурация не доступна для изменения и возле всех объектов отображается замок:

замок

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

Данные принимаются от узла, для которого зарегистрированы изменения конфигурации

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

Восстановление конфигурации узла РИБ

Иногда при загрузке сообщения обмена между столкнуться с ошибкой «Конфигурация узла распределенной ИБ не соответствует ожидаемой!»:

Конфигурация узла распределенной ИБ не соответствует ожидаемой

При этом никаких изменений конфигурации в корневом узле не было.

Для исправления нужно выполнить следующие шаги:

  1. Выгрузить файл конфигурации из корневого узла (В конфигураторе выбрать Конфигурация — Сохранить конфигурацию в файл).
  2. В периферийном узел отвязать базу от РИБ. Для этого нужно выполнить следующую строку кода:

  1. Загрузить файл конфигурации из корневого узла в периферийный узел (В конфигураторе выбрать Конфигурация — Загрузить конфигурацию из файла).
  2. Привязать периферийный узел к РИБ, выполнив следующую строку кода:

После этого нужно повторно выполнить обмен.

Другой способ отвязать узел от РИБ это запустить конфигуратор с дополнительным параметром запуска /ResetMasterNode:

ResetMasterNode

Обработчики событий плана обмена

У плана обмена есть несколько событий, которые находятся в модуле объекта. Рассмотрим их.

ПриОтправкеДанныхПодчиненному

Событие ПриОтправкеДанныхПодчиненному возникает при выгрузке каждого зарегистрированного объекта в сообщение обмена. Событие вызывается до помещения объекта в сообщение обмена. Данное событие вызывается только если выгрузка выполняется в главном узле РИБ.

У события есть 3 параметра:

  • ЭлементДанных — выгружаемый объект, набор записей, менеджер значения константы.
  • ОтправкаЭлемента — с помощью данного параметра можно отменить выгрузку объекта или вместо самого объекта выгрузить объект УдалениеОбъекта (для набора записей будет выгружен пустой набор).
  • СозданиеНачальногоОбраза — если выгрузка выполняется при создании начального образа, то данный параметр равен Истина. При обычной выгрузке равен Ложь.

Стоит отметить, что для константы установка параметру ОтправкаЭлемента значения ОтправкаЭлементаДанных.Удалить не имеет смысла. Все равно будет выгружено значение константы.

ПриОтправкеДанныхГлавному

Событие ПриОтправкеДанныхГлавному аналогично предыдущему событию, но вызывается при выгрузке каждого объекта из подчиненного узла в главный. Параметры такие же, только нет последнего параметра СозданиеНачальногоОбраза, так как из подчиненного узла нельзя создать начальный образ.

ПриПолученииДанныхОтГлавного

Событие ПриПолученииДанныхОтГлавного вызывается только в подчиненном узле при загрузке сообщения обмена из главного узла. Данное событие будет вызвано для каждого объекта, который был прочитан из сообщения обмена.

Параметры события:

  • ЭлементДанных — загружаемый объект, набор записей или менеджер значения константы.
  • ПолучениеЭлемента — с помощью данного параметра можно отменить загрузку объекта.
  • ОтправкаНазад — по умолчанию равен Ложь. Если присвоить Истина, то загружаемый объект будет зарегистрирован для того узла, из которого сейчас выполняется загрузка.

ПриПолученииДанныхОтПодчиненного

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

ПриОтправкеДанныхУзлаПодчиненному

Событие ПриОтправкеДанныхУзлаПодчиненному вызывается только в главном узле. Данное событие вызывается дважды при выгрузке данных узла в файл обмена: при выгрузке данных главного узла и при выгрузке данных подчиненного узла.

Параметры события:

  • ЭлементДанных — выгружаемый узел плана обмена.
  • Игнорировать — если установить Истина, то данные узла не будут выгружены.

Данное событие можно использовать, чтобы не переносить данные узлов в подчиненные базы:

ПриПолученииДанныхУзлаОтГлавного

Событие ПриПолученииДанныхУзлаОтГлавного вызывается только в подчиненном узле, при загрузке данных узла из сообщения обмена. В данном событии те же самые параметры, что и в событии ПриОтправкеДанныхУзлаПодчиненному. Если установить параметр Игнорировать = Истина, то данные загруженного узла не будут записаны в базу:

Разрешение коллизий в РИБ

По умолчанию в РИБ коллизии разрешаются в пользу главного узла. То есть если при загрузке товара в подчиненный узел выяснится, что этот же товар зарегистрирован в подчиненном узле для выгрузки в главный узел, то товар будет записан в базу, а регистрация будет отменена. И наоборот, если товар загружается в главный узел и этот же товар зарегистрирован для подчиненного узла, из которого выполняется загрузка, то товар не будет загружен, регистрация изменений останется и в дальнейшем товар будет выгружен в подчиненный узел.

Если нужно чтобы коллизии разрешались в пользу подчиненного узла, то нужно использовать обработчики событий ПриПолученииДанныхОтПодчиненного и ПриПолученииДанныхОтГлавного.

В обработчике ПриПолученииДанныхОтПодчиненного нужно явно указать, что данные должны быть приняты. В этом случае данные будут загружены, даже если они зарегистрированы в главном узле:

В обработчике ПриПолученииДанныхОтГлавного нужно проверить не зарегистрирован ли загружаемый объект и если зарегистрирован, то отменить его загрузку:

Префиксы объектов

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

Чтобы этого избежать рекомендуется для каждой базы использовать свой уникальный префикс номера. Для этого нужно:

  1. Создать константу, которая будет хранить префикс номера для каждой базы. Константу не нужно включать в состав плана обмена, потому что у каждой базы будет свой префикс.
  2. В модуле объектов в обработчике ПриУстановкеНовогоКода добавить следующий код:

  1. Для каждого узла заполнить значение константы.

В результате после обмена могут быть объекты с одинаковым числовым кодом, но разным префиксом:

Префикс

Фильтр передаваемых данных в РИБ

Иногда может потребоваться отправлять в подчиненный узел не все данные. Например, есть 2 розничных склада, у каждого из них своя база (узел РИБ) и каждый из них должен получать только документы со своим складом.

Для фильтрации данных нужно выполнить следующие действия:

  1. Добавить реквизит Склад для плана обмена.
  2. В обработчике ПриОтправкеДанныхПодчиненному проверить склад документа и если он не совпадает с реквизитам узла плана обмена, то не выгружать такой документ:

Здесь параметру ОтправкаЭлемента присваивается значение Удалить, а не Игнорировать. В результате, если склад не совпадает, то в узел будет отправлен объект УдалениеОбъекта. Так сделано для того, чтобы если в документе изменился склад, то он был удален в том узле, куда он был отправлен ранее.


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Сергей

    Спасибо вам за статью. :idea:

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok