gifts2017

Регистрация изменений в узле плана обмена данных независимых регистров сведений напрямую в sql

Опубликовал Alexander Kondrin (AlexKo) в раздел Программирование - Практика программирования

Запись напрямую в sql из 1С справочников, регистров и документов разобрана довольно подробно.
Рассмотрим, как зарегистрировать в узле плана обмена данные независимого регистра сведений.

Конструкция "ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, НаборДляРегистрации);" замечательно работает на небольших объемах данных. Что делать, если ежедневно есть потребность в регистрации на обмен миллионов строк регистра, а ключ основного отбора исключает возможность использования стандартного механизма в силу временных ограничений? Выход зачастую один - писать в sql "руками".

Но если запись напрямую в sql из 1С справочников, регистров и документов разобрана довольно подробно, то с заполнением таблиц регистрации изменений могут возникнуть вопросы.

Для начала нам необходимо найти имя таблицы, где хранятся изменения регистра.

Это можно сделать следующей конструкцией:

МассивИменМетаданных = Новый Массив(); 
МассивИменМетаданных.Добавить("РегистрСведений.ИмяРегистраСведений"); 
СтрТЗИзменений = ТЗСтруктура.Найти("РегистрацияИзменений","Назначение");
ИмяТаблицыИзменений =СтрТЗИзменений.ИмяТаблицыХранения;

Пусть найденная таблица имеет имя "_InfoRgChngR14199".

Посмотрим, что эта таблица представляет из себя в Management Studio:

MS SQL

 

Аналогичную информацию можно получить при помощи многочисленных обработок по структуре хранения баз данных, например, этой http://infostart.ru/public/147147/

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


Поля _Fld14038RRef, _Fld14111RRef, _Fld14085RRef это измерения регистра сведений, у которых стоит флаг "Основной отбор".

 Основной отбор

 

Поле _MessageNo это номер сообщения обмена данными, в которое было выгружено это изменение, или NULL, если оно еще не было выгружено.

 

Посмотрим таблицу плана обмена. Поле _NodeTRef это ссылка на таблицу плана обмена, тип данных этого поля binary(4). Таблица плана обмена

Рассмотрим, как получить преобразованную в binary(4) ссылку.

В примере имя таблицы _Node7079. Из этого имени необходимо взять постфикс "7079" и привести

МассивИменМетаданных = Новый Массив(); 
МассивИменМетаданных.Добавить("ПланОбмена.ОбменСКПК"); 
ТЗСтруктура = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, Истина);
СтрТЗСтруктура = ТЗСтруктура.Найти("ПланОбмена.ИмяПланаОбмена","ИмяТаблицы");
ИмяТаблицыПланОбмена = СтрТЗСтруктура.ИмяТаблицыХранения;
Строка_NodeTRef = " cast ("+СтрЗаменить(ИмяТаблицыПланОбмена,"_Node","")+" as binary(4))";

Переменную Строка_NodeTRef далее можно использовать в прямых запросах sql.

Поле таблицы изменений _NodeRRef соответствует полю _IDRRef таблицы плана обмена. 

Таким образом, разобрав структуру передаваемых данных, не составляет труда передать готовую таблицу с изменениями в sql. 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Дмитрий Шерстобитов (DitriX) 30.04.15 11:44
Отлично. Только вы бы еще построили график, где видно будет - начиная с какого момента будет идти прирост.
Видь зарегестрировать 1000 000 записей в один узел - это одно, а в сто узлов - уже немного другая задача.
Это раз, и два - какая разница в скорости между тем, что бы делать отбор в момент чтения данных из узла, т.е. в узел мы регистрируем все данные, без отбора, а вот при формировании выгрузки - делаем отбор.
2. Denis Bazin (Bazin) 30.04.15 12:38
Писал я выгрузку из планов обмена. Алгоритм простенький:

Объект = ВыбратьИзменения(...)
[тут выгрузка это объекта]
УдалитьРегистрациюИзменений(Объект)

И если пользователь изменял объект в это промежутке, то эти изменения не выгружаются.
3. Максим Зудин (kasper076) 30.04.15 13:06
4. Alexander Kondrin (AlexKo) 30.04.15 13:18
5. Alexander Kondrin (AlexKo) 30.04.15 13:19
(1) DitriX,
Если появится время, постараюсь подготовить графики и сравнение, будет наглядно.
6. Дмитрий Шерстобитов (DitriX) 01.05.15 17:02
(5) спасибо, а то никогда не бывает решения на все случаи жизни,100% где то есть минус такого подхода, и я не про очевидные минуса говорю
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа