Наверное, каждый разработчик, который работал с РИБ, рано или поздно хотел его поменять. Особенно если узлов обмена много.
Все размышления и примеры алгоритмов/кода являются не более чем фантазией автора.
Часть 1 - Регистрация изменений
Я хочу более гибко управлять регистрацией изменений. Без конфигуратора, без КД - в режиме клиента. При этом регистрировать изменения только объектов, которые были изменены с возможностью произвольной проверки на необходимость регистрации.
Кратко, но с пояснениями, поехали.
1. Добавляю подсистему "УниверсальныйОбмен". В неё буду включать все последующие объекты. Картинка по вкусу.
2. Добавляю константу "ИспользоватьУниверсальныйОбмен" (Булево).
3. Добавляю функциональную опцию "ИспользоватьУниверсальныйОбмен", Хранение - константа "ИспользоватьУниверсальныйОбмен". В состав буду включать все объекты подсистемы "УниверсальныйОбмен", кроме константы "ИспользоватьУниверсальныйОбмен".
4. Создаю Общий модуль, называю его "УниверсальныйОбменСервер". Галки - Сервер, Привилегированный. Привилегированный необходим, чтобы код исполнялся вне зависимости от прав пользователя.
5. Регистрировать изменения буду в Регистре сведений (альтернатив, как бы, и нет). Назову его "ОбъектыЗарегистрированныеКВыгрузке". Независимый, непериодический. Для всех измерений и ресурсов Полнотекстовый поиск = Не использовать, История данных = Не использовать (если доступна).
Измерения:
"Идентификатор" (Строка, 36), Индексировать = Да
тут я буду хранить строковое представление уникального идентификатора, чтобы каждая запись регистрации была уникальной. Строковое, а не УникальныйИдентификатор, чтобы измерение можно было увидеть в формах, например, или в консоли запросов
Ресурсы:
"Дата" (ДатаВремя);
дата и время регистрации объекта, нужно исключительно для удобства просмотра
"МеткаВремени" (Число, 25), Индексировать = Да;
а вот тут реальное время регистрации, полученное через ТекущаяУниверсальнаяДатаВМиллисекундах()
"ИдентификаторМетаданных" (Строка, 150), Индексировать = Да;
длина наименования объекта метаданных не может быть более 80 символов и при этом в запросе нельзя делать группировку по строкам неограниченной длинны, 150 символов будет даже с запасом.
"КлючОбъекта" (Строка, 0);
что-то уникальное, по чему можно будет гарантированно найти объект не только ссылочного типа
"ХешКлючаОбъекта" (Строка, 50), Индексировать = Да
для возможности группировки в запросах, SHA256 хеш от ресурса "КлючОбъекта"
6.Создаю подписки на события для объектов, которые хочу регистрировать (Константы, Ссылочные объекты, Наборы записей). Подписки нужны для двух событий - ПередЗаписью и ПриЗаписи.
Для наборов записей вот так:
Подписка "РегистрацияНабораЗаписейПередЗаписью",
Источник - РегистрСведенийНаборЗаписей, РегистрБухгалтерииНаборЗаписей, РегистрНакопленияНаборЗаписей
Событие - ПередЗаписью
Обработчик - УниверсальныйОбменСервер.РегистрацияНабораЗаписейПередЗаписью
Подписка "РегистрацияНабораЗаписейПриЗаписи",
Источник - РегистрСведенийНаборЗаписей, РегистрБухгалтерииНаборЗаписей, РегистрНакопленияНаборЗаписей
Событие - ПриЗаписи
Обработчик - УниверсальныйОбменСервер.РегистрацияНабораЗаписейПриЗаписи
7. Код процедуры подписки на событие ПередЗаписью:
8. Код подписки на событие ПриЗаписи:
В итоге получаю хранение ключей объектов, которые изменились.
Что с этим делать дальше - в следующей части.
P.S. Некоторые куски кода пропущены умышленно, потому как вызываются процедуры и функции, описание которых выходит за рамки публикации. В конце всех частей, возможно, будет полный листинг общего модуля.
Вступайте в нашу телеграмм-группу Инфостарт



