8.х ОБМЕН странное поведение программы приобмене с 8.0 в 7.7

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем tunec, 17 сен 2008.

  1. TopicStarter Overlay
    tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    пишу обработку по коррекции значений справочника номенклатуры в 2 базах в зависимости от совпадений некоторых параметров в этих базах.

    Код в 8.0... Соединение OLE...

    Код:
    НомЛже 	= База1.CreateObject("Справочник.Номенклатура");
    НомЛжеРод       = База1.CreateObject("Справочник.Номенклатура");
    НомИст 		= База2.CreateObject("Справочник.Номенклатура");
    НомИстРод        = База2.CreateObject("Справочник.Номенклатура");
    
    НомЛже.ВыбратьЭлементы();                     
    Пока не НомЛже.ПолучитьЭлемент()=0 цикл
    Чвыб1 = Чвыб1+1;
    Попытка
    Чвыб = Чвыб+1;
    Если НомИст.Найтипокоду(НомЛже.Код,0)=1 тогда //условие1
    //некоторые действия
    Если НомИст.Уровень() = 1 тогда  //условие2
    НомЛже.Родитель = "";
    иначе
    Если не НомЛже.Родитель.Код=НомИст.Родитель.Код тогда //условие3
    Если НомЛжеРод.НайтиПоКоду(НомИст.Родитель.Код,0)=1 тогда //условие4
    //некие действия
    конецесли;
    Конецесли;
    конецесли;
    НомЛже.Записать();
    конецесли;
    Исключение
    Сообщить("Ошибка! "+ОписаниеОшибки());
    Конецпопытки;
    Конеццикла;	
    
    Переменные сначинающиеся на "ч" введены для контроля количества выполнения кода.

    Итак проблема:
    В справочнике бух7.7 заведено 700 элементов и групп. Ровно. Проверял полным перебором в цикле (запуск в 7.7).

    примечания: Коментируем условия вместе с телом...

    1) Если закомментировать из вышеприведенного текста условия 2,3 и 4, то переменная Чвыб показывает что в выборке 700 элементов.

    2) Если закоментировать только условия 3,4, то в основном Чвыб = 700, хотя иногда Чвыб колеблется в пределах 660-690, а один раз было даже 701 :)

    3) Если закомментировать либо условие 3, либо условие 4, то Чвыб опускается до уровня 570-680. Причем раз от раза это число колеблется.

    4) Если ничего не комментировать, то Чвыб колеблется от 260 до 570....

    Примечание: от того, что я делаю внутри условий результат не меняется. Влияет только количество управляющих конструкций и их вложенность...

    вопрос: ЧТО ЭТО???!!!

    никогда такого не видел. Это глюка моя, 8ки или 7.7????
  2. TopicStarter Overlay
    tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    кажется понял в чем дело... пойду тестить
  3. TopicStarter Overlay
    tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    да. Все так и оказалось.

    Причина:
    Я получаю выборку в переменную:
    НомЛже.ВыбратьЭлементы();

    но в теле цикла, проходящего по выборке меняю родителя у некоторых папок:
    НомЛже.Родитель = "";

    таким образом система, дабы не запутаться, исключает из выборки все вложенные подпапки этой папки.

    Получить доступ к подпапкам можно только получив новую выборку, в которой учтетутся изменения:
    НомЛже.ВыбратьЭлементы();

    таким образом безобидная затея быстрого (~10 сек) испарвления превращается в дикий итерационный цикл, в зависимости от вложенности и кол-ва исправлений растягивающийся от 15сек до бесконечности... У меня в среднем он занял 14 мин. на 977 эл-тов номенклатуры с 39 итерациями выбора элементов... Но это включая подключение к базам (~30 сек)

    Можно конечно оптимизировать цикл, попробовать прорваться через дерево и его обход с листьев, но реально обработка мне понадобилась 4 раза и все :)

    Если кому такая хрень нужна - пишите. Хотя врят ли понадобится процедура, которая с помощью 8ки перелопачивает семерошные базы :)

Поделиться этой страницей