Имя: Пароль:
1C
1С v8
КД2 Ошибка в стандартном модуле при загрузке
0 Nik_nik_nik
 
14.08.12
17:17
Пишу конвертацию с самописной 7-ки (ближе всего к комплексной) в УПП. Почти все что надо написал, протестил на небольших объемах. И при полном тестировании наткнулся на вот какой глюк:

Переношу номенклатуру. Выгружаю всю сразу оптом - на этом этапе никаких ошибок. При загрузке выпадает с такой ошибкой:

"Ошибка:{ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(5129)}: Ошибка при установке значения атрибута контекста (Владелец): Справочник не имеет владельца"

По отладчику посмотрел что происходит... в запросе номенклатура отбирается по владельцу (с типом той же номенклатуры)... никакого владельца у номенклатуры нет, справочник никому не подчинен, в ПКО ни слова ни о каких владельцах...

Попробовал выгружать кусками... номенклатуры чуть больше 100 000 позиций. Делением кусков пополам нашел примерный диапазон кодов на котором случается такая беда, но дальше интереснее...

Глюк случается только в определенном диапазоне кодов номенклатуры и только в случае если выгружаемых объектов больше 5102 штук (на этом объекте ошибка и происходит).

Т.е.
берем коды с 95000 по 97500 - количество объектов 5170 - ошибка есть
берем коды с 95000 по 96000 - количество объектов 2100 - ошибки нет
берем коды с 96000 по 97500 - количество объектов 3013 - ошибки нет

Пробовал брать внешнюю обработку выгрузки от других версий конвертации (и от последних тоже) - эффект тот же.

Куда дальше копать, граждане???
1 SUA
 
14.08.12
17:21
"По отладчику посмотрел что происходит... в запросе номенклатура отбирается по владельцу"
зачем?
2 Nik_nik_nik
 
14.08.12
17:24
(1), зачем отбирается? - Без понятия - это функция поиска ссылки на объект. Запросом отбираются все элементы подходящие по фильтру и выбирается первый элемент из выборки.
зачем посмотрел? - интересно стало :)
3 0Mint
 
14.08.12
17:42
А если поставить Использовать транзакции?
4 ДемонМаксвелла
 
14.08.12
17:45
ошибка происходит в какой процедуре или обработчике? и код покажи возле строки 5129.
5 Nik_nik_nik
 
14.08.12
17:45
(3) - пробовал, не помогло.

Выяснил что по сути порядок кодов не имеет значения, ошибка вылазит в любой выгрузке связанной с номенклатурой (например документ Инвентаризация), в котором объектов больше этого числа..
6 SUA
 
14.08.12
17:49
Функция НайтиЭлементПоСвойствамПоиска()?
поля/правила поиска для номенклатуры какие?
7 Nik_nik_nik
 
14.08.12
17:58
Функция НайтиЭлементЗапросом(СтруктураСвойств, СвойстваПоиска, ТипОбъекта = Неопределено,
   МенеджерТипа = Неопределено, КоличествоРеальныхСвойствДляПоиска = Неопределено)
   
   КоличествоСвойствДляПоиска = ?(КоличествоРеальныхСвойствДляПоиска = Неопределено, СвойстваПоиска.Количество(), КоличествоРеальныхСвойствДляПоиска);
   
   Если КоличествоСвойствДляПоиска = 0
       И СтруктураСвойств.ИмяТипа = "Перечисление" Тогда
       
       Возврат СтруктураСвойств.ПустаяСсылка;
       
   КонецЕсли;    
   
   ТекстЗапроса       = СтруктураСвойств.СтрокаПоиска;
   
   Если ПустаяСтрока(ТекстЗапроса) Тогда
       Возврат СтруктураСвойств.ПустаяСсылка;
   КонецЕсли;
   
   ЗапросПоиска       = Новый Запрос();
   КоличествоСвойстПоКоторымУстановленПоиск = 0;
           
   Для каждого Свойство Из СвойстваПоиска Цикл
               
       ИмяПараметра      = Свойство.Ключ;
       
       // не по всем параметрам можно искать
       Если ИмяПараметра = "{УникальныйИдентификатор}"
           ИЛИ ИмяПараметра = "{ИмяПредопределенногоЭлемента}" Тогда
                       
           Продолжить;
                       
       КонецЕсли;
       
       ЗначениеПараметра = Свойство.Значение;
       ЗапросПоиска.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра);
               
       Попытка
           
           //МенеджерТипа = ?(МенеджерТипа = Неопределено, Менеджеры[ТипОбъекта], МенеджерТипа);
           
           СтрокаНеограниченнойДлины = ОпределитьЭтотПараметрНеограниченнойДлинны(СтруктураСвойств, ЗначениеПараметра, ИмяПараметра);        
                                                   
       Исключение
                   
           СтрокаНеограниченнойДлины = Ложь;
                   
       КонецПопытки;
       
       КоличествоСвойстПоКоторымУстановленПоиск = КоличествоСвойстПоКоторымУстановленПоиск + 1;
               
       Если СтрокаНеограниченнойДлины Тогда
                   
           ТекстЗапроса = ТекстЗапроса + ?(КоличествоСвойстПоКоторымУстановленПоиск > 1, " И ", "") + ИмяПараметра + " ПОДОБНО &" + ИмяПараметра;
                   
       Иначе
                   
           ТекстЗапроса = ТекстЗапроса + ?(КоличествоСвойстПоКоторымУстановленПоиск > 1, " И ", "") + ИмяПараметра + " = &" + ИмяПараметра;
                   
       КонецЕсли;
                               
   КонецЦикла;
   
   Если КоличествоСвойстПоКоторымУстановленПоиск = 0 Тогда
       Возврат Неопределено;
   КонецЕсли;
   
   ЗапросПоиска.Текст = ТекстЗапроса;
   Результат = ЗапросПоиска.Выполнить();
           
   Если Результат.Пустой() Тогда
       
       Возврат Неопределено;
                               
   Иначе
       
       // возвращаем первый найденный объект
       Выборка = Результат.Выбрать();
       Выборка.Следующий();
       СсылкаНаОбъект = Выборка.Ссылка;
               
   КонецЕсли;
   
   Возврат СсылкаНаОбъект;
   
КонецФункции
______________________________
Спотыкается на этой строке (Результат = ЗапросПоиска.Выполнить();)

ТекстЗапроса такой:
"ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Владелец = &Владелец И ЕдиницаПоКлассификатору = &ЕдиницаПоКлассификатору"
8 ДемонМаксвелла
 
14.08.12
18:09
Думаю, в эту функцию вместо номенктатуры должно было попасть что-то другое, например, единицы измерения, но произошла накладка и попала номенклатура. Причиной может быть например реквизит составного типа (хотя в данном конкретном случае вряд ли).
9 Nik_nik_nik
 
14.08.12
18:14
(8) судя по всему выгружается единица измерения связанная с номенклатурой, но поиск идет не по справочнику единиц, а по справочнику номенклатуры... с чего бы? Хоть какая-то ясность была бы в случае постоянной ошибки... но если выгружать кусками до 5000 объектов - все, вроде как отрабатывает нормально...
10 Stanislav_
Orlov
 
03.09.12
18:34
(7) Может быть все-таки Владельца по коду искать, а не как объект? (Которого может не быть в этой базе)
11 acsent
 
03.09.12
18:39
рекомендую отключать перенос объектов по ссылкам
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший