[РЕШЕНО] Замена правил обмена в файле выгрузки

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем Роман_Н, 25 авг 2016.

  1. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Всем доброе!
    Есть файл выгрузки xml по правилам обмена. Соответственно, в нем есть блок
    Код:
    <ПравилаОбмена>
    ...
    </ПравилаОбмена>
    И есть второй файл, как бы шаблон этого блока.
    Необходимо заменить блок правил в файле выгрузки на блок из файла шаблона.
    Придется по-элементно читать ЧтениеXML и писать в третий временный файл через ЗаписьXML? Или есть более удобный способ?

    P.S. Предчувствую резонный вопрос "Зачем?" Необходимо защититься от изменений правил в Источнике, т.е. всегда загружать по эталону из Приемника.
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.574
    Симпатии:
    717
    Баллы:
    204
    Да, необходимо читать из файла1 и Файл2, записывать в файл3.
  3. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Попробовал вот так
    Код:
    ДокументDOMФайлВыгрузкиXML.ИмпортироватьУзел(ДокументDOMШаблонПравил.ПолучитьЭлементыПоИмени("ПравилаОбмена")[0],Истина);
    Когда в отладчике смотришь окументDOMФайлВыгрузкиXML.ИмпортироватьУзел(ДокументDOMШаблонПравил.ПолучитьЭлементыПоИмени("ПравилаОбмена")[0] - в нем именно нужный замененный элемент. Но при ЗаписьDom ничего не меняется!?
    Последнее редактирование: 25 авг 2016
  4. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Написал. Есть некоторые сомнения в оптимальности. Запись во временный xml через ЗаписьXML, а потом ЧтениеТекста, чтобы запхнуть все это в файл который был первоначально передан.
    С методологической точки грубых ошибок нет?
    Код:
    // Процедура заменяет блок <ПравилаОбмена>...</ПравилаОбмена> в переданном файле .xml
    // на блок из шаблона, в котором хранится фрагмент файла выгрузки по эталонным правилам.
    //
    // Параметры
    //   ИмяФайлаXML  - Тип: Строка - Полное имя файла с данными выгрузки,
    //                     в  котором будем менять блок <ПравилаОбмена>
    //
    // Возвращаемое значение:
    //   ИмяФайлаРезультатаXML   - Тип: Строка - Путь
    //
    Процедура ЗаменитьПравилаОбменаВФайлеВыгрузкиWS(ИмяФайлаXML)
    
        ФайлВыгрузкиXML = Новый ЧтениеXML;
        ФайлВыгрузкиXML.ОткрытьФайл(ИмяФайлаXML);
       
        ШаблонПравил = Новый ЧтениеXML;
        ПутьКШаблонуПравил = ПолучитьШаблонПравилОбмена();
        ШаблонПравил.ОткрытьФайл(ПутьКШаблонуПравил);
       
        ИмяФайлаРезультатаXML = ПолучитьИмяВременногоФайла(".xml");
        РезультатXML = Новый ЗаписьXML;
        РезультатXML.ОткрытьФайл(ИмяФайлаРезультатаXML);
       
        Пока ФайлВыгрузкиXML.Прочитать() Цикл
           
            ТипУзла = ФайлВыгрузкиXML.ТипУзла;
           
            Если ТипУзла = ТипУзлаXML.НачалоЭлемента и ФайлВыгрузкиXML.Имя = "ПравилаОбмена" Тогда
                ФайлВыгрузкиXML.Пропустить();
               
                Пока ШаблонПравил.Прочитать() Цикл
                   
                    Если ШаблонПравил.ТипУзла = ТипУзлаXML.НачалоЭлемента и ШаблонПравил.Имя = "ПравилаОбмена" Тогда
                        РезультатXML.ЗаписатьТекущий(ШаблонПравил);
                        Пока ШаблонПравил.Прочитать() Цикл
                            РезультатXML.ЗаписатьТекущий(ШаблонПравил);
                            Если ШаблонПравил.ТипУзла = ТипУзлаXML.КонецЭлемента и ШаблонПравил.Имя = "ПравилаОбмена" Тогда
                                Прервать;
                            КонецЕсли;
                        КонецЦикла;
                        Прервать;
                    КонецЕсли;   
                КонецЦикла;
               
            Иначе   
                РезультатXML.ЗаписатьТекущий(ФайлВыгрузкиXML);
            КонецЕсли;
           
        КонецЦикла;
       
        ФайлВыгрузкиXML.Закрыть();
        ШаблонПравил.Закрыть();
        РезультатXML.Закрыть();
       
        Текст = Новый ЧтениеТекста(ИмяФайлаРезультатаXML);
        СообщениеОбмена = Текст.Прочитать();
        ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаXML, КодировкаТекста.UTF8);
        ЗаписьТекста.Записать(СообщениеОбмена);
        ЗаписьТекста.Закрыть();
       
    КонецПроцедуры // ЗаменитьПравилаОбмена()

Поделиться этой страницей