Имя: Пароль:
1C
1C 7.7
v7: Подключение через ОЛЕ
0 MixanM
 
16.12.11
05:58
Сделал проверку справочника, где то была ветка, н стал ее реанимировать, т.к. все сделал, только вопрос, почему при работе, доходя до первой записи, и обрабатывая ее корректно - дальше выпадает надпись : "Не выбран Элемент" ?
код не большой :
Процедура Сформировать()
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
   Файл = СоздатьОбъект("Текст");
   ИмяФайла = "c:\rash.txt";
   Файл.Открыть(ИмяФайла);
   
   БазаОле=СоздатьОбъект("V77.Application");
   ПользовательОле = "Admin";
   ПарольОле       = "";
   ЗапускБезЗаставки = 1;
   Если Лидер = 1 Тогда
       РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\Config\Trade_torg\","NO_SPLASH_SHOW");
   КонецЕсли;
   Если ТЦ = 1 Тогда
   РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\Config\Trade_lider\","NO_SPLASH_SHOW");
   КонецЕсли;
       Если РезультатПодключения = 0 Тогда
       Сообщить("Не удалось подключится к указанной базе - проверьте вводные!");
       Возврат;
   Иначе
       Сообщить("Коннект был устновлен");
   КонецЕсли;
   СпрЕдиницыОЛЕ = БазаОле.CreateObject("Справочник.Единицы");
   СпрОЛЕ = БазаОле.CreateObject("Справочник.Номенклатура");
   СпрОЛЕ.ВыбратьЭлементы() ;
   Спр.ВыбратьЭлементы();
   Счетчик = 0;
   Попытка
       Пока СпрОЛЕ.ПолучитьЭлемент() = 1 Цикл
           КодСравнения = СпрОЛЕ.Код;
           Если Спр.НайтиПоКоду(КодСравнения, 0) = 1 Тогда
               НайденныйЭлемент = Спр.ТекущийЭлемент();
               ИмяВБазе = НайденныйЭлемент.Наименование;
               ИмяВОле = СпрОЛЕ.Наименование;
               КодВПереферийн = СпрОЛЕ.Код;
               КодВБазе = НайденныйЭлемент.Код;
               //ПометкаудаленияБаза = НайденныйЭлемент.пометкаУдаления;
               Если (Спр.пометкаУдаления() = 1) и (СпрОле.ПометкаУдаления() = 1) Тогда
                   Сообщить(КодВБазе+""+КодВПереферийн+" Помеченны на удаление");
               Иначе
                   Если (КодВБазе = КодВПереферийн) Тогда      
                       Если (ИмяВОле = ИмяВБазе)Тогда
                           Сообщить(КодВБазе+" и "+КодВПереферийн+" "+ИмяВБазе+" и "+ИмяВОле);
                       Иначе
                           Спр.НайтиПоКоду(КодВБазе);
                           Если Спр.Выбран() = 1 Тогда
                           СпрЕдиницы.ИспользоватьВладельца(спр.ТекущийЭлемент());
                           СпрЕдиницы.ВыбратьЭлементы();
                           Пока СпрЕдиницы.ПолучитьЭлемент() = 1 Цикл
                                НайденныйКод = СпрЕдиницы.ШтрихКод;
                           КонецЦикла;
                           КонецЕсли;
                           Сообщить("Найденный код "+НайденныйКод);
                           СпрОЛЕ.НайтиПоКоду(КодВПереферийн);
                           Если СпрОЛЕ.Выбран()=1 Тогда
                               СпрЕдиницыОЛЕ.ИспользоватьВладельца(СпрОЛЕ.ТекущийЭлемент());
                               СпрЕдиницыОЛЕ.ВыбратьЭлементы();
                               Пока СпрЕдиницыОЛЕ.ПолучитьЭлемент()=1 Цикл
                                   Если (СпрЕдиницыОЛЕ <> СпрЕдиницы) Тогда
                                   Сообщить("Штрих код ОЛЕ "+СпрЕдиницыОЛЕ.ШтрихКод+" Текущий элемент ОЛЕ : "
                               +ИмяВОле+" Штрихкод в Базе : "+НайденныйКод+" Имя в Базе : "+ИмяВБазе);    
                                   Счетчик = Счетчик + 1;
                               Сообщить(""+Счетчик+" : Расхождение");
                               Файл.ДобавитьСтроку(КодВБазе+";"+ КодВПереферийн);
                               Сообщить("Найдены элементы : "+КодВПереферийн+", и  : "+КодВБазе);
                               Файл.Записать(ИмяФайла);
                           КонецЕсли;
                           КонецЦикла;    
                           КонецЕсли;
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
           Сообщить("Всего общих кодов :" +Счетчик);
       КонецЦикла;

Исключение
   Предупреждение( ОписаниеОшибки());
   Возврат;
КонецПопытки;    
КонецПроцедуры

может нужнно указывать точку выхода из подчиненного справочник, или закрывать его каждый раз? кто сталкивался?
1 MixanM
 
16.12.11
06:02
картинку вот еще залил, там на скрине видно что код работает нормально, пока не входит в подчиненный справочник : http://zalil.ru/32289790
2 Rie
 
16.12.11
06:12
(0) спрОЛЕ.НайтиПоКоду() при возне с единицами сбивает изначальную выборку спрОЛЕ.ВыбратьЭлементы()
3 Морозов Александр
 
16.12.11
06:15
(2) да,да.да... если не вникать в код, то проблему можно решить простым созданием второго объекта: СпрОЛЕДляПоискаПоКоду = БазаОле.CreateObject("Справочник.Номенклатура");
4 MixanM
 
16.12.11
06:18
(3) т.е повторно создать объект, внутри поиска по подчиненному справочнику,  и шарить дальше ?
5 MixanM
 
16.12.11
06:20
или перед тем как шарить по подчиненному, и создавать второй объект?
6 Морозов Александр
 
16.12.11
06:22
Ну в самом начале процедуры создай объект
СпрОЛЕДляПоискаПоКоду = БазаОле.CreateObject("Справочник.Номенклатура");

и потом в цикле для поиска по коду используй этот объект

СпрОЛЕДляПоискаПоКоду.НайтиПоКоду(КодВПереферийн);
7 Морозов Александр
 
16.12.11
06:23
да и вообще если всю эту байду вынести в отдельную процедурку - будет красивее... наверно
8 MixanM
 
16.12.11
06:29
(7) Согласен..наврное, но т.к. надо всего на 1 раз, и так сойдет,
(6) так и сделал, вроде заработал, немного не точно, но это уже мой косяк, уже допилил.
9 MixanM
 
16.12.11
11:56
вообщем если кому то надо, вот рабочий код: еще раз, это обработка для поиска дублей товара в разных базах + проверка по подчиненным:
Процедура Сформировать()
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
   Файл = СоздатьОбъект("Текст");
   ИмяФайла = "c:\rash.txt";
   Файл.Открыть(ИмяФайла);
   
   БазаОле=СоздатьОбъект("V77.Application");
   ПользовательОле = "Admin";
   ПарольОле       = "";
   ЗапускБезЗаставки = 1;
   Если СЧемЛидер = 1 Тогда
       РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\trade_lider\","NO_SPLASH_SHOW");
   КонецЕсли;
   Если ЛидерОПТ = 1 Тогда
   РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\trade_mag_opt\","NO_SPLASH_SHOW");
   КонецЕсли;
       Если РезультатПодключения = 0 Тогда
       Сообщить("Не удалось подключится к указанной базе - проверьте вводные!");
       Возврат;
   Иначе
       Сообщить("Коннект был устновлен");
   КонецЕсли;
   СпрЕдиницыОЛЕ = БазаОле.CreateObject("Справочник.Единицы");
   СпрОЛЕ = БазаОле.CreateObject("Справочник.Номенклатура");
   СпрОЛЕДляПоискаПоКоду = БазаОле.CreateObject("Справочник.Номенклатура");//создал второй , ибо слетает курсор с первой rulf шарит по единицам
   СпрОЛЕ.ВыбратьЭлементы() ;
   Спр.ВыбратьЭлементы();
   Счетчик = 0;
   Попытка
       Пока СпрОЛЕ.ПолучитьЭлемент() = 1 Цикл
           КодСравнения = СпрОЛЕ.Код;
           Если Спр.НайтиПоКоду(КодСравнения, 0) = 1 Тогда
               НайденныйЭлемент = Спр.ТекущийЭлемент();
               ИмяВБазе = НайденныйЭлемент.Наименование;
               ИмяВОле = СпрОЛЕ.Наименование;
               КодВПереферийн = СпрОЛЕ.Код;
               КодВБазе = НайденныйЭлемент.Код;
               //ПометкаудаленияБаза = НайденныйЭлемент.пометкаУдаления;
               Если (Спр.пометкаУдаления() = 1) и (СпрОле.ПометкаУдаления() = 1) Тогда   //проверяем пометку на удаление
                   Сообщить(КодВБазе+""+КодВПереферийн+" Помеченны на удаление, пропускаем");
               Иначе
                   Если (КодВБазе = КодВПереферийн) Тогда    //проверяем по коду, если да, тогда...      
                       Если (ИмяВОле = ИмяВБазе)Тогда        //проверяем по имени, если да тогда ...
                           Сообщить(КодВБазе+" и "+КодВПереферийн+" "+ИмяВБазе+" и "+ИмяВОле);
                       Иначе
                           Спр.НайтиПоКоду(КодВБазе);
                           Если Спр.Выбран() = 1 Тогда
                               СпрЕдиницы.ИспользоватьВладельца(спр.ТекущийЭлемент());
                               СпрЕдиницы.ВыбратьЭлементы();
                               Пока СпрЕдиницы.ПолучитьЭлемент() = 1 Цикл
                                   НайденныйКод = СпрЕдиницы.ШтрихКод;
                               КонецЦикла;//нашли шттрих код текущей базы
                           КонецЕсли;
                           Сообщить("Найденный код "+НайденныйКод);
                           СпрОЛЕДляПоискаПоКоду.НайтиПоКоду(КодВПереферийн);
                           Если СпрОЛЕДляПоискаПоКоду.Выбран()=1 Тогда
                               СпрЕдиницыОЛЕ.ИспользоватьВладельца(СпрОЛЕ.ТекущийЭлемент());
                               СпрЕдиницыОЛЕ.ВыбратьЭлементы();
                               Пока СпрЕдиницыОЛЕ.ПолучитьЭлемент()=1 Цикл      //нашли штрихкод в преферийной
                                   Если (СпрЕдиницыОЛЕ.ШтрихКод <> НайденныйКод) Тогда  //проверяем по штриху коду
                                       Счетчик = Счетчик + 1;
                                       Сообщить(""+Счетчик+" : Расхождение");
                                       Файл.ДобавитьСтроку("Расхождение по коду : "+КодВБазе+";"+ КодВПереферийн);
                                       Сообщить("Найдены элементы : "+КодВПереферийн+", и  : "+КодВБазе);
                                       Файл.Записать(ИмяФайла);
                                   Иначе
                                       Счетчик = Счетчик + 1;
                                       Файл.ДобавитьСтроку("Расхождение по наименованию, код в Базе :"+КодВБазе+" "
                                       +ИмяВБазе+" Код в перефериной :"+ КодВПереферийн+" "+ИмяВОле);
                                       Файл.Записать(ИмяФайла);
                                   КонецЕсли;
                               КонецЦикла;    
                           КонецЕсли;
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
           Сообщить("Всего общих кодов :" +Счетчик);
       КонецЦикла;

Исключение
   Предупреждение( ОписаниеОшибки());
   Возврат;
КонецПопытки;    
КонецПроцедуры
AdBlock убивает бесплатный контент. 1Сергей