Почему при переносе через Конвертацию данных не записываются движения регистра накопления у документов и как это исправить?

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

При обновлении доработанных конфигураций (например, 1С:Управление торговлей 11) или исправлении ошибок в метаданных часто возникает ситуация: документы уже присутствуют в целевой базе, но по определенному регистру накопления движения были затерты или не сформировались. Попытка перенести движения из резервной или старой копии базы с помощью конфигурации «Конвертация данных 2.1» (КД 2) стандартным правилом для документа нередко приводит к тому, что обработка рапортует об успешной загрузке объектов, но в самой базе движения появляются лишь у единичных документов или отсутствуют вовсе.

Проанализируем технические причины такого поведения платформы 1С:Предприятие 8 и разберем проверенные способы восстановления движений.

Причины, по которым движения не сохраняются при загрузке документа

  1. Отсутствие флага явной записи набора движений. Когда при загрузке через ПКО документа заполняется коллекция Объект.Движения, платформа не сохраняет эти наборы в базу автоматически при обычном вызове Объект.Записать() в режиме РежимЗаписиДокумента.Запись. Для сохранения требуется явно взвести свойство Записывать = Истина у конкретного набора записей.
  2. Специфика типовых подписок на события в УТ 11. В конфигурациях на базе БСП и УТ 11 действуют встроенные механизмы версионирования и проведения. Обработчики событий ПередЗаписью и ПриЗаписи могут принудительно сбрасывать флаги записи движений или очищать наборы, если документ не перепроводится.
  3. Перепроведение как нежелательный фактор. Просто перепровести документы в обновленной базе часто нельзя: изменившаяся логика модулей проведения может исказить исторические данные или изменить движения по другим регистрам.

Способ 1. Корректировка обработчиков в «Конвертации данных»

Если перенос выполняется через ПКО документа, разберем по шагам, как заставить платформу зафиксировать набор записей при загрузке.

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

Объект.Движения.ИмяРегистраНакопления.Записывать = Истина;

Также при настройке правил конвертации свойств (ПКС) для набора записей убедимся, что отключены параметры очистки или пропуска пустых коллекций.

Способ 2. Выгрузка движений отдельным правилом (ПКО для набора записей)

Чтобы избежать влияния логики проведения документа, надежнее переносить не документ целиком, а непосредственно сам регистр накопления.

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

При таком подходе платформа выполняет прямую запись в таблицу регистра через НаборЗаписей.Записать() с отбором по регистратору, не вызывая логику модулей проведения документа.

Способ 3. Прямой перенос через внешнюю обработку (Таблица значений / ЗначениеВФайл)

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

В исходной базе создадим и выполним обработку, которая выгрузит наборы записей по нужным регистраторам в таблицу значений:


ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ДокументСсылка");
ТЗ.Колонки.Добавить("Движения");

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Регистр.Регистратор КАК Регистратор
    |ИЗ
    |	РегистрНакопления.ИмяРегистра КАК Регистр";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ДокОбъект = Выборка.Регистратор.ПолучитьОбъект();
    Если ДокОбъект = Неопределено Тогда
        Продолжить;
    КонецЕсли;
    
    Набор = ДокОбъект.Движения.ИмяРегистра;
    Набор.Прочитать();
    
    СтрокаТЗ = ТЗ.Добавить();
    СтрокаТЗ.ДокументСсылка = Выборка.Регистратор;
    СтрокаТЗ.Движения = Набор.Выгрузить();
КонецЦикла;

ЗначениеВФайл("C:\MovementsData.dat", ТЗ);

Затем в целевой базе прочитаем сохраненный файл и загрузим движения напрямую в наборы записей целевых документов:


ТЗ = ЗначениеИзФайла("C:\MovementsData.dat");

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

Способ 4. Использование типовой обработки «Выгрузка и загрузка данных XML»

Если базы имеют идентичные метаданные по данному регистру, а ключевые объекты (документы, справочники) переносились с сохранением Уникального Идентификатора (GUID), воспользуемся стандартной обработкой ВыгрузкаЗагрузкаДанныхXML.epf:

  1. В исходной базе откроем обработку и выберем для выгрузки только конкретный регистр накопления.
  2. Установим отбор по нужным периодам или документам-регистраторам.
  3. Выполним загрузку файла XML в целевую базу. Движения запишутся напрямую в регистр, сопоставившись по существующим ссылкам регистраторов.
← На главную