Как "заменить" РИБ? Часть 1

10.12.25

Интеграция - Перенос данных 1C

Размышления на тему, как заменить РИБ средствами платформы.

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

Все размышления и примеры алгоритмов/кода являются не более чем фантазией автора.

 

Часть 1 - Регистрация изменений

Я хочу более гибко управлять регистрацией изменений. Без конфигуратора, без КД - в режиме клиента. При этом регистрировать изменения только объектов, которые были изменены с возможностью произвольной проверки на необходимость регистрации.

Кратко, но с пояснениями, поехали.

1. Добавляю подсистему "УниверсальныйОбмен". В неё буду включать все последующие объекты. Картинка по вкусу.

2. Добавляю константу "ИспользоватьУниверсальныйОбмен" (Булево).

3. Добавляю функциональную опцию "ИспользоватьУниверсальныйОбмен", Хранение - константа "ИспользоватьУниверсальныйОбмен". В состав буду включать все объекты подсистемы "УниверсальныйОбмен", кроме константы "ИспользоватьУниверсальныйОбмен".

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

 
 Общий модуль - УниверсальныйОбменСервер

 

5. Регистрировать изменения буду в Регистре сведений (альтернатив, как бы, и нет). Назову его "ОбъектыЗарегистрированныеКВыгрузке". Независимый, непериодический. Для всех измерений и ресурсов Полнотекстовый поиск = Не использовать, История данных = Не использовать (если доступна). 

Измерения: 

"Идентификатор" (Строка, 36), Индексировать = Да

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

Ресурсы:

"Дата" (ДатаВремя);

дата и время регистрации объекта, нужно исключительно для удобства просмотра

"МеткаВремени" (Число, 25), Индексировать = Да;

а вот тут реальное время регистрации, полученное через ТекущаяУниверсальнаяДатаВМиллисекундах()

"ИдентификаторМетаданных" (Строка, 150), Индексировать = Да;

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

"КлючОбъекта" (Строка, 0);

что-то уникальное, по чему можно будет гарантированно найти объект не только ссылочного типа

"ХешКлючаОбъекта" (Строка, 50), Индексировать = Да

для возможности группировки в запросах, SHA256 хеш от ресурса "КлючОбъекта"

 
 Регистр сведений - ОбъектыЗарегистрированныеКВыгрузке

 

6.Создаю подписки на события для объектов, которые хочу регистрировать (Константы, Ссылочные объекты, Наборы записей). Подписки нужны для двух событий - ПередЗаписью и ПриЗаписи.

Для наборов записей вот так:

Подписка "РегистрацияНабораЗаписейПередЗаписью", 

Источник - РегистрСведенийНаборЗаписей, РегистрБухгалтерииНаборЗаписей, РегистрНакопленияНаборЗаписей

Событие - ПередЗаписью

Обработчик - УниверсальныйОбменСервер.РегистрацияНабораЗаписейПередЗаписью

 
 Подписка на событие - РегистрацияНабораЗаписейПередЗаписью

 

Подписка "РегистрацияНабораЗаписейПриЗаписи", 

Источник - РегистрСведенийНаборЗаписей, РегистрБухгалтерииНаборЗаписей, РегистрНакопленияНаборЗаписей

Событие - ПриЗаписи

Обработчик - УниверсальныйОбменСервер.РегистрацияНабораЗаписейПриЗаписи

 
 Подписка на событие - РегистрацияНабораЗаписейПриЗаписи

 

7. Код процедуры подписки на событие ПередЗаписью:

 
 Процедура РегистрацияНабораЗаписейПередЗаписью

 

8. Код подписки на событие ПриЗаписи:

 
 Процедура РегистрацияНабораЗаписейПриЗаписи

 

В итоге получаю хранение ключей объектов, которые изменились.

Что с этим делать дальше - в следующей части.

P.S. Некоторые куски кода пропущены умышленно, потому как вызываются процедуры и функции, описание которых выходит за рамки публикации. В конце всех частей, возможно, будет полный листинг общего модуля.

Вступайте в нашу телеграмм-группу Инфостарт

РИБ Обмен данными Универсальный обмен

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

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