Логическая репликация 1C:Предприятие 8
Подсистема “Механизм репликации” реализует логическую репликацию изменений данных для произвольных конфигураций 1С:Предприятие 8.
Концептуально подсистема опирается на функциональность логической репликации PostgreSQL. Реализация средствами 1С основана на подписках на события “ПередЗаписью”, “ПриЗаписи” и “ПередУдалением”. Сериализация изменений данных осуществляется при помощи формата JDTO (JSON data transfer object). Фиксация изменений выполняется в виде сообщений репликации в соответствующем регистре сведений подсистемы.
Основным назначением подсистемы “Механизм репликации” является интеграция с внешними по отношению к 1С:Предприятие 8 системами. Дальнейшее развитие подсистемы предполагает реализацию загрузки сообщений в формате JDTO в базы данных 1С. Для этого необходимо реализовать код десериализатора JDTO.
Для удобства интеграции с внешними системами планируется реализовать генератор JSON Schema для соответствующих объектов реплицируемой базы данных. Соответствующие документы в формате JSON Schema будут отдаваться внешней системе при помощи HTTP-сервиса.
Ключевые моменты:
- Репликация включается константой “МеханизмРепликацииИспользовать”.
- Настроить в плане обмена “МеханизмРепликации” код предопределённого узла (ЭтотУзел).
- Добавить хотя бы одного подписчика в план обмена “МеханизмРепликации” и назначить ему код, например “РИБ”.
- Добавление реплицируемых объектов в состав каких-либо планов обмена не требуется!
- Настроить состав подписок на события именно теми объектами, которые будут реплицироваться. Ненужные подписки - удалить.
- По желанию настроить формат сообщений для узлов-получателей в плане обмена “МеханизмРепликации”. По умолчанию используется формат JDTO.
- Доработка функциональности конфигурации может осуществляться в общем модуле “МеханизмРепликацииЭкспорт”.
- Конфигурация легко трансформируется в расширение и может быть использована именно так. Для настройки подписок на события при этом необходимо заимствовать соответствующие объекты основной конфигурации, к которой подключается расширение.
- Исходный код сериализатора JDTO обособлен в общем модуле “СериализаторJDTO” и может быть использован независимо от конфигурации.
- Фильтрация данных в текущей версии 1.0 не реализована. Реплицируется всё, что указано в подписках на события! Тем не менее фильтрация может быть реализована самостоятельно путём доработки экспортной процедуры “СформироватьМассивПолучателей” общего модуля “МеханизмРепликацииЭкспорт”.
- Любые ошибки выполнения перехватываются и фиксируются в журнале регистрации 1С. Основной код конфигурации при этом продолжает выполняться, но могут быть потерянные изменения. Следует это учитывать при доработках кода подсистемы под свои нужды!
- При импорте данных в реплицируемую конфигурацию предусмотрено программное отключение механизма репликации при помощи установки дополнительного свойства загружаемого объекта “НеИспользоватьМеханизмРепликации”. Проверка наличия этого флага выполняется в подписках на события “ПередЗаписью”.
ПрочитатьИмпортируемыеДанныеВОбъект(Данные, Объект);
Объект.ДополнительныеСвойства.Вставить("НеИспользоватьМеханизмРепликации");
Объект.Записать();
Заметки на будущее:
- Механизм отслеживания модифицированности объекта пока что не реализован. Он нужен в тех случаях, когда объект фактически не изменился с точки зрения данных, и по этой причине его репликация нежелательна, чтобы не увеличивать нагрузку на систему приёмника. Этот типовой механизм дедупликации данных можно интегрировать самостоятельно, изменив процедуру “ПроверитьМодифицированностьОбъекта” общего модуля “МеханизмРепликацииЭкспорт”. Типовой алгоритм можно найти в библиотеке стандартных подсистем (БСП) от 1С. Например его можно подсмотреть в функции “ОбъектМодифицированДляПланаОбмена” общего модуля “ОбменДаннымиРегистрацияСервер”.
- Для снижения нагрузки на базу-источник репликации возможно реализовать регистрацию изменений объектов по ссылкам. Это позволяет уменьшить продолжительность транзакции записи объекта за счёт того, что не выполняется сериализация данных объекта в формат JSON. Эта методика аналогична типовой реализации обменов данными 1С, основанной на планах обмена. Зарегистрированные ссылки в последствии используются при выгрузке сообщений обмена для получения текущих данных объекта (актуального снимка). При этом теряется история изменений, но в большинстве случаев она и не требуется.
Код десериализации для 1С пока что не реализован!
Регистр сведений “МеханизмРепликацииИсходящаяОчередь”
Свойство | Назначение | Тип данных | Описание |
---|---|---|---|
МоментВремени | Измерение | Число(15,0) | Время в миллисекундах для упорядочивания очереди по FIFO |
Идентификатор | Измерение | УникальныйИдентификатор | Ссылка на объект, регистратор или произвольный UUID (для независимых регистров сведений). Значение измерения генерируется в процедуре “СформироватьИдентификаторСообщения” общего модуля “МеханизмРепликацииЭкспорт”. |
Отправитель | Ресурс | Строка(36) | Код или идентификатор отправителя, реплицируемой базы данных. Код берётся из предопределённого узла плана обмена “МеханизмРепликации”. |
Получатели | Ресурс | Строка(0) | Коды получателей в формате CSV. Коды берутся из плана обмена “МеханизмРепликации”. |
ТипСообщения | Ресурс | Строка(1024) | Тип сообщения репликации. По умолчанию равно значению, которое возвращает вызов метода “ПолноеИмя” объекта метаданных. Например, “Справочник.Номенклатура”. |
ТелоСообщения | Ресурс | Строка(0) | Тело сообщения в указанном в плане обмена “МеханизмРепликации” формате. По умолчанию это формат JDTO. |
Заголовки | Реквизит | Строка(0) | Заголовки (метаданные) сообщения в формате JSON. По умолчанию это структура, имеющая следующие значения: версия схемы данных (конфигурации), тип операции DML базы данных 1С и формат тела сообщения. За формирование заголовков отвечает процедура “СформироватьЗаголовкиСообщения” общего модуля “МеханизмРепликацииЭкспорт”. |
ДатаВремя | Реквизит | Дата и время | Время формирования сообщения репликации. Используется текущее время сервера кластера 1С. |