gifts2017

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

Опубликовал Осипов Сергей (fixin) в раздел Обработки - Обработка справочников

Мастер-класс по обучению простому способу выгрузки-загрузки данных справочника через таблицу значений, экспортированную в XTDO.

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

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

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

       

МД = Метаданные.НайтиПоТипу(ТипЗнч(Зн));
       Если МД <> Неопределено Тогда
             Если Метаданные.Справочники.Содержит(МД)  Тогда
                    Результат = Новый Структура();
                    Результат.Вставить("Тип", "Справочник");
                    Результат.Вставить("Вид", МД.Имя);
                    Результат.Вставить("Наименование", Зн.Наименование);
                    Результат.Вставить("Код", Зн.Код);
             ИначеЕсли Метаданные.Документы.Содержит(МД) Тогда
                    Результат = Новый Структура();
                    Результат.Вставить("Тип", "Документ");
                    Результат.Вставить("Вид", МД.Имя);
                    Результат.Вставить("Дата", Зн.Дата);
                    Результат.Вставить("Номер", Зн.Номер);
                    Результат.Вставить("Проведен", Зн.Проведен);
             ИначеЕсли Метаданные.Перечисления.Содержит(МД) Тогда
                    Результат = Новый Структура();
                    Результат.Вставить("Тип", "Перечисления");
                    Результат.Вставить("Вид", МД.Имя);
                    Если Зн.Пустая() Тогда
                           Результат.Вставить("Значение", Неопределено);
                    Иначе
                           Результат.Вставить("Значение", МД.ЗначенияПеречисления.Получить(Перечисления[МД.Имя].Индекс(Зн)).Имя);
                                        КонецЕсли;
                                  КонецЕсли;
                           КонецЕсли;
Сам справочник я выгружаю запросом, куда могу передавать и дополнительные поля:
       З = Новый Запрос(
       "ВЫБРАТЬ Владелец.КОД КАК Владелец_Код, Владелец.Наименование КАК Владелец_Наименование, * ИЗ Справочник.ПравилоОбмена");
       ТЗ = З.Выполнить().Выгрузить();

 

 

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

       

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

 

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

Функция ОбъектИзXMLЧерезXDTO(ИмяФайла, Тип=Неопределено) Экспорт
       Перем ЧтениеXML;
       ЧтениеXML = Новый ЧтениеXML;
       ЧтениеXML.ОткрытьФайл(ИмяФайла);
       Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип);
КонецФункции

 

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Файл с примером обработки
.zip 4,46Kb
28.12.15
7
.zip 4,46Kb 7 Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. VVV (V_V_V) 28.12.15 10:36
СериализаторXDTO.ПрочитатьXML в статье есть. А где СериализаторXDTO.ЗаписатьXML ?
2. Осипов Сергей (fixin) 28.12.15 10:55
(1) Да, хороший вопрос. ;-) Забыл.

Функция ОбъектИзXMLЧерезXDTO(ИмяФайла, Тип=Неопределено) Экспорт
//Назначение: Сериализация из XML через XDTO  (для объектом компоновки)
//ДатаСоздания: 20080328
//Автор: Лейбович Максим 1С
//Тестирована: Да
//Автор: Гений1С
	Перем ЧтениеXML;
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ИмяФайла);
	Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип);
КонецФункции

...Показать Скрыть
3. Сергей Ярцев (SerLeon) 28.12.15 11:41
(2) Такое ощущение, что тебя заморозили лет на 5-7 и недавно разморозили. Гений, что это за публикации? детский сад какой-то
4. Осипов Сергей (fixin) 28.12.15 12:07
(3) хз, я реально этот ХДТО обмен юзал недавно, лень было с КД возиться.
Кстати, у меня еще полно обработок, написанных за 4 года в Максимусе, некогда оформить. там четко.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа