Столкнулся с такой ситуацией: Есть кусок кода внешнего отчетадля бухгалтерии 1С 7.7 допиленной (не важно)
Кл=СоздатьОбъект("Справочник.Контрагенты"); Кл.ВыбратьЭлементы(0); Пока Кл.ПолучитьЭлемент()>0 Цикл ... ... ... КонецЦикла;
Прикол в том, что при выполнении кода вылетает ошибка "не выбран элемент" на строку начала цикла. В отладчике получается, что перебор элементов справочника идет не в цикле (после выполнения метода ПолучитьЭлемент(), а при выполнении каждой строки тела цикла.
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0
"После выполнения метода "ПолучитьЭлемент()" Кл будет спозиционирован на очередно элементе. Если останов поставить на строке "Пока....", то нужно смотреть не значение Кл, а вычислять Кл.ПолучитьЭлемент() или Кл.ТекущийЭлемент() в следующей строке.
Останов на "Пока". Кл.Наименование показывает первую запись. Пошаговое прохождение цикла меняет Кл.Наименование (Кл.ТекущийЭлемент()) после каждого шага в цикле, а не после его завершения (начала).
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0
При первом останове Кл будет не выбран( останов в строке = останов до выполнения строки), при всех последующих в Кл будет храниться элемент, выбранный в предыдущей итерации ... если тело цикла написано, так скажем, не совсем корректно если же оно написано правильно, то во избежание непоняток Кл перед новой итерацией будет очищаться. Смысл очистки - реакция на неудачное позиционирование.
Кл=СоздатьОбъект("Справочник.Контрагенты"); Кл.ВыбратьЭлементы(0); Пока Кл.ПолучитьЭлемент()>0 Цикл Пар1=1; Сообщить(Кл.ТекущийЭлемент); КонецЦикла;
При выполнении будет простой перебор с выводом контрагента в порядке наименования. В отладчике при пошаговом проходе контрагенты будут пропускаться, перепрыгивать.
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0
А здесь уже, похоже, другой(давно известный) глюк - не успевает. Предлагаю в развитие эксперимента в начало цикла воткнуть замедлитель - пусть подождет полсекунды(или посчитает там до 10 000).
Может и неправильно, но для того чтоб поставить точку останова на начало цикла, открыть табло и ввести переменную или функцию, а потом пошагово выполнять код и смотреть значение переменных не надо снимать целое видео...
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
чудес на этом свете нет. ну или почти нет. так что авторство "глюка" принадлежит скорее всего автору топика. Даю наводку: в Отладчике выражения Табло (Меню>Отладка>Табло или кнопарь соответвующимй на панели) - вычисляются каждый раз при получении управления Отладчиком. Отладчик получает управление при прерывании на точке прерывания, или (sic!) при завершении каждого шага (F8,F10,F7,etc.). И если у тебя там "нечаянно" стоит прямое вычисление "Кл.ПолучитьЭлемент()" - или непрямое, с вычислением значения какой-нибудь функции, которая выполняет "нечаянно" подобный переход на следующий элемент выборки - то так оно и выглядит.
Сообщение отредактировал Cthulhu - 14.12.12, 18:37
Чудес не бывает, но кто-то хоть попытался повторить код из поста №5? Там всего пять строк, прямое вычисление стоит в начале цикла и больше нигде. Повтрю код, скопируйте и пройдите отладчиком.
Кл=СоздатьОбъект("Справочник.Контрагенты"); Кл.ВыбратьЭлементы(0); Пока Кл.ПолучитьЭлемент()>0 Цикл Пар1=1; Сообщить(Кл.ТекущийЭлемент()); КонецЦикла;
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
Цитата(Pepe @ 14.12.12, 19:06)
Чудес не бывает, но кто-то хоть попытался повторить код из поста №5? Там всего пять строк, прямое вычисление стоит в начале цикла и больше нигде. Повтрю код, скопируйте и пройдите отладчиком.
Кл=СоздатьОбъект("Справочник.Контрагенты"); Кл.ВыбратьЭлементы(0); Пока Кл.ПолучитьЭлемент()>0 Цикл Пар1=1; Сообщить(Кл.ТекущийЭлемент()); КонецЦикла;
кхм... к коду как раз никаких вопросов (он прозрачный и в проверке не нуждается). вопросы - к содержимому табло Отладчика (если, конечно, процитированный код - именно таков). об чом и сказано (и даже, вроде, разжевано). пошаговое выполнение с единственным(!!!) вычисляемым в табло выражением "Кл.ТекущийЭлемент()" (без кавычек) - "пострадавшим от глюков" опробовано? и каковы результаты?
Сообщение отредактировал Cthulhu - 14.12.12, 19:20
Про порядок вывода я написал т.к. вывод по умолчанию идет именно в таком порядке, а если надо, допишите лишнююстрочку чтоб глаза радовал другой порядок. На выполнение это не влияет. Вот пошаговое прохождение
Сообщение отредактировал Vofka - 14.12.12, 21:14
Причина редактирования: Картинки вставляем не ссылками
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!