Skip to main content

Планы обмена и РИБ

План обмена — объект конфигурации для организации обмена данными между узлами.

РИБ — частный случай использования планов обмена с централизованным управлением конфигурацией.

Иерархия и взаимосвязь

План обмена (базовый механизм)

├── Обычный обмен (разные конфигурации)

└── РИБ (специализированный обмен)
├── Главный узел (изменяет конфигурацию)
└── Подчиненные узлы (только данные)

Ключевые концепции плана обмена

КонцепцияОписаниеВажно
Узлы планаУчастники обмена (как элементы справочника)Каждая база — предопределенный узел в своем плане
Несколько плановРазные составы данных/механизмы для разных узловГибкая настройка обмена
Объекты обменаДанные для передачи: объекты БД + необъектные данныеДокументы, справочники, регистры, константы
Механизм регистрацииОтслеживание изменений через свойство ОбменДаннымиФормирует записи в таблицах регистрации изменений

Авторегистрация изменений:

РежимМеханизмГде настраивать
ВКЛЮЧЕНАРегистрируются любое изменение объекта (включая перепроведение). План обмена автоматически заполняет ОбменДанными.ПолучателиСостав данных плана обмена → признак Авторегистрация
ВЫКЛЮЧЕНАРазработчик программно заполняет ОбменДанными.ПолучателиОбработчики ПередЗаписью() и ПередУдалением(), Если после записи то использовать ПланОбмена.ЗарегистрироватьИзменения

Архитектура плана обмена

1. Регистрация изменений

  • Каждый объект обмена имеет свойство ОбменДанными
  • При записи/удалении → формируются записи в таблице регистрации
  • Одна запись на каждый узел-получатель

2. Таблицы регистрации

  • Отдельная таблица для каждого типа объектов обмена
  • Содержит: ссылку на объект, узел-получатель, номер сообщения
  • Создаются только если объект в составе плана обмена

3. Инфраструктура сообщений

  • Сообщение = единица обмена информации
  • Уникальный номер в рамках плана обмена
  • Подтверждения приема через номер последнего принятого сообщения

Особенности РИБ

АспектОбычный план обменаРИБ
КонфигурацияМожет отличатьсяОдинаковая, изменяется только в главном узле
НаправленностьЛюбая (peer-to-peer)Иерархическая (центр → подчиненные)
АвтономностьПолнаяОграниченная (без изменений конфигурации)
ИспользованиеИнтеграция разных системРаспределение одной системы

Критические ограничения РИБ:

  1. Главный узел — единственный источник изменений конфигурации
  2. Конфликты — разрешаются в пользу главного узла
  3. Зависимость — подчиненные не могут работать без обновлений конфигурации

Критические нюансы

Производительность:

  1. Авторегистрация ВКЛ → больше записей в таблице регистрации, возможны взаимные транзакционные блокировки
  2. Таблицы регистрации → дополнительная нагрузка при записи объектов
  3. Очистка записей → по подтверждениям от узлов-получателей

При ОбменДанными.Загрузка = Истина

НЕ работают:

  • ПриУстановкеНомера(), ПриУстановкеКода()
  • ОбработкаПроведения() (документов)
  • Автоматические заполнения и проверки
  • ПередЗаписью() и ПриЗаписи() сработают, но если объект по "стандарту" (реализована проверка), то фактически код их не выполнится

Техническая реализация

Таблица регистрации изменений:

ПолеНазначениеОсобенности
ОбъектСсылка на измененный объект
УзелУзел-получатель для этого изменения
СообщениеНомер сообщения, в котором отправленоNull пока не отправлено

Критерии выбора

Использовать план обмена, если:

  • ✅ Нужен обмен между базами 1С
  • ✅ Регулярная синхронизация данных
  • ✅ Встроенные механизмы конфликтов/повторов

Для обмена с разными конфигурациямии нужны правила конвертации данных.

Использовать РИБ, если:

  • ✅ Одна распределенная система
  • ✅ Централизованное управление конфигурацией
  • ✅ Иерархическая структура (центр → филиалы)

Примеры работы

1. Регистрация объекта только, если новый:

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

2. Удалить объект из регистрации при включеной Авторегистрации:

Процедура ПередЗаписью(Отказ)
// Авторегистрация заполнила Получатели
// Удаляем ненужные узлы
Для Каждого Узел Из ОбменДанными.Получатели Цикл
Если Не НуженЭтоУзел(Узел) Тогда
ОбменДанными.Получатели.Удалить(Узел);
КонецЕсли;
КонецЦикла;
КонецПроцедуры;