Перенос данных между конфигурациями, особенно когда речь идет о регистрах сведений с периодичностью «Срез последних», часто вызывает сложности при использовании стандартных инструментов Конвертация данных 2.1. В данной статье мы разберем, как правильно перенести записи регистра ЦеныНоменклатурыКонтрагентов в документ Корректировка записей регистров, избежав при этом типичных ошибок перезаписи данных.
При использовании стандартного обмена через Универсальный обмен данными в формате XML, если мы просто выгружаем записи регистра, система воспринимает каждую запись как независимую. В случае с регистрами, подчиненными регистратору, попытка записи приводит к тому, что документ-регистратор перезаписывается, и в итоге в базе-приемнике остается только последняя перенесенная запись. Чтобы этого избежать, нам необходимо собрать все записи в один набор и записать их «пакетно» внутри одного документа.
Для начала нам нужно получить срез последних на определенную дату и подготовить его для передачи в правила конвертации. Мы будем использовать Запрос к виртуальной таблице СрезПоследних. Сформированную выборку необходимо поместить в Таблицу значений, которую мы передадим в параметр ВыборкаДанных.
Рассмотрим код для ПВД:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Период КАК Период,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Регистратор,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.НомерСтроки,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Активность,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦен,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ЕдиницаИзмерения,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&ДатаСреза, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| Период,
| Номенклатура,
| ХарактеристикаНоменклатуры,
| ТипЦен";
Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ТекущаяДата()));
тзРС = Новый ТаблицаЗначений;
тзРС.Колонки.Добавить("ЦеныНоменклатурыКонтрагентов");
НоваяСтрока = тзРС.Добавить();
тзРСВыборка = Запрос.Выполнить().Выгрузить();
НоваяСтрока.ЦеныНоменклатурыКонтрагентов = тзРСВыборка;
ВыборкаДанных = тзРС;
Основная хитрость заключается в том, чтобы не позволить Конвертации данных загружать каждую строку как отдельный объект, который будет пытаться записать Регистратор. Мы создаем ПКО (Правило Конвертации Объекта) для документа Корректировка записей регистров. В обработчике ПослеЗагрузки необходимо инициализировать таблицу регистров, чтобы при открытии документа данные корректно отображались.
Добавьте следующий код в обработчик ПослеЗагрузки вашего ПКО:
НовСтр = Объект.ТаблицаРегистровСведений.Добавить();
НовСтр.Имя = "ЦеныНоменклатурыКонтрагентов";
НовСтр.Представление = "Цены номенклатуры контрагентов";
Использование Корректировки записей регистров вместо попытки прямого переноса в Регистр сведений дает несколько преимуществ:
Регистратору, что критично для работы с подчиненными регистрами, где Набор записей требует обязательного наличия ссылки на документ.При переносе данных всегда обращайте внимание на соответствие типов данных. Если в конфигурациях есть различия в структуре регистра (например, разные наборы измерений), метод НаборЗаписей.Загрузить(ТабДвиж) вызовет ошибку. Также убедитесь, что справочники Номенклатура, Контрагенты и ТипыЦен переносятся до того, как начнется загрузка движений, иначе система не найдет ссылки на соответствующие объекты в базе-приемнике.
Следуя этим шагам, вы сможете организовать надежный обмен данными без потери информации и необходимости ручной доработки каждой записи в новой базе.