При настройке обмена данными через конфигурацию «1С:Конвертация данных 2.1» (КД 2) разработчики часто сталкиваются с трудностями при переносе специализированных документов ручной корректировки, таких как Корректировка записей регистров или ОперацияБух. Документ успешно переносится в базу-приемник, однако движения по регистрам накопления либо не переносятся вовсе, либо вызывают ошибки при обновлении правил обмена.
Разберем причины такого поведения платформы и детально рассмотрим правильный алгоритм настройки правил конвертации без использования громоздкого программного кода выгрузки каждого набора записей вручную.
Чтобы понять, почему стандартная схема переноса дает сбой, проанализируем внутреннее устройство документа и особенности работы подсистемы обмена:
КонвертацияОбъектовИнформационныхБаз ищет эти имена в коллекции Метаданные.Документы[Имя].ТабличныеЧасти. Поскольку в конфигурации это движения, а не реальные табличные части, возникает ошибка: «Неправильно указана табличная часть... Табличная часть не существует».РежимЗаписиДокумента.Запись. Для того чтобы движения зафиксировались в базе-приемнике, у каждого набора записей должен быть явно выставлен признак Записывать = Истина.ТаблицаРегистровНакопления. Если движения загружены в базу, но в этой табличной части нет строки с именем регистра, форма документа при открытии пользователем будет казаться пустой.Разберем по шагам, как правильно настроить перенос в «Конвертации данных 2.1»:
MD82Exp.epf (или аналогичной для вашей версии платформы) обязательно взводим флаг «Выгружать движения документов». Это позволит конфигурации конвертации увидеть наборы записей как подчиненные структуры документа.КорректировкаЗаписейРегистров. Во вкладке «Табличные части» находим соответствующий регистр накопления (он будет отображаться в списке доступных табличных частей) и создаем правило конвертации группы свойств (ПКГС) для нужного регистра.ПослеЗагрузки и добавляем программный код, который взводит признак записи набора и заполняет служебную табличную часть:
// Взводим флаг записи набора движений
Объект.Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
// Заполняем служебную таблицу состава регистров для отображения в форме
ИмяРегистра = "ВзаиморасчетыСКонтрагентами";
Если Объект.ТаблицаРегистровНакопления.Найти(ИмяРегистра, "Имя") = Неопределено Тогда
СтрокаРегистра = Объект.ТаблицаРегистровНакопления.Добавить();
СтрокаРегистра.Имя = ИмяРегистра;
КонецЕсли;
Если обмен выполняется в постоянном автоматическом режиме через планы обмена с использованием регистра сведений ПравилаДляОбменаДанными, типовая процедура проверки правил выдаст ошибку отсутствия табличной части. Выясним причину: модуль обработки КонвертацияОбъектовИнформационныхБаз строго проверяет наличие табличной части в объекте метаданных.
Для корректной работы необходимо внести небольшую доработку в модуль обработки КонвертацияОбъектовИнформационныхБаз в месте проверки структуры табличных частей. Заменим жесткую проверку на проверку наличия регистра в коллекции движений документа:
// Пример корректировки проверки метаданных:
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если ОбъектМетаданных <> Неопределено Тогда
Если ОбъектМетаданных.ТабличныеЧасти.Найти(ИмяТабличнойЧасти) = Неопределено Тогда
// Проверяем, не является ли "табличная часть" виртуальным набором движений
Если ОбъектМетаданных.Движения.Найти(ИмяТабличнойЧасти) = Неопределено Тогда
// Вызываем ошибку только если объекта нет ни в ТЧ, ни в движениях
ЗаписьЖурналаРегистрации(...);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если вносить изменения в типовую конфигурацию или обработку обмена нельзя, применим альтернативный подход с передачей движений через произвольную структуру данных:
ПриВыгрузке считываем набор записей регистра в таблицу значений и помещаем ее в параметры объекта:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ *
|ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами
|ГДЕ Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
Выгрузка = Запрос.Выполнить().Выгрузить();
ПараметрыОбъекта.Вставить("ТаблицаДвижений", Выгрузка);
ПослеЗагрузки считываем таблицу из параметров и напрямую перезаписываем набор записей регистратора:
ТаблицаДвижений = ПараметрыОбъекта.ТаблицаДвижений;
Если ТаблицаДвижений <> Неопределено И ТаблицаДвижений.Количество() > 0 Тогда
Набор = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Объект.Ссылка);
Для Каждого Стр Из ТаблицаДвижений Цикл
Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Стр);
Запись.Период = Объект.Дата;
Запись.Регистратор = Объект.Ссылка;
КонецЦикла;
Набор.Записать(Истина);
// Также не забываем заполнить ТаблицаРегистровНакопления
Если Объект.ТаблицаРегистровНакопления.Найти("ВзаиморасчетыСКонтрагентами", "Имя") = Неопределено Тогда
СтрТЧ = Объект.ТаблицаРегистровНакопления.Добавить();
СтрТЧ.Имя = "ВзаиморасчетыСКонтрагентами";
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЕсли;
Рассмотренные подходы позволяют гарантированно передавать любые движения документов ручной корректировки без потери данных и ошибок целостности метаданных.