Имя: Пароль:
1C
 
Ошибка при обмене данными
0 Draconus
 
14.01.11
12:20
День добрый!

Подскажите пожалуйста, как можно исправить такую ошибку :

Предыстория... Обмен между двумя УПП. После выгрузки из одной, при загрузке во второй появляется ошибка:

Ошибка записи объекта
   ТипОбъекта             =  Справочник ссылка: Номенклатурные группы
   Объект                 =  Блоки бетонные стен подвалов
   ОписаниеОшибки         =  Ошибка при вызове метода контекста (Записать): Ошибка при попытке вставки записи с неуникальным значением ссылки.
таблица Reference130.
   ПозицияМодуля          =  Обработка.ОбменДаннымиXML(3784)
   КодСообщения           =  26
Ошибка при чтении изменений из файла обмена.
Ошибка записи объекта
   ТипОбъекта             =  Справочник ссылка: Номенклатурные группы
   Объект                 =  Блоки бетонные стен подвалов
   ОписаниеОшибки         =  Ошибка при вызове метода контекста (Записать): Ошибка при попытке вставки записи с неуникальным значением ссылки.
таблица Reference130.
   ПозицияМодуля          =  Обработка.ОбменДаннымиXML(3784)
   КодСообщения           =  26
Чтение данных из файла обмена завершено с ошибками!

Как сие можно исправить?
1 Draconus
 
15.01.11
15:20
Решил поменять процедуру Записи в Обработке "ОбменДаннымиXML":

//Процедура ЗаписатьОбъектВИБ(Объект, Тип)
//        
//    Попытка
//        
//        УстановитьОбменДаннымиЗагрузка(Объект);
//        Объект.Записать();
//        
//    Исключение
//        
//        СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип);
//        
//        Если Не ФлагРежимОтладки Тогда
//            ВызватьИсключение СтрокаСообщенияОбОшибке;
//        КонецЕсли;
//        
//    КонецПопытки;        
//        
//КонецПроцедуры
Процедура ЗаписатьОбъектВИБ(Объект, Тип)
   
   Попытка
       
       УстановитьОбменДаннымиЗагрузка(Объект);
       
       Попытка
           
           Объект.Записать();
           
       Исключение
           
           СтрокаОшибки = ОписаниеОшибки();
           
           Если Найти(СтрокаОшибки, "Ошибка при вызове метода контекста (Записать): Ошибка при попытке вставки записи с неуникальным значением ссылки.") = 0 Тогда
               
               СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип);
               
               Если Не ФлагРежимОтладки Тогда
                   ВызватьИсключение СтрокаСообщенияОбОшибке;
               КонецЕсли;
               
               
           КонецЕсли;
           
       КонецПопытки;
       
   Исключение
       
       СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип);
       
       Если Не ФлагРежимОтладки Тогда
           ВызватьИсключение СтрокаСообщенияОбОшибке;
       КонецЕсли;
       
   КонецПопытки;        
   
КонецПроцедуры


Возможно ли что это вызовет какие нибудь ошибки в будущем?
2 Рэйв
 
15.01.11
15:24
Если все это хозяйство уже в попытке, то вылетит по ошибке с надписью "В этой транзакции уже происходили ошибки" или что-то вроде этого.  

Если сильно надо перед записью установи
Объект.ОбменДанными.Загрузка=Истина;

Но все таки лучше разобраться почему ругается.
3 Draconus
 
15.01.11
15:49
Что-то такое нашел на unfostart.ru

Презабавнейшая история битвы с самим собой:

Общая ситуация такая:
Выгружаю данные из БП в УПП с помощью КД. Взял стандратный обмен, он отстает от текущих на 10 версий, довел до ума и тестирую обмен.
При выгрузке справочников выдается ошибка:

Ошибка при загрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML(3326)}: Ошибка записи объекта
ТипОбъекта = Справочник ссылка: Контрагенты
Объект = НекаяФирма ООО
ОписаниеОшибки = Ошибка при вызове метода контекста (Записать): Ошибка при попытке вставки записи с неуникальным значением ссылки.
таблица Reference102.
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML(3319)
КодСообщения = 26

Причем, если мы выгружаем все справочники, то ошибка есть, если только контрагенты, то ошибки нет.
Проблема оказалась в том, что при включенной галке «Оптимизированная запись» при записи Свойства объекта происходит не запись, а сохранение объекта в стеке, которое подразумевает отложенную запись.
Но отложенной записи не происходит и получается такая ситуация – в стеке висит структура, которая хранит одновременно объект и ссылку.
Как только требуется обработать еще один объект, мы получаем ссылку по тому же ГУИД, привязываем ссылку к новому объекту и сохраняем. В структуре стека объект отвязывается от нашей ссылки и содержит пустую ссылку с идентификатором «00000000-0000-0000-0000-000000000000». Как только мы, наконец, доходим до самого объекта, он видит, что в стеке есть данные и использует их, причем считая что объект связан со ссылкой, а это, как мы помним, не так.
Все лечится тем, что убираем галку Оптимизированная запись.


Ситуация по коду:

Идем вниз по стеку вызовов:
ПрочитатьОбъект() Читаем «Контактные лица контрагентов»
НайтиОбъектПоСсылке() По ГУИД ищем ссылку на контактые лица
ПрочитатьИнформациюОСвойствахПоиска() Ищем свойства поиска
ПрочитатьСвойстваПоискаИзФайла() Ищем свойства в файле
ПрочитатьСвойство() Читаем свойство Владелец (Это наш контагент)
НайтиОбъектПоСсылке() Пытаемся прочитать нашего владельца
//НайтиИлиСоздатьОбъектПоСвойству() По ГУИД ищем объект (фактически ищем ссылку)
СоздатьНовыйОбъект() Создаем объект и ссылку
Там есть такой пункт
Если ГНпп <> 0 ИЛИ Не ОптимизированнаяЗаписьОбъектов. Глобального номера у нас нет, а оптимизированная запись включена, поэтому запись откладывается в стек объектов, но из стека не уходит, так как работа со стеком предусмотрена только для объектов, а не для свойств

НайтиОбъектПоСсылке перед завершением устанавливает СвойстваОбъектаМодифицированы = Истина; но этот признак никто не обрабатывает, объект зависает в стеке, ссылка теряется и потом мы получаем то, что получаем.
4 Draconus
 
15.01.11
16:00
Объект.ОбменДанными.Загрузка=Истина;

Устанавливается в

       УстановитьОбменДаннымиЗагрузка(Объект);
       

Её код:

Процедура УстановитьОбменДаннымиЗагрузка(Объект, Значение = Истина) Экспорт
   
   Попытка
       Объект.ОбменДанными.Загрузка = Значение;
   Исключение
   КонецПопытки;
   
   Если УзелОбменаЗагрузкаДанных <> Неопределено
       И НЕ УзелОбменаЗагрузкаДанных.Пустая() Тогда
   
       Попытка
           Объект.ОбменДанными.Отправитель = УзелОбменаЗагрузкаДанных;
       Исключение
       КонецПопытки;
   
   КонецЕсли;
   
КонецПроцедуры // УстановитьОбменДаннымиЗагрузка()
5 Draconus
 
15.01.11
16:05
Возможно еще попробовать записать текст ошибки в Настройке плана обмена на закладке "Интерактивные обмен" в Текстах сообщений, которые не являются ошибками... (о как!)

А так уже по 40.000 перенеслось... обмен конечно не самый большой, но ошибок пока не было...
6 Draconus
 
15.01.11
16:14
Можно конечно, оставить одну попытку и в ней поставить условие с текстом ошибки...
7 Draconus
 
21.01.11
14:43
В итоге оставил окончательный вариант следующий:

В обработке ОбменДаннымиXML, в модуле объекта подправил процедуру.

//Процедура ЗаписатьОбъектВИБ(Объект, Тип)
//        
//    Попытка
//        
//        УстановитьОбменДаннымиЗагрузка(Объект);
//        Объект.Записать();
//        
//    Исключение
//        
//        СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип);
//        
//        Если Не ФлагРежимОтладки Тогда
//            ВызватьИсключение СтрокаСообщенияОбОшибке;
//        КонецЕсли;
//        
//    КонецПопытки;        
//        
//КонецПроцедуры
Процедура ЗаписатьОбъектВИБ(Объект, Тип)
   
   Попытка
       
       УстановитьОбменДаннымиЗагрузка(Объект);
       Объект.Записать();
       
   Исключение
       
       СтрокаОшибки = ОписаниеОшибки();
       
       Если Найти(СтрокаОшибки, "Ошибка при вызове метода контекста (Записать): Ошибка при попытке вставки записи с неуникальным значением ссылки.") = 0 Тогда
           
           СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип);
           
           Если Не ФлагРежимОтладки Тогда
               ВызватьИсключение СтрокаСообщенияОбОшибке;
           КонецЕсли;
           
       КонецЕсли;
       
   КонецПопытки;        
   
КонецПроцедуры