Конструкция "ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, НаборДляРегистрации);" замечательно работает на небольших объемах данных. Что делать, если ежедневно есть потребность в регистрации на обмен миллионов строк регистра, а ключ основного отбора исключает возможность использования стандартного механизма в силу временных ограничений? Выход зачастую один - писать в sql "руками".
Но если запись напрямую в sql из 1С справочников, регистров и документов разобрана довольно подробно, то с заполнением таблиц регистрации изменений могут возникнуть вопросы.
Для начала нам необходимо найти имя таблицы, где хранятся изменения регистра.
Это можно сделать следующей конструкцией:
МассивИменМетаданных = Новый Массив();
МассивИменМетаданных.Добавить("РегистрСведений.ИмяРегистраСведений");
СтрТЗИзменений = ТЗСтруктура.Найти("РегистрацияИзменений","Назначение");
ИмяТаблицыИзменений =СтрТЗИзменений.ИмяТаблицыХранения;
Пусть найденная таблица имеет имя "_InfoRgChngR14199".
Посмотрим, что эта таблица представляет из себя в Management Studio:
Аналогичную информацию можно получить при помощи многочисленных обработок по структуре хранения баз данных, например, этой //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.