Простая выгрузка справочника через XDTO

Мастер-класс по выгрузке справочника через XDTO между различными конфигурациями.

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

 

Чтобы передать такой справочник в другую конфигурацию, можно использовать выгрузку через XDTO в XML. Но есть один нюанс - конфигурации различные, некоторых справочников исходной конфигурации может не быть в конечной.

 

Поэтому перед преобразованием в XML нужно заменить ссылки на структуры, код:

       МД = Метаданные.НайтиПоТипу(ТипЗнч(Зн));

       Если МД <> Неопределено Тогда

             Если Метаданные.Справочники.Содержит(МД)  Тогда

                    Результат = Новый Структура();

                    Результат.Вставить("Тип", "Справочник");

                    Результат.Вставить("Вид", МД.Имя);

                    Результат.Вставить("Наименование", Зн.Наименование);

                    Результат.Вставить("Код", Зн.Код);

             ИначеЕсли Метаданные.Документы.Содержит(МД) Тогда

                    Результат = Новый Структура();

                    Результат.Вставить("Тип", "Документ");

                    Результат.Вставить("Вид", МД.Имя);

                    Результат.Вставить("Дата", Зн.Дата);

                    Результат.Вставить("Номер", Зн.Номер);

                    Результат.Вставить("Проведен", Зн.Проведен);

             ИначеЕсли Метаданные.Перечисления.Содержит(МД) Тогда

                    Результат = Новый Структура();

                    Результат.Вставить("Тип", "Перечисления");

                    Результат.Вставить("Вид", МД.Имя);

                    Если Зн.Пустая() Тогда

                           Результат.Вставить("Значение", Неопределено);

                    Иначе

                           Результат.Вставить("Значение", МД.ЗначенияПеречисления.Получить(Перечисления[МД.Имя].Индекс(Зн)).Имя);

                                        КонецЕсли;

                                  КонецЕсли;

                           КонецЕсли;

Сам справочник я выгружаю запросом, куда могу передавать и дополнительные поля:

       З = Новый Запрос(

       "ВЫБРАТЬ Владелец.КОД КАК Владелец_Код, Владелец.Наименование КАК Владелец_Наименование, * ИЗ Справочник.ПравилоОбмена");

       ТЗ = З.Выполнить().Выгрузить();

 

Результат запроса я выгружаю в таблицу значений, однако её нужно преобразовать в нетипизированную таблицу значений, иначе в описании типов будут типы, которых нет в базе-получателе:

       ТЗ = Новый ТаблицаЗначений();

       Для Кол = 1 По _ТЗ.Колонки.Количество() Цикл

             ТЗ.Колонки.Добавить(_ТЗ.Колонки[Кол-1].Имя); //Очищаем тип таблицы значений

       КонецЦикла;

 

На стороне получателя данные можно получить из XML-файла процедурой вида:

Функция ОбъектИзXMLЧерезXDTO(ИмяФайла, Тип=Неопределено) Экспорт

       Перем ЧтениеXML;

       ЧтениеXML = Новый ЧтениеXML;

       ЧтениеXML.ОткрытьФайл(ИмяФайла);

       Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип);

КонецФункции

 

Данные получаются в виде таблицы значений, что очень удобно для обработки - не нужно конвертировать типы, можно работать с привычной коллекцией значений.

 

Скачать