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