Имя: Пароль:
1C
1С v8
КД Ошибка формата файла обмена при загрузке данных 8.3 ОП -> 8.3 УФ
,
0 790th
 
30.09.15
09:40
Вопрос: Почему не принимает данные, сформированные в настройке обмена (но при этом принимает если данные сформировать обработкой обмена)?
Создал правила выгрузки одного элементарного справочника из УТ 10.3.16.1 (обычное приложение, платформа 8.2.19.102) в Самописную (управляемое приложение, платформа 8.3.6.2152)
Настроил в УТ узлы и планы обмена, сделал настройку обмена данными и выгрузил. В файл данных вошло два элемента справочника.
Привожу содержание "ошибочного" XML:
<?xml version="1.0" encoding="UTF-8"?>
<ФайлОбмена ВерсияФормата="2.0" ДатаВыгрузки="2015-09-30T09:03:50" ИмяКонфигурацииИсточника="УправлениеТорговлей" ИмяКонфигурацииПриемника="Конфигурация" ИдПравилКонвертации="fc7e8361-6fbe-42bb-90d4-6ee69b6c1794" Комментарий="">
<ПравилаОбмена>
    <ВерсияФормата>2.01</ВерсияФормата>
    <Ид>fc7e8361-6fbe-42bb-90d4-6ee69b6c1794</Ид>
    <Наименование>СервисДляCRM --&gt; CRM</Наименование>
    <ДатаВремяСоздания>2015-09-28T12:18:38</ДатаВремяСоздания>
    <Источник>УправлениеТорговлей</Источник>
    <Приемник>Конфигурация</Приемник>
    <Параметры/>
    <Обработки/>
    <ПравилаКонвертацииОбъектов>
        <Правило>
            <Код>Направления</Код>
            <Источник>СправочникСсылка.Айсберг_Направления</Источник>
            <Приемник>СправочникСсылка.Направления</Приемник>
        </Правило>
    </ПравилаКонвертацииОбъектов>
    <ПравилаОчисткиДанных/>
    <Алгоритмы/>
    <Запросы/>
</ПравилаОбмена>
<ИнформацияОТипахДанных>
    <ТипДанных Имя="СправочникСсылка.Направления">
        <Код>Строка</Код>
        <ПометкаУдаления>Булево</ПометкаУдаления>
        <Наименование>Строка</Наименование>
        <Родитель>СправочникСсылка.Направления</Родитель>
        <ЭтоГруппа>Булево</ЭтоГруппа>
    </ТипДанных>
</ИнформацияОТипахДанных>
<ДанныеПоОбмену ПланОбмена="МоскваCRM" Кому="CRM" ОтКого="Москва" НомерИсходящегоСообщения="5" НомерВходящегоСообщения="0"/>
<ДанныеПоФоновомуОбмену ПланОбмена="" Кому="0" ОтКого="0" ДобавлениеОбъектовИзФоновогоОбмена="0" КоличествоОбъектовДляФоновогоОбмена="500" ПереданоОбъектовФоновогоОбмена="0"/>
<Объект Нпп="1" Тип="СправочникСсылка.Направления" ИмяПравила="Направления"><Ссылка Нпп="1">
    <Свойство Имя="{КлючПоискаВИБИсточнике}">
        <Значение>{"#",0bd0deec-1479-4cdf-ae4b-f10e71f3205a,111:9ed000248cc4a20411e26f88824de171}</Значение>
    </Свойство>
    <Свойство Имя="{ИмяТипаВИБИсточнике}">
        <Значение>СправочникСсылка.Айсберг_Направления</Значение>
    </Свойство>
    <Свойство Имя="{ИмяТипаВИБПриемнике}">
        <Значение>СправочникСсылка.Направления</Значение>
    </Свойство>
    <Свойство Имя="Код">
        <Значение>000000013</Значение>
    </Свойство>
</Ссылка>
    <Свойство Имя="Наименование">
        <Значение>СВЧ</Значение>
    </Свойство>
    <Свойство Имя="ПометкаУдаления">
        <Значение>false</Значение>
    </Свойство>
    <Свойство Имя="Родитель"/>
    <Свойство Имя="ЭтоГруппа">
        <Значение>false</Значение>
    </Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.Направления" ИмяПравила="Направления"><Ссылка Нпп="2">
    <Свойство Имя="{КлючПоискаВИБИсточнике}">
        <Значение>{"#",0bd0deec-1479-4cdf-ae4b-f10e71f3205a,111:9ed000248cc4a20411e26f88824de173}</Значение>
    </Свойство>
    <Свойство Имя="{ИмяТипаВИБИсточнике}">
        <Значение>СправочникСсылка.Айсберг_Направления</Значение>
    </Свойство>
    <Свойство Имя="{ИмяТипаВИБПриемнике}">
        <Значение>СправочникСсылка.Направления</Значение>
    </Свойство>
    <Свойство Имя="Код">
        <Значение>000000014</Значение>
    </Свойство>
</Ссылка>
    <Свойство Имя="Наименование">
        <Значение>СМ</Значение>
    </Свойство>
    <Свойство Имя="ПометкаУдаления">
        <Значение>false</Значение>
    </Свойство>
    <Свойство Имя="Родитель"/>
    <Свойство Имя="ЭтоГруппа">
        <Значение>false</Значение>
    </Свойство>
</Объект>
</ФайлОбмена>
Для загрузки использую обработку из поставки КД 2.1.8.2: V8Exchan83.epf в режиме работы На сервере.
Получаю ошибки:
Ошибка формата файла обмена
    ИмяУзла                =  ДанныеПоОбмену
...

Ошибка при загрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(5256)}: Ошибка при вызове метода контекста (Выполнить): {(1, 68)}: Синтаксическая ошибка "="
ВЫБРАТЬ Ссылка ИЗ Справочник.Направления ГДЕ {ИмяТипаВИБИсточнике} <<?>>= &{ИмяТипаВИБИсточнике} И Код = &Код И {ИмяТипаВИБПриемнике} = &{ИмяТипаВИБПриемнике} И {КлючПоискаВИБИсточнике} = &{КлючПоискаВИБИсточнике}
...

Загружено объектов: 0
(см. фото) https://yadi.sk/i/LwzcPBr-jQxMw

НО! это при выгрузке из УТ через настройку обмена. Ошибка исчезает если выгружать данные обработкой из поставки КД: V8Exchan82.epf (82 не смотря на то что платформа 83, т.к. в режиме Обычного приложения).
Привожу содержание "правильного" XML:
<?xml version="1.0" encoding="UTF-8"?>
<ФайлОбмена ВерсияФормата="2.0" ДатаВыгрузки="2015-09-30T09:26:42" НачалоПериодаВыгрузки="0001-01-01T00:00:00" ОкончаниеПериодаВыгрузки="0001-01-01T00:00:00" ИмяКонфигурацииИсточника="УправлениеТорговлей" ИмяКонфигурацииПриемника="Конфигурация" ИдПравилКонвертации="fc7e8361-6fbe-42bb-90d4-6ee69b6c1794" Комментарий="">
<ПравилаОбмена>
    <ВерсияФормата>2.01</ВерсияФормата>
    <Ид>fc7e8361-6fbe-42bb-90d4-6ee69b6c1794</Ид>
    <Наименование>СервисДляCRM --&gt; CRM</Наименование>
    <ДатаВремяСоздания>2015-09-28T12:18:38</ДатаВремяСоздания>
    <Источник>УправлениеТорговлей</Источник>
    <Приемник>Конфигурация</Приемник>
    <Параметры/>
    <Обработки/>
    <ПравилаКонвертацииОбъектов>
        <Правило>
            <Код>Направления</Код>
            <Источник>СправочникСсылка.Айсберг_Направления</Источник>
            <Приемник>СправочникСсылка.Направления</Приемник>
        </Правило>
    </ПравилаКонвертацииОбъектов>
    <ПравилаОчисткиДанных/>
    <Алгоритмы/>
    <Запросы/>
</ПравилаОбмена>
<Объект Нпп="1" Тип="СправочникСсылка.Направления" ИмяПравила="Направления"><Ссылка Нпп="1">
    <Свойство Имя="Код" Тип="Строка">
        <Значение>000000013</Значение>
    </Свойство>
</Ссылка>
    <Свойство Имя="Наименование" Тип="Строка">
        <Значение>СВЧ</Значение>
    </Свойство>
    <Свойство Имя="ПометкаУдаления" Тип="Булево">
        <Значение>false</Значение>
    </Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.Направления">
    <Пусто/>
</Свойство>
    <Свойство Имя="ЭтоГруппа" Тип="Булево">
        <Значение>false</Значение>
    </Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.Направления" ИмяПравила="Направления"><Ссылка Нпп="2">
    <Свойство Имя="Код" Тип="Строка">
        <Значение>000000014</Значение>
    </Свойство>
</Ссылка>
    <Свойство Имя="Наименование" Тип="Строка">
        <Значение>СМ</Значение>
    </Свойство>
    <Свойство Имя="ПометкаУдаления" Тип="Булево">
        <Значение>false</Значение>
    </Свойство><Свойство Имя="Родитель" Тип="СправочникСсылка.Направления">
    <Пусто/>
</Свойство>
    <Свойство Имя="ЭтоГруппа" Тип="Булево">
        <Значение>false</Значение>
    </Свойство>
</Объект>
</ФайлОбмена>
И еще в Управляемом приложении не позволяет сформировать модуль отладки загрузки. При нажатии на любую из указанных кнопок ничего не происходит (см. фото) https://yadi.sk/i/pk8RMDXxjQyCm
1 790th
 
30.09.15
09:47
Удалил секции:
<ИнформацияОТипахДанных>
<ДанныеПоОбмену..
<ДанныеПоФоновомуОбмену..

Теперь пишет:

Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(5255)}: Ошибка при вызове метода контекста (Выполнить): {(1, 68)}: Синтаксическая ошибка "="
ВЫБРАТЬ Ссылка ИЗ Справочник.Направления ГДЕ {ИмяТипаВИБИсточнике} <<?>>= &{ИмяТипаВИБИсточнике} И Код = &Код И {ИмяТипаВИБПриемнике} = &{ИмяТипаВИБПриемнике} И {КлючПоискаВИБИсточнике} = &{КлючПоискаВИБИсточнике}
2 vicof
 
30.09.15
09:50
выгрузку и загрузку желательно надо проводить обработками одной версии. Или лезть в отладчик.
3 790th
 
30.09.15
09:57
Боюсь что затянуть из последней УТ свежую версию Настройки обмена, будет непросто, т.к. этот механизм там не сконцентрирован в одном месте а "размазан" по всей конфигурации (
4 790th
 
30.09.15
10:14
Так. А вот еще принципиальное отличние:
"Правильный" файл:

<Свойство Имя="Код" Тип="Строка">
        <Значение>000000013</Значение>

"Ошибочный" файл:

<Свойство Имя="{КлючПоискаВИБИсточнике}">
        <Значение>{"#",0bd0deec-1479-4cdf-ae4b-f10e71f3205a,111:9ed000248cc4a20411e26f88824de171}</Значение>
5 Naumov
 
30.09.15
11:02
(4) В этой записи нет никакой ошибки.
6 Naumov
 
30.09.15
11:03
А правила не от КД 3.0?
7 790th
 
30.09.15
11:41
Правила от КД 2.1.8.2
Удалось избавиться от главной ошибки

"Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(5255)}: Ошибка при вызове метода контекста (Выполнить): {(1, 68)}: Синтаксическая ошибка "="
ВЫБРАТЬ Ссылка ИЗ Справочник.Направления ГДЕ {ИмяТипаВИБИсточнике} <<?>>= &{ИмяТипаВИБИсточнике} И Код = &Код И {ИмяТипаВИБПриемнике} = &{ИмяТипаВИБПриемнике} И {КлючПоискаВИБИсточнике} = &{КлючПоискаВИБИсточнике}"

Таким образом вставил кусок из обработки из УТ. Поместил в обработку Приемника (коммент //Юрасов):
Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта.НайтиЭлементЗапросом(...)
...

// не по всем параметрам можно искать
Если ИмяПараметра = "{УникальныйИдентификатор}"
    ИЛИ ИмяПараметра = "{ИмяПредопределенногоЭлемента}"

    //Юрасов++
    ИЛИ ИмяПараметра = "{КлючПоискаВИБИсточнике}"
    ИЛИ ИмяПараметра = "{КлючПоискаВИБПриемнике}"
    ИЛИ ИмяПараметра = "{ИмяТипаВИБИсточнике}"
    ИЛИ ИмяПараметра = "{ИмяТипаВИБПриемнике}" Тогда
    //Юрасов--    

    Продолжить;                

КонецЕсли;

Теперь загружает данные, хоть и остались ошибки:

Ошибка формата файла обмена
    ИмяУзла                =  ДанныеПоОбмену
...

Ошибка формата файла обмена
    ИмяУзла                =  ДанныеПоФоновомуОбмену
8 790th
 
30.09.15
13:09
Эти две ошибки тоже убрал. Пришлось перенести еще один кусок в приемник:
Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта.ПроизвестиЧтениеДанных(...)
...

ИначеЕсли (ИмяУзла = "ФайлОбмена") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда
    
//Юрасов++
ИначеЕсли ИмяУзла = "ДанныеПоОбмену" Тогда
    
    // обработка удаления объекта из информационной базы
    ИмяПланаОбмена = одАтрибут(ФайлОбмена, одТипСтрока, "ПланОбмена");
    
    КодКому = одАтрибут(ФайлОбмена, одТипСтрока, "Кому");
    КодОтКого = одАтрибут(ФайлОбмена, одТипСтрока, "ОтКого");
    
    УзелОбменаЗагрузкаДанных = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодОтКого);
    
    Если Не ЗначениеЗаполнено(УзелОбменаЗагрузкаДанных) Тогда
        
        ВызватьИсключение "Не найден узел обмена для загрузки данных. План обмена: " + ИмяПланаОбмена + ", Код: " + КодОтКого;        
        
    КонецЕсли;
    
    мНомерВходящегоСообщения = одАтрибут(ФайлОбмена, одТипЧисло, "НомерИсходящегоСообщения");
    НомерПринятогоСообщения = одАтрибут(ФайлОбмена, одТипЧисло, "НомерВходящегоСообщения");
    
    Если УзелОбменаЗагрузкаДанных.НомерПринятого >= мНомерВходящегоСообщения Тогда
        
        ВызватьИсключение "Номер сообщения меньше либо равен ранее принятому";        
        
    КонецЕсли;
    
    //Юрасов++
    //ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбменаЗагрузкаДанных, НомерПринятогоСообщения);                                
    //мЗапросНаличияСтрокВРегистреСоответствия.УстановитьПараметр("Узел", УзелОбменаЗагрузкаДанных);
    //мЗапросНаличияПустыхДляИсточникаВРегистреСоответствия.УстановитьПараметр("Узел", УзелОбменаЗагрузкаДанных);
    //Юрасов--
    Попытка
        мПрефиксДокументовПриЗагрузке = СокрЛП(УзелОбменаЗагрузкаДанных.ПрефиксДляЗагружаемыхДокументов);
        мДлинаПрефиксаДокументовПриЗагрузке = СтрДлина(мПрефиксДокументовПриЗагрузке);                    
    Исключение
        мПрефиксДокументовПриЗагрузке = "";
        мДлинаПрефиксаДокументовПриЗагрузке = 0;                    
    КонецПопытки;
    
    Попытка
        мДатаДокументовДляУстановкиПрефикса = УзелОбменаЗагрузкаДанных.ДатаНачалаВыгрузкиДокументов;
    Исключение
        мДатаДокументовДляУстановкиПрефикса = Неопределено;
    КонецПопытки;
    
    Попытка
        мИспользоватьИнформациюОМестеСозданияОбъектовПриЗагрузке = УзелОбменаЗагрузкаДанных.ИспользоватьИнформациюОМестеСозданияОбъектовПриВыгрузкеИЗагрузкеДанных;
    Исключение
        мИспользоватьИнформациюОМестеСозданияОбъектовПриЗагрузке = Неопределено;
    КонецПопытки;
    
    одПропустить(ФайлОбмена, "ДанныеПоОбмену");    
    
ИначеЕсли ИмяУзла = "ДанныеПоФоновомуОбмену" Тогда
    
    // обработка удаления объекта из информационной базы
    ИмяПланаОбмена = одАтрибут(ФайлОбмена, одТипСтрока, "ПланОбмена");
    
    КодКому = одАтрибут(ФайлОбмена, одТипСтрока, "Кому");
    КодОтКого = одАтрибут(ФайлОбмена, одТипСтрока, "ОтКого");
    
    Если Не ПустаяСтрока(ИмяПланаОбмена) Тогда
        
        Попытка
            УзелОбменаЗагрузкаФоновыхДанных = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодОтКого);
        Исключение
            УзелОбменаЗагрузкаФоновыхДанных = Неопределено;
        КонецПопытки;
    
    Иначе
        УзелОбменаЗагрузкаФоновыхДанных = Неопределено;
    КонецЕсли;
    
    ДобавлениеОбъектовИзФоновогоОбменаЗагрузка = одАтрибут(ФайлОбмена, одТипЧисло, "ДобавлениеОбъектовИзФоновогоОбмена");
    КоличествоОбъектовДляФоновогоОбменаЗагрузка = одАтрибут(ФайлОбмена, одТипЧисло, "КоличествоОбъектовДляФоновогоОбмена");
    ПолученоОбъектовФоновогоОбмена = одАтрибут(ФайлОбмена, одТипЧисло, "ПереданоОбъектовФоновогоОбмена");
                                
    одПропустить(ФайлОбмена, "ДанныеПоФоновомуОбмену");
    
//    Если Не ПустаяСтрока(Конвертация.ПослеПолученияИнформацииОбУзлахОбмена) Тогда
//
//        Попытка
//            
//            Если ФлагРежимОтладкиОбработчиков Тогда
//                
//                Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПослеПолученияИнформацииОбУзлахОбмена"));
//                
//            Иначе
//                
//                Выполнить(Конвертация.ПослеПолученияИнформацииОбУзлахОбмена);
//                
//            КонецЕсли;
//            
//        Исключение
//            СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(176, ОписаниеОшибки(), "ПослеПолученияИнформацииОбУзлахОбмена (конвертация)");
//            
//            Если Не ФлагРежимОтладки Тогда
//                ВызватьИсключение СтрокаСообщенияОбОшибке;
//            КонецЕсли;
//            
//            //Возврат Ложь;
//            Возврат;
//        КонецПопытки;
//    
//    КонецЕсли;
    //Юрасов--
    
Иначе
    СтруктураЗаписи = Новый Структура("ИмяУзла", ИмяУзла);
    ЗаписатьВПротоколВыполнения(9, СтруктураЗаписи);
КонецЕсли;
9 790th
 
30.09.15
13:13
В итоге решение примерно такое. захожу отладчиком при загрудке и смотрю на что ругается. вижу что в коде нет варианта для обработки такого поля или параметра. Иду в конфигурацию откуда выгружал, смотрю как этот код работает там. вижу такую же функцию но с дополнительным кодом. вижу что этого то кода и нехватает что бы обработать данный параметр. копировать/встаить. проверка синтаксиса. ругается. смотрю если что то для меня не важное убираю. если важное разбираюсь почему ругается и что еще нужно копипастнуть. проверяю правила. и так вылизываю пока не пропадут все ошибки при загрузке
10 Naumov
 
30.09.15
14:14
у тебя просто древние релизы конфигураций, в них встроенная обработка универсального обмена старой версии.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший