Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюк или ...
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Pepe
Столкнулся с такой ситуацией:
Есть кусок кода внешнего отчетадля бухгалтерии 1С 7.7 допиленной (не важно)
Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
...
...
...
КонецЦикла;

Прикол в том, что при выполнении кода вылетает ошибка "не выбран элемент" на строку начала цикла. В отладчике получается, что перебор элементов справочника идет не в цикле (после выполнения метода ПолучитьЭлемент(), а при выполнении каждой строки тела цикла.
Zaval
"После выполнения метода "ПолучитьЭлемент()" Кл будет спозиционирован на очередно элементе.
Если останов поставить на строке "Пока....", то нужно смотреть не значение Кл, а вычислять Кл.ПолучитьЭлемент() или Кл.ТекущийЭлемент() в следующей строке.
Pepe
Останов на "Пока".
Кл.Наименование показывает первую запись. Пошаговое прохождение цикла меняет Кл.Наименование (Кл.ТекущийЭлемент()) после каждого шага в цикле, а не после его завершения (начала).
Zaval
При первом останове Кл будет не выбран( останов в строке = останов до выполнения строки), при всех последующих в Кл будет храниться элемент, выбранный в предыдущей итерации ... если тело цикла написано, так скажем, не совсем корректно smile.gif если же оно написано правильно, то во избежание непоняток Кл перед новой итерацией будет очищаться.
Смысл очистки - реакция на неудачное позиционирование.
Pepe
Для понимания доделал код
Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
    Пар1=1;
   Сообщить(Кл.ТекущийЭлемент);
КонецЦикла;

При выполнении будет простой перебор с выводом контрагента в порядке наименования. В отладчике при пошаговом проходе контрагенты будут пропускаться, перепрыгивать.
Zaval
А здесь уже, похоже, другой(давно известный) глюк - не успевает.
Предлагаю в развитие эксперимента в начало цикла воткнуть замедлитель - пусть подождет полсекунды(или посчитает там до 10 000). smile.gif
Ardi
Цитата(Zaval @ 14.12.12, 14:35) необходимо зарегистрироваться для просмотра ссылки
А здесь уже, похоже, другой(давно известный) глюк - не успевает.

Отладчик же медленнее работает и в отладчике наоборот должно успевать.
Pepe
В отладчике на каждый "Ентер" или щелчек мыши происходит шаг по справочнику, наверняка замедлитель ни при чем.
Ardi
Pepe
Видео давайти.
Zaval
В Отладчике при останове в первой строке тела цикла(Пар1...) никаких пропусков быть не должно
Pepe
Можно и видео, а проще самому скопировать в форму код и в отладчике посмотреть.
Ardi
Цитата(Pepe @ 14.12.12, 16:34) необходимо зарегистрироваться для просмотра ссылки
Можно и видео, а проще самому скопировать в форму код и в отладчике посмотреть.

Не проще. Просто кто-то неправильно отладчиком пользуется. Вот и глюки.
Pepe
Цитата(Ardi)
Просто кто-то неправильно отладчиком пользуется.
Может и неправильно, но для того чтоб поставить точку останова на начало цикла, открыть табло и ввести переменную или функцию, а потом пошагово выполнять код и смотреть значение переменных не надо снимать целое видео...
Ardi
Признайтесь, во сколько мест вы засунули "Кл.ПолучитьЭлемент()"
Cthulhu
чудес на этом свете нет. ну или почти нет. так что авторство "глюка" принадлежит скорее всего автору топика.
Даю наводку: в Отладчике выражения Табло (Меню>Отладка>Табло или кнопарь соответвующимй на панели) - вычисляются каждый раз при получении управления Отладчиком. Отладчик получает управление при прерывании на точке прерывания, или (sic!) при завершении каждого шага (F8,F10,F7,etc.). И если у тебя там "нечаянно" стоит прямое вычисление "Кл.ПолучитьЭлемент()" - или непрямое, с вычислением значения какой-нибудь функции, которая выполняет "нечаянно" подобный переход на следующий элемент выборки - то так оно и выглядит.
Pepe
Чудес не бывает, но кто-то хоть попытался повторить код из поста №5? Там всего пять строк, прямое вычисление стоит в начале цикла и больше нигде. Повтрю код, скопируйте и пройдите отладчиком.
Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
    Пар1=1;
   Сообщить(Кл.ТекущийЭлемент());
КонецЦикла;
Ardi
x
Cthulhu
Цитата(Pepe @ 14.12.12, 19:06) необходимо зарегистрироваться для просмотра ссылки
Чудес не бывает, но кто-то хоть попытался повторить код из поста №5? Там всего пять строк, прямое вычисление стоит в начале цикла и больше нигде. Повтрю код, скопируйте и пройдите отладчиком.
Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
    Пар1=1;
   Сообщить(Кл.ТекущийЭлемент());
КонецЦикла;

кхм... к коду как раз никаких вопросов (он прозрачный и в проверке не нуждается). вопросы - к содержимому табло Отладчика (если, конечно, процитированный код - именно таков). об чом и сказано (и даже, вроде, разжевано).
пошаговое выполнение с единственным(!!!) вычисляемым в табло выражением "Кл.ТекущийЭлемент()" (без кавычек) - "пострадавшим от глюков" опробовано? и каковы результаты?
Ardi
Да, и чтобы
Цитата
При выполнении будет простой перебор с выводом контрагента в порядке наименования.

нужна ещё одна строка которая отсутствует.
Pepe
Про порядок вывода я написал т.к. вывод по умолчанию идет именно в таком порядке, а если надо, допишите лишнююстрочку чтоб глаза радовал другой порядок. На выполнение это не влияет.
Вот пошаговое прохождение



Ardi
Из .лять нижнего .лять окошка .лять убрать .лять Кл.ПолучитьЭлемент() .лять
Pepe
Цитата(Cthulhu)
пошаговое выполнение с единственным(!!!) вычисляемым в табло выражением "Кл.ТекущийЭлемент()"

В этом и причина. Дело в том, что в табло присутствует строка "Кл.ПолучитьЭлемент() - она и срабатывала при останове.
Глюк у пострадавшего от глюка. Всем спасибо.
Cthulhu
Цитата(Ardi @ 14.12.12, 20:28) необходимо зарегистрироваться для просмотра ссылки
Из .лять нижнего .лять окошка ...

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