Инструмент для выгрузки своих фабрик XDTO во внешний файл для использования своих схем во внешних обработках



Инструмент для выгрузки своих пакетов XDTO в единый xml файл, на основании которого можно создать фабрику XDTO, благодаря чему можно встроить свои форматы обмена во внешнюю обработку, не трогая конфигурацию.
В обработке есть пример записи и считывания xml файла с помощью такой внешней фабрики, а также инструмент для выгрузки из такой фабрики набор xsd схем, для последующей загрузки обратно в конфигурацию в XDTO пакет, на случай если вы потеряли конфигурацию, где делали XDTO пакет, как потерял её я.
В общем, если не хотите портить конфигурацию лишними объектами и ещё не сделали такой инструмент для себя — качайте, не стесняйтесь.

Во-первых выражаю глубокое почтение автору трилогии XDTO это просто, в третьей части которого этот метод изложен. Так же использовался материал с http://catalog.mista.ru/public/77526/, о выгрузке xsd схемы из фабрики XDTO. Я всего лишь собрал всё это в одну обработку и дополнил примером. Постоянно забываю механизмы, которыми давно не пользовался, сделал себе чекпоинт, а вам скромный инструмент.

Итак, мы хотим с кем-нибудь обменяться новеньким xml форматом, который ещё нигде не описан. Создаёте в копии базы XDTO пакет, наполняете его либо XSD файлом (общепринятый формат описания файлов xml), который может вам предоставить добросовестный товарищ по другую сторону обмена или сформировать в сторонней программе как предлагает сделать автор цикла XDTO это просто, или собрать схему в 1С руками, как это обычно делаю я. С описанием как правильно заполнять руками через 1С в интернете туго, кое-как разобрался под свои нужды.

Итого у вас есть объект конфигурации пакет XDTO (мы сделали его в копии базы), он заполнен и вы можете к нему обращаться через менеджер всех фабрик кофигурации ФабрикаXDTO.
Запускаем внешнюю обработку и жмём кнопку "Выгрузить фабрику из конфигурации в файл", выбираем свой XDTO пакет из списка или перечень пакетов, если они зависимы (типы одного использует другой), и получаете файл фабрики.
Файл фабрики можно вставить как текстовый макет во внешнюю обработку и использовать его вот так:

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(РеквизитФормыВЗначение("Объект").ПолучитьМакет("Модель").ПолучитьТекст());
ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);
ЧтениеXML.Закрыть();

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

Проверена на платформе 8.3.10.2580

8 Comments

  1. MOPC

    Добрый день

    Как все таки вовремя!

    Спасибо.

    Reply
  2. MaxS

    Добрый день!

    Столкнулся с проблемой на платформе 8.1, поиски привели к этой публикации. Спасибо за инструмент, плюсую. 😉

    Часть вопросов снялась, но осталась главная проблема.

    Такой код только на платформе 8.1 генерирует ошибку

    ЗначениеСвойства = Новый Структура(«тест»,»тест»);
    ЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);
    
    МойСериализаторXDTO = Новый СериализаторXDTO(МояФабрикаXDTO);
    ЗначениеXDTO = МойСериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);
    

    Текст ошибки:

    Ошибка при вызове метода контекста (ЗаписатьXDTO): Ошибка отображения типов:

    Отсутствует отображение для типа ‘Структура’

    ЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);

    Или: ЗначениеXDTO = МойСериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);

    Если из МояФабрикаXDTO убрать xsd схему «http://v8.1c.ru/8.1/data/core», то ошибка появляется на любой платформе. Поэтому я и воспользовался вашей обработкой, чтобы раздобыть «http://v8.1c.ru/8.1/data/core» и добавить в МояФабрикаXDTO, но не помогло.

    Куда копать, что делать? 😉

    Reply
  3. mvxyz

    Спасибо автору.

    Reply
  4. onec.developer

    А как на счет сравнения фабрик?

    Reply
  5. ЕСТЬNULL

    Спасибо за тёплые слова! Рад что оказался полезен.

    (2) Это конечно страшный для меня вопрос, так как я в нём в целом — дилетант.

    Я так понял вы обращаете структуру в ЗначениеXDTO сначала встроенной фабрикой — ошибка не выдаётся, а потом выгруженной и ошибка проявляется. Если это так, то значит фабрики отличаются. Они как бы и должны отличаться, никто не спорит, но можно сначала выгрузить в свою фабрику всё из встроенной в качестве эксперимента. Если чудо произойдет, значит вашей фабрике не хватает какой-то схемы, и вы сможете найти её например методом исключения. А вот если нет, то не знаю даже.

    (5) Вы мне скинули ссылку в личку, но там » Ошибка! Публикация неактивна или находится на модерации.». Сравнить — вывести разницу в составе схем? Можно. Только надо найти для этого время, с этим очень туго. Может ещё надо добавить возможность дополнения, или даже редактирования такой схемы. В принципе то ничего сложного нет, только сделать красиво. И кстати недавно нашёл статью по то, как выгружать xml в файл на клиенте, не используя выгрузку во временный файл. Выгрузка производится напрямую в двоичные данные, это работает. Кто не в курсе — берите на вооружение! https://infostart.ru/public/672498/

    В общем я вас понял, сделаю как будет время. А с вас рабочая ссылка на https://infostart.ru/public/727205/

    Спасибо за критику!

    Reply
  6. MaxS

    (6) Вопрос уже решился. Скину кратко результаты, вдруг кому пригодится. 😉

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

    ТипСтруктура = МояФабрикаXDTO.Тип(«http://v8.1c.ru/8.2/data/core»;, «Structure»);

    СтруктураXDTO = МояФабрикаXDTO.Создать(ТипСтруктура);

    и потом рекурсивной функцией заполняем ОбъектXDTO данными структуры.

    После записи xml файла открываем его как текстовый и меняем «http://v8.1c.ru/8.2/data/core» на «http://v8.1c.ru/8.1/data/core».

    Reply
  7. ЕСТЬNULL

    (5) Вы мне скинули ссылку в личку, но там » Ошибка! Публикация неактивна или находится на модерации.». Сравнить — вывести разницу в составе схем? Можно. Только надо найти для этого время, с этим очень туго. Может ещё надо добавить возможность дополнения, или даже редактирования такой схемы. В принципе то ничего сложного нет, только сделать красиво. И кстати недавно нашёл статью по то, как выгружать xml в файл на клиенте, не используя выгрузку во временный файл. Выгрузка производится напрямую в двоичные данные, это работает. Кто не в курсе — берите на вооружение! https://infostart.ru/public/672498/

    В общем я вас понял, сделаю как будет время. А с вас рабочая ссылка на https://infostart.ru/public/727205/

    Спасибо за критику!

    Reply
  8. user596590_pavel.kuznecov

    Вставлю свои пять копеек про то как читать набор схем из внешнего файла и создавать на этой основе свою фабрику:

    Чтение=Новый ЧтениеXML;
    Чтение.ОткрытьФайл(«ПутьДоМоегоФайлаМойФайл.xsd»);
    
    НовыйПостроительДом=Новый ПостроительDOM;
    НовыйДокументДом=НовыйПостроительДом.Прочитать(Чтение);
    
    НовыйПостроительСхем=Новый ПостроительСхемXML;
    НоваяСхема=НовыйПостроительСхем.СоздатьСхемуXML(НовыйДокументДом);
    
    НаборСхем=Новый НаборСхемXML;
    НаборСхем.Добавить(НоваяСхема);
    НоваяФабрика=Новый ФабрикаXDTO(НаборСхем);

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *