|
Ошибка при обмене данными | ☑ | ||
|---|---|---|---|---|
|
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, ОписаниеОшибки(), Объект, Тип); Если Не ФлагРежимОтладки Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; КонецЕсли; КонецЕсли; КонецПопытки; КонецПроцедуры |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |