Как перенести срез последних регистра сведений в документ «Корректировка записей регистров» при обмене данными?

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

Перенос данных между конфигурациями, особенно когда речь идет о регистрах сведений с периодичностью «Срез последних», часто вызывает сложности при использовании стандартных инструментов Конвертация данных 2.1. В данной статье мы разберем, как правильно перенести записи регистра ЦеныНоменклатурыКонтрагентов в документ Корректировка записей регистров, избежав при этом типичных ошибок перезаписи данных.

Постановка задачи и анализ проблемы

При использовании стандартного обмена через Универсальный обмен данными в формате XML, если мы просто выгружаем записи регистра, система воспринимает каждую запись как независимую. В случае с регистрами, подчиненными регистратору, попытка записи приводит к тому, что документ-регистратор перезаписывается, и в итоге в базе-приемнике остается только последняя перенесенная запись. Чтобы этого избежать, нам необходимо собрать все записи в один набор и записать их «пакетно» внутри одного документа.

Шаг 1: Подготовка данных в ПВД (Правила выгрузки данных)

Для начала нам нужно получить срез последних на определенную дату и подготовить его для передачи в правила конвертации. Мы будем использовать Запрос к виртуальной таблице СрезПоследних. Сформированную выборку необходимо поместить в Таблицу значений, которую мы передадим в параметр ВыборкаДанных.

Рассмотрим код для ПВД:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.Период КАК Период,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.Регистратор,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.НомерСтроки,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.Активность,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦен,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.ЕдиницаИзмерения,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
|	ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&ДатаСреза, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
|	Период,
|	Номенклатура,
|	ХарактеристикаНоменклатуры,
|	ТипЦен";

Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ТекущаяДата()));
тзРС = Новый ТаблицаЗначений;
тзРС.Колонки.Добавить("ЦеныНоменклатурыКонтрагентов");
НоваяСтрока = тзРС.Добавить();
тзРСВыборка = Запрос.Выполнить().Выгрузить();
НоваяСтрока.ЦеныНоменклатурыКонтрагентов = тзРСВыборка;
ВыборкаДанных = тзРС;

Шаг 2: Настройка конвертации и обработка «ПослеЗагрузки»

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

Добавьте следующий код в обработчик ПослеЗагрузки вашего ПКО:


НовСтр = Объект.ТаблицаРегистровСведений.Добавить();
НовСтр.Имя = "ЦеныНоменклатурыКонтрагентов";
НовСтр.Представление = "Цены номенклатуры контрагентов";

Почему этот метод эффективен?

Использование Корректировки записей регистров вместо попытки прямого переноса в Регистр сведений дает несколько преимуществ:

  1. Целостность данных: Вы записываете все изменения одним транзакционным блоком.
  2. Учетная политика: Документ остается в системе, что позволяет видеть, кто и когда перенес цены, и обеспечивает прозрачность аудита.
  3. Управляемость: Вы можете гибко настраивать отбор по Регистратору, что критично для работы с подчиненными регистрами, где Набор записей требует обязательного наличия ссылки на документ.

Важные советы при реализации

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

Следуя этим шагам, вы сможете организовать надежный обмен данными без потери информации и необходимости ручной доработки каждой записи в новой базе.

← На главную