Мастер-класс по выгрузке справочника через XDTO между различными конфигурациями.
Возникла задача перенести справочник из одной конфигурации в другую. Можно было бы воспользоваться КД, но справочник был достаточно простой, но с некоторым количеством табличных частей.
Чтобы передать такой справочник в другую конфигурацию, можно использовать выгрузку через XDTO в XML. Но есть один нюанс - конфигурации различные, некоторых справочников исходной конфигурации может не быть в конечной.
Поэтому перед преобразованием в XML нужно заменить ссылки на структуры, код:
МД = Метаданные.НайтиПоТипу(ТипЗнч(Зн));
Если МД <> Неопределено Тогда
Если Метаданные.Справочники.Содержит(МД) Тогда
Результат = Новый Структура();
Результат.Вставить("Тип", "Справочник");
Результат.Вставить("Вид", МД.Имя);
Результат.Вставить("Наименование", Зн.Наименование);
Результат.Вставить("Код", Зн.Код);
ИначеЕсли Метаданные.Документы.Содержит(МД) Тогда
Результат = Новый Структура();
Результат.Вставить("Тип", "Документ");
Результат.Вставить("Вид", МД.Имя);
Результат.Вставить("Дата", Зн.Дата);
Результат.Вставить("Номер", Зн.Номер);
Результат.Вставить("Проведен", Зн.Проведен);
ИначеЕсли Метаданные.Перечисления.Содержит(МД) Тогда
Результат = Новый Структура();
Результат.Вставить("Тип", "Перечисления");
Результат.Вставить("Вид", МД.Имя);
Если Зн.Пустая() Тогда
Результат.Вставить("Значение", Неопределено);
Иначе
Результат.Вставить("Значение", МД.ЗначенияПеречисления.Получить(Перечисления[МД.Имя].Индекс(Зн)).Имя);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Сам справочник я выгружаю запросом, куда могу передавать и дополнительные поля:
З = Новый Запрос(
"ВЫБРАТЬ Владелец.КОД КАК Владелец_Код, Владелец.Наименование КАК Владелец_Наименование, * ИЗ Справочник.ПравилоОбмена");
ТЗ = З.Выполнить().Выгрузить();
Результат запроса я выгружаю в таблицу значений, однако её нужно преобразовать в нетипизированную таблицу значений, иначе в описании типов будут типы, которых нет в базе-получателе:
ТЗ = Новый ТаблицаЗначений();
Для Кол = 1 По _ТЗ.Колонки.Количество() Цикл
ТЗ.Колонки.Добавить(_ТЗ.Колонки[Кол-1].Имя); //Очищаем тип таблицы значений
КонецЦикла;
На стороне получателя данные можно получить из XML-файла процедурой вида:
Функция ОбъектИзXMLЧерезXDTO(ИмяФайла, Тип=Неопределено) Экспорт
Перем ЧтениеXML;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип);
КонецФункции
Данные получаются в виде таблицы значений, что очень удобно для обработки - не нужно конвертировать типы, можно работать с привычной коллекцией значений.