Как правильно перенести подчиненный регистр сведений в независимый с помощью процедуры ВыгрузитьРегистр() в Конвертации данных?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации «Конвертация данных 2.1» разработчики часто сталкиваются с задачей переноса движений из регистра сведений, подчиненного регистратору, в независимый регистр сведений приемника. Если стандартный вызов ВыгрузитьПоПравилу() выгружает объект построчно через менеджер записи, то для выгрузки порции данных набором используется служебная процедура ВыгрузитьРегистр().

Однако при попытке сформировать произвольную структуру или таблицу значений и передать её в качестве набора записей в выгрузку попадают пустые строки. Разберем, почему возникает эта ошибка, как устроена процедура ВыгрузитьРегистр() и как правильно организовать выгрузку данных.

Причина ошибки: почему строки набора выгружаются пустыми

Проанализируем типовую ошибку. При попытке сымитировать набор записей через объект Структура с полями Отбор и Строки (в виде ТаблицаЗначений) механизм сериализации конвертации данных не может сопоставить структуру с метаданными реального регистра. В результате в результирующий XML-файл выгружается количество строк, равное числу записей в таблице, но сами поля внутри узлов остаются пустыми.

Процедура ВыгрузитьРегистр() в обработке выгрузки (V8Exchan8x.epf) жестко ожидает на вход типизированный объект платформы — РегистрСведенийНаборЗаписей (или набор записей регистров накопления/бухгалтерии).

Синтаксис процедуры имеет следующий вид:

ВыгрузитьРегистр(НаборЗаписей, ИмяПКО, ВходящиеДанные, НеЗамещать, ИмяПВД)

Параметры процедуры выполняют следующие функции:

  1. НаборЗаписей — объект типа РегистрСведенийНаборЗаписей источника с установленным отбором и заполненными записями.
  2. ИмяПКО — имя правила конвертации объектов, по которому сопоставляются поля регистра (если не указано, берется имя по умолчанию).
  3. ВходящиеДанные — произвольная структура дополнительных параметров, передаваемых в обработчики.
  4. НеЗамещать — булево значение. Флаг управляет режимом записи набора в приемнике (замещать существующие записи по отбору или объединять с ними).
  5. ИмяПВД — имя правила выгрузки данных, в рамках которого вызывается процедура.

Пошаговое решение: правильное формирование набора в обработчике ПВД

Разберем рабочий алгоритм настройки правила выгрузки данных (ПВД). В обработчике «Перед выгрузкой» создадим реальный объект набора записей регистра сведений, заполним его нужными строками с учетом фильтрации и передадим в процедуру ВыгрузитьРегистр().

Посмотрим на пример корректного кода в обработчике ПВД «Перед выгрузкой»:


// Создаем типизированный набор записей регистра источника
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Отбор.Регистратор.Значение);

// Заполняем набор нужными строками из исходной выборки
Для Каждого Запись Из Объект Цикл 
    // Пример дополнительной фильтрации данных
    Если ЗначениеЗаполнено(Запись.СтруктурнаяЕдиница) И Запись.СтруктурнаяЕдиница.Ссылка <> Параметры.СтруктурнаяЕдиница.Ссылка Тогда
        Продолжить;
    КонецЕсли;

    Строка = НаборЗаписей.Добавить();
    Строка.Активность = Запись.Активность;
    Строка.Номенклатура = Запись.Номенклатура;
    Строка.Период = НачалоДня(Запись.Период);
    Строка.Характеристика = Запись.Характеристика;
    Строка.Цена = Запись.Цена;
    Строка.КатегорияЦен = Запись.КатегорияЦен;
    Строка.ЕдиницаИзмерения = Запись.ЕдиницаИзмерения;
    Строка.Регистратор = Запись.Регистратор;
КонецЦикла;

// Выгружаем набор по ПКО "ЦеныНоменклатуры"
ВыгрузитьРегистр(НаборЗаписей, "ЦеныНоменклатуры", , Истина, "ЦеныНоменклатуры");

// Отменяем стандартную выгрузку исходного объекта
Отказ = Истина;

Обратите внимание: если строки в набор записей добавляются программно вручную через метод Добавить(), предварительный вызов Прочитать() для набора не требуется.

Настройка ПКО и ПКС для независимого регистра

Разберем настройку правила конвертации объектов (ПКО):

  1. В ПКО сопоставьте свойства источника и приемника (например, поле КатегорияЦен источника связывается с полем ВидЦен приемника).
  2. Для реквизита или дополнительного строкового реквизита (например, ГУИДРегистратора), в котором требуется сохранить информацию о первичном документе, используйте обработчик «Перед выгрузкой» соответствующего ПКС:

Значение = Строка(Источник.Регистратор.УникальныйИдентификатор());

Важные нюансы и риски при загрузке в независимый регистр

Проанализируем скрытые опасности, возникающие при переносе данных из подчиненного регистра в независимый:

  1. Риск полной очистки регистра в приемнике. В подчиненном регистре отбор всегда жестко завязан на Регистратор. В независимом регистре приемника такого измерения нет, и набор записывается по отбору ключевых измерений или периода. Если передать набор без корректного отбора и с параметром НеЗамещать = Ложь, платформа при загрузке вызовет НаборЗаписей.Записать(Истина) с пустым отбором. Это приведет к полному удалению всех ранее существовавших данных в регистре базы-приемника. Всегда передавайте НеЗамещать = Истина, если отбор в приемнике не сформирован явно.
  2. Коллизии уникальности записей. В подчиненном регистре уникальность записи обеспечивается регистратором и номером строки. В независимом регистре уникальным ключом является комбинация периода и измерений. Если разные документы в источнике делали движения с одинаковыми измерениями на одну дату, при записи в независимый регистр возникнет ошибка дублирования записей. В таких случаях данные перед выгрузкой рекомендуется сворачивать запросом.

Альтернативные способы переноса записей

Если работа с целым набором записей вызывает сложности с коллизиями отборов, рассмотрим альтернативные варианты переноса:

  1. Построчная выгрузка через менеджер записи. В ПВД с произвольным алгоритмом данные регистра выбираются запросом. Для каждой полученной строки вызывается: ВыгрузитьПоПравилу(СтрокаВыборки, , , , "ПКО_ЦеныНоменклатуры"); В этом случае на стороне приемника каждая запись обрабатывается и записывается изолированно через РегистрСведенийМенеджерЗаписи.
  2. Формирование набора по ведущему измерению. Если независимый регистр логически сгруппирован по определенному объекту (например, Номенклатура), набор формируется с отбором именно по этому измерению. При загрузке в приемнике будут перезаписаны только данные конкретной номенклатуры, не затрагивая остальные позиции.
← На главную