При настройке правил обмена в конфигурации «Конвертация данных 2.1» разработчики часто сталкиваются с задачей переноса движений из регистра сведений, подчиненного регистратору, в независимый регистр сведений приемника. Если стандартный вызов ВыгрузитьПоПравилу() выгружает объект построчно через менеджер записи, то для выгрузки порции данных набором используется служебная процедура ВыгрузитьРегистр().
Однако при попытке сформировать произвольную структуру или таблицу значений и передать её в качестве набора записей в выгрузку попадают пустые строки. Разберем, почему возникает эта ошибка, как устроена процедура ВыгрузитьРегистр() и как правильно организовать выгрузку данных.
Проанализируем типовую ошибку. При попытке сымитировать набор записей через объект Структура с полями Отбор и Строки (в виде ТаблицаЗначений) механизм сериализации конвертации данных не может сопоставить структуру с метаданными реального регистра. В результате в результирующий XML-файл выгружается количество строк, равное числу записей в таблице, но сами поля внутри узлов остаются пустыми.
Процедура ВыгрузитьРегистр() в обработке выгрузки (V8Exchan8x.epf) жестко ожидает на вход типизированный объект платформы — РегистрСведенийНаборЗаписей (или набор записей регистров накопления/бухгалтерии).
Синтаксис процедуры имеет следующий вид:
ВыгрузитьРегистр(НаборЗаписей, ИмяПКО, ВходящиеДанные, НеЗамещать, ИмяПВД)
Параметры процедуры выполняют следующие функции:
РегистрСведенийНаборЗаписей источника с установленным отбором и заполненными записями.Разберем рабочий алгоритм настройки правила выгрузки данных (ПВД). В обработчике «Перед выгрузкой» создадим реальный объект набора записей регистра сведений, заполним его нужными строками с учетом фильтрации и передадим в процедуру ВыгрузитьРегистр().
Посмотрим на пример корректного кода в обработчике ПВД «Перед выгрузкой»:
// Создаем типизированный набор записей регистра источника
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Отбор.Регистратор.Значение);
// Заполняем набор нужными строками из исходной выборки
Для Каждого Запись Из Объект Цикл
// Пример дополнительной фильтрации данных
Если ЗначениеЗаполнено(Запись.СтруктурнаяЕдиница) И Запись.СтруктурнаяЕдиница.Ссылка <> Параметры.СтруктурнаяЕдиница.Ссылка Тогда
Продолжить;
КонецЕсли;
Строка = НаборЗаписей.Добавить();
Строка.Активность = Запись.Активность;
Строка.Номенклатура = Запись.Номенклатура;
Строка.Период = НачалоДня(Запись.Период);
Строка.Характеристика = Запись.Характеристика;
Строка.Цена = Запись.Цена;
Строка.КатегорияЦен = Запись.КатегорияЦен;
Строка.ЕдиницаИзмерения = Запись.ЕдиницаИзмерения;
Строка.Регистратор = Запись.Регистратор;
КонецЦикла;
// Выгружаем набор по ПКО "ЦеныНоменклатуры"
ВыгрузитьРегистр(НаборЗаписей, "ЦеныНоменклатуры", , Истина, "ЦеныНоменклатуры");
// Отменяем стандартную выгрузку исходного объекта
Отказ = Истина;
Обратите внимание: если строки в набор записей добавляются программно вручную через метод Добавить(), предварительный вызов Прочитать() для набора не требуется.
Разберем настройку правила конвертации объектов (ПКО):
КатегорияЦен источника связывается с полем ВидЦен приемника).ГУИДРегистратора), в котором требуется сохранить информацию о первичном документе, используйте обработчик «Перед выгрузкой» соответствующего ПКС:
Значение = Строка(Источник.Регистратор.УникальныйИдентификатор());
Проанализируем скрытые опасности, возникающие при переносе данных из подчиненного регистра в независимый:
Регистратор. В независимом регистре приемника такого измерения нет, и набор записывается по отбору ключевых измерений или периода. Если передать набор без корректного отбора и с параметром НеЗамещать = Ложь, платформа при загрузке вызовет НаборЗаписей.Записать(Истина) с пустым отбором. Это приведет к полному удалению всех ранее существовавших данных в регистре базы-приемника. Всегда передавайте НеЗамещать = Истина, если отбор в приемнике не сформирован явно.Если работа с целым набором записей вызывает сложности с коллизиями отборов, рассмотрим альтернативные варианты переноса:
ВыгрузитьПоПравилу(СтрокаВыборки, , , , "ПКО_ЦеныНоменклатуры");
В этом случае на стороне приемника каждая запись обрабатывается и записывается изолированно через РегистрСведенийМенеджерЗаписи.Номенклатура), набор формируется с отбором именно по этому измерению. При загрузке в приемнике будут перезаписаны только данные конкретной номенклатуры, не затрагивая остальные позиции.