Версия для печати темы (https://pro1c.org.ua/index.php?s=bd352246c282d228f918bbbabcb2669f&showtopic=10202)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Глюк или ...

Автор: Pepe 13.12.12, 20:32

Столкнулся с такой ситуацией:
Есть кусок кода внешнего отчетадля бухгалтерии 1С 7.7 допиленной (не важно)

Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
...
...
...
КонецЦикла;

Прикол в том, что при выполнении кода вылетает ошибка "не выбран элемент" на строку начала цикла. В отладчике получается, что перебор элементов справочника идет не в цикле (после выполнения метода ПолучитьЭлемент(), а при выполнении каждой строки тела цикла.

Автор: Zaval 13.12.12, 20:56

"После выполнения метода "ПолучитьЭлемент()" Кл будет спозиционирован на очередно элементе.
Если останов поставить на строке "Пока....", то нужно смотреть не значение Кл, а вычислять Кл.ПолучитьЭлемент() или Кл.ТекущийЭлемент() в следующей строке.

Автор: Pepe 13.12.12, 21:14

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

Автор: Zaval 13.12.12, 21:42

При первом останове Кл будет не выбран( останов в строке = останов до выполнения строки), при всех последующих в Кл будет храниться элемент, выбранный в предыдущей итерации ... если тело цикла написано, так скажем, не совсем корректно smile.gif если же оно написано правильно, то во избежание непоняток Кл перед новой итерацией будет очищаться.
Смысл очистки - реакция на неудачное позиционирование.

Автор: Pepe 14.12.12, 11:05

Для понимания доделал код

Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
    Пар1=1;
   Сообщить(Кл.ТекущийЭлемент);
КонецЦикла;

При выполнении будет простой перебор с выводом контрагента в порядке наименования. В отладчике при пошаговом проходе контрагенты будут пропускаться, перепрыгивать.

Автор: Zaval 14.12.12, 13:35

А здесь уже, похоже, другой(давно известный) глюк - не успевает.
Предлагаю в развитие эксперимента в начало цикла воткнуть замедлитель - пусть подождет полсекунды(или посчитает там до 10 000). smile.gif

Автор: Ardi 14.12.12, 13:40

Цитата(Zaval @ 14.12.12, 14:35) *
А здесь уже, похоже, другой(давно известный) глюк - не успевает.

Отладчик же медленнее работает и в отладчике наоборот должно успевать.

Автор: Pepe 14.12.12, 13:56

В отладчике на каждый "Ентер" или щелчек мыши происходит шаг по справочнику, наверняка замедлитель ни при чем.

Автор: Ardi 14.12.12, 14:10

Pepe
Видео давайти.

Автор: Zaval 14.12.12, 14:37

В Отладчике при останове в первой строке тела цикла(Пар1...) никаких пропусков быть не должно

Автор: Pepe 14.12.12, 15:34

Можно и видео, а проще самому скопировать в форму код и в отладчике посмотреть.

Автор: Ardi 14.12.12, 16:57

Цитата(Pepe @ 14.12.12, 16:34) *
Можно и видео, а проще самому скопировать в форму код и в отладчике посмотреть.

Не проще. Просто кто-то неправильно отладчиком пользуется. Вот и глюки.

Автор: Pepe 14.12.12, 17:26

Цитата(Ardi)
Просто кто-то неправильно отладчиком пользуется.
Может и неправильно, но для того чтоб поставить точку останова на начало цикла, открыть табло и ввести переменную или функцию, а потом пошагово выполнять код и смотреть значение переменных не надо снимать целое видео...

Автор: Ardi 14.12.12, 18:06

Признайтесь, во сколько мест вы засунули "Кл.ПолучитьЭлемент()"

Автор: Cthulhu 14.12.12, 18:35

чудес на этом свете нет. ну или почти нет. так что авторство "глюка" принадлежит скорее всего автору топика.
Даю наводку: в Отладчике выражения Табло (Меню>Отладка>Табло или кнопарь соответвующимй на панели) - вычисляются каждый раз при получении управления Отладчиком. Отладчик получает управление при прерывании на точке прерывания, или (sic!) при завершении каждого шага (F8,F10,F7,etc.). И если у тебя там "нечаянно" стоит прямое вычисление "Кл.ПолучитьЭлемент()" - или непрямое, с вычислением значения какой-нибудь функции, которая выполняет "нечаянно" подобный переход на следующий элемент выборки - то так оно и выглядит.

Автор: Pepe 14.12.12, 19:06

Чудес не бывает, но кто-то хоть попытался повторить код из поста №5? Там всего пять строк, прямое вычисление стоит в начале цикла и больше нигде. Повтрю код, скопируйте и пройдите отладчиком.

Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
    Пар1=1;
   Сообщить(Кл.ТекущийЭлемент());
КонецЦикла;

Автор: Ardi 14.12.12, 19:12

x

Автор: Cthulhu 14.12.12, 19:19

Цитата(Pepe @ 14.12.12, 19:06) *
Чудес не бывает, но кто-то хоть попытался повторить код из поста №5? Там всего пять строк, прямое вычисление стоит в начале цикла и больше нигде. Повтрю код, скопируйте и пройдите отладчиком.
Кл=СоздатьОбъект("Справочник.Контрагенты");
Кл.ВыбратьЭлементы(0);
Пока Кл.ПолучитьЭлемент()>0 Цикл
    Пар1=1;
   Сообщить(Кл.ТекущийЭлемент());
КонецЦикла;

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

Автор: Ardi 14.12.12, 19:25

Да, и чтобы

Цитата
При выполнении будет простой перебор с выводом контрагента в порядке наименования.

нужна ещё одна строка которая отсутствует.

Автор: Pepe 14.12.12, 19:59

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




Автор: Ardi 14.12.12, 20:28

Из .лять нижнего .лять окошка .лять убрать .лять Кл.ПолучитьЭлемент() .лять

Автор: Pepe 14.12.12, 20:31

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

В этом и причина. Дело в том, что в табло присутствует строка "Кл.ПолучитьЭлемент() - она и срабатывала при останове.
Глюк у пострадавшего от глюка. Всем спасибо.

Автор: Cthulhu 14.12.12, 21:24

Цитата(Ardi @ 14.12.12, 20:28) *
Из .лять нижнего .лять окошка ...

отдельное спасибо за сурдоперевод.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua