v8: Хитрости отладки Ключевые слова: отладчик, отладка, управление, точка останова, пошаговое выполнение
Те, кто хоть раз работал с отладчиком VBA, мечтают о том, чтобы и в 1С можно было изменять значения переменных и переходить на любую точку кода.
Все не обещаю, но некоторые возможности доступны с помощью косметических вмешательств в конфигурацию.
Применение этих функций основано на том, что в табло отладчика в режиме Конфигуратора или 1С:Предприятия можно вызывать доступные в контексте точки останова функции. Примеры нужно вводить в табло Ctrl+Alt+W или в окно просмотра значения выражения Shift+F9 и сразу же получать результат.
Функция ДУ
Эта функция позволяет в любой момент выполнить любой код на языке 1С над любыми данными, переданными ей.
Функция Ду(Код, П=Неопределено, П1=Неопределено, П2=Неопределено, П3=Неопределено, П4=Неопределено) Экспорт
Перем Р;
Выполнить(Код);
Возврат Р;
КонецФункции
Примеры:
= Сообщает некий текст
Ду("Сообщить(1)")
= Присваивает переменной Отказ значение истина
Ду("П=истина", Отказ)
= Закрывает форму
Ду("П.Закрыть()", ЭтаФорма)
= В отладчике нельзя вызвать процедуру, но можно это сделать через ДУ:
Ду("ЗавершитьРаботуСистемы()");
Функция Присвоить
Всем известно, что в 1С80 нельзя по хоту отладки менять значения переменных.
Однако есть выход!
В общем модуле объявите функцию:
Функция Присвоить(А,Б) Экспорт
А=Б; Возврат А;
КонецФункции
Теперь вы можете в любой момент присвоить значение переменной.
Примеры:
Присвоить(флПродолжать, ложь);
Присвоить(Остаток, ОстатокНаСкладе()-11);
Отладка в типовой конфигурации
А что же делать, если вам досталась отладка конфигурации, в которой нет этих замечательных функций?
Все очень просто. Создайте внешнюю обработку, занесите в ее модуль эти функции с ключевым словом экспорт и вызывайте их например так:
ВнешниеОбработки.Создать("C:\debug.epf").Присвоить(А, Неопределено);
Манипуляции со стеком.
Для меня было приятной неожиданностью, когда я обнаружил, что можно смотреть переменные на разных уровнях стека.
Нужно открыть окно стека (Ctrl+F3), перейти на нужны уровень и ввести в табло имя переменной.
Лучше всего это рассмотреть на примере рекурсивной функции:
Функция Тест(А)
Если А>10 Тогда
Возврат ложь;
Иначе
Возврат Тест(А+1);
КонецЕсли;
КонецФункции
Поставьте в этой функцию точку останова и вы увидите что на разных уровнях стека переменная А принимает разные значения.
Прерывание работы программы
К сожалению, в 1С 80 можно прекратить работу некоторого кода только прекратив работу всего 1С:Предприятия. Так сказать, для борьбы с головной болью нужно отрубить голову. :)
Но не все так плохо.
С помощью функции Присвоить вы можете присвоить какому-нибудь критическому объекту программы значение Неопределено или ноль и как только программа попробует получить реквизит или метод этого объекта возникнет ошибка и работа кода прекратится.
Например вы находитесь в точке:
А=1;
Если Спр.Код>А Тогда
Возврат Неопределено;
КонецЕсли;
Используйте вызов:
Присвоить(Спр,0);
Теперь, как только выполнение кода дойдет до строки с "Если", возникнет ошибка и выполнение прекратится.
Упреждающий просмотр
Иногда при отладке сложновложенных функций неизвестно, имеет ли смысл отлаживать данную конкретную функцию по шагам, или лучше выполнить ее не заходя внутрь для детальной отладки.
В таких случаях удобно посмотреть в окошке просмотра значения, какое значение возвращает данная фунцкия и если она возвращает значение, которое нам интересно, выполнить отладку.
Изменение кода на лету
Если у вас много кода выполняется в операторе Выполнить, то лучше этот код занести в некоторую переменную, чтобы при случае можно было изменить этот код. Расскажу случай из практики.
Отлаживал я как-то одну обработку по обмену данными - там было много кусков кода, выполняющихся через Выполнить. Вот беда случилась - загружали мы большой файл (многометровый) и так обидно, если грузится он час, а потом вылетает на какой-нибудь мелкой ошибке в коде, которая была не выявлена на этапе отладки, всегда в самых неожиданных местах.
Маялись мы маялись, а потом придумали - все вызовы Выполнить были вынесены в одну функцию, куда передавался код для выполнения и параметры. Это нам и сослужило хорошую службу.
Мы вставили Выполнить в Попытка-Исключение и если происходило исключение, предлагали программисту вживую изменить код. Если он соглашался, открывался диалог ввода кода, где он мог заменить старый код на новый. И перед выполнение кода мы проверяли, имеется ли он в списке замен. Если имеется, то мы перед выполнением подменяли старый код на новый. Так нам удалось быстро загрузить данные.
|