1с получить стек вызовов программно
Делюсь интересным приёмом, позволяющим использовать данные стека исполнения кода 1С в качестве условия, накладываемого на выполнение кода.
Опасный прием. Но в плане быстрой и компактной модификации кода поставщика действительно может быть оправдано. Если уж применять, то надо
1. Обязательно проверять минимальную версию платформы
2. На большой глубине стека избегать применения в частотном коде, т.к. затраты на сборку полной строки стека могут стать заметными.
Deslime; ardn; GreenDragon; bulpi; Quasar; Dach; awk; Plotks2017; triviumfan; lmnlmn; dmryzhkov; sapervodichka; + 12 – Ответить
vld_dmn; Monte Carlo; GreenDragon; dabu-dabu; zqzq; webester; Brawler; vladimirmatancev; Dach; Quasar; IgorS; Yashazz; denmax; Артано; maksa2005; BaphoBush; + 16 – 4 Ответить
И мне так кажется, что это костылина, с первого взгляда. Выгладит как граница с вороватым таможенником - "эээээ, братъ, прхди, дорогой! А ты стой тут, ты пришел не с нашего района".
Интересен диаметр глаз кодера, который потом наткнется на этот код, когда будет разбирать ситуацию с тем что "восстановление последовательности зафигачило" закрытие пятилетней давности.
Стек вызово это ИМХО аналитический инструмент.
(2) Вадим, привет, а со второго взгляда - тут прежде всего идея, о том как подтянуть дополнительные аналитики из стека исполнения кода. Не многие знают, что можно получить путь всех вызовов и использовать для анализа в самом коде. Например, есть задача починить в течение пары часов до обеда, а после обеда уже пользователи сдают результат руководству, или выплачивают зарплату в банк. Тут никто не думает о костыльности, а думает как сделать здесь и сейчас, и дополнительное знание такого варианта окажется возможной палочкой выручалочкой.
(6) Вот именно из "починить за пару часов до обеда" и "ну всё ж работает, результат есть" и рождаются самые жуткие, самые опасные и самые впоследствии тяжело исправляемые костыли. Сам подход опасен.
Не расширения воротить надо по каждому поводу, а просто внимательно и вдумчиво отлаживаться.
(10) Яков, я вот уверен, что половина даже не въехала в суть. Увидели знакомые слова Попытка Исключение и давай костылями махать. Яж не дурака тут пишу. НЕ В ОТЛАДКЕ ДЕЛО! Дело в возможности затащить стек исполнения в программируемый алгоритм.
(13) Я-то понял. Я именно про подход и что половина не въедет, а костылями махать начнёт. Возможность хитренькая и скользкая, с весьма узкими рамками применения, и при поверхностном чтении производит опасно-обманчивое впечатление.
Никогда ваши публикации не считал "дурака пишу", наоборот, они дельные, толковые и грамотные. Но конкретна эта - провокационна.
(21) как brr ниже написал, что будет совсем хорошо когда 1С вставит получение стека исполнения без вызова исключения
Извните, но это будет палочкой нафигвселомалочкой через полгода, когда все "срочные" отчеты уже сданы и забыты. А вот сейчас надо опять что-то сдать/заплатить.
Не надо апеллировать тем что это "временное" решенение, мы все знакомы с законом синей изоленты ;)
(19) Вадим, ты забей, пожалуйста про исправление ошибки, ну вот не важно оно тут. Важен принцип, что можно текст ошибки со стеком получить и проанализировать самим же кодом.
(1) костыль это если в руках инвалида, а если в руках норм разраба, то это, конечно, не затычка для каждой дырки, а инструмент, который по делу, где нужно можно грамотно задействовать (лишь бы принцип был известен! а принцип я тут изложил, а в других публикациях я такой техники не встречал, так что ноги можно в другом месте о коврик обтирать, а тут подчерпнуть знаний)
(5) как много лишних эмоций. хорошо, разверну ответ: допустим модуль A вызывает модуль B, а он в свою очередь модуль C. так вот в модуле C падает exception, и анализатор ошибки ищет модуль A в стеке вызовов. И внезапно модуль A переименовали, логика поменялась, а разраб, даже опытный забыл про этот костыль. В итоге система ломается, так как не соблюдается принцип инкапсуляции кода, насколько он возможен в 1C
(8) ты всё правильно пишешь, как и многие другие доработки, эта может перестать работать (это жизнь от обновления к обновлению). Но посыл данной статьи другой, о возможности применить данные стека вызова в условиях в коде (она есть).
Опасный прием. Но в плане быстрой и компактной модификации кода поставщика действительно может быть оправдано. Если уж применять, то надо
1. Обязательно проверять минимальную версию платформы
2. На большой глубине стека избегать применения в частотном коде, т.к. затраты на сборку полной строки стека могут стать заметными.
Deslime; ardn; GreenDragon; bulpi; Quasar; Dach; awk; Plotks2017; triviumfan; lmnlmn; dmryzhkov; sapervodichka; + 12 – Ответить
(31) интересная позиция, тогда по твоей логике любой код завтра работать не будет, согласен? (1С постоянно всё меняет, а мы допиливаем и получаем зарплату)
(32) я с позиции специфики нашей работы (тут код стабилен как и любая другая доработка. до очередного обновления релиза), доработка тут нормальная, не говнокод написанный из корыстных целей, а затем его поддержки. Не "а ля снимаем колеса и он наш"
(32)
1. как выше писали это костыли и притом неявные, другой разработчик не будет подозревать, что система так себя может вести
2. нельзя надеяться на то что и завтра "ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж" будет так же называться
3. нельзя надеяться на то что формируемая строка в ПодробноеПредставлениеОшибки будет такого же формата, да и к тому же думаю она там малость и на разных языках может формироваться
я в своей практике стараюсь не опираться на жиденькие конструкции
а в последнее время блин превратился в бесплатного дебаггера ERP. писец качество продукта под номером 2.4.12.75 . пока пытаешься воспроизвести одну ошибку, по пути еще пару находишь
Вот сегодня новая встретилась в заказе клиента, Онлайн взаиморасчеты.
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
: Объект.Движения.Записать();
: ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
: НаборЗаписей.Записать();
: ВернутьДокументыКОтражению(МенеджерВременныхТаблиц);
: РеглУчетПроведениеСервер.ЗарегистрироватьДокументыРасчетовСПартнерамиКОтражениюВРеглУ чете(ТаблицаИзменений);
: ЗаполнитьОперативныеВзаиморасчеты(ОсновныеПараметры);
: ОперативныеВзаиморасчетыСервер.РассчитатьПоИзменениям(Запрос.МенеджерВременныхТаблиц, Истина, Отбор.Регистратор.Значение, ДополнительныеСвойства);
: Объект.Движения.Записать();
: ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
(34) Я тут не писькой меряюсь, а пишу О ВОЗМОЖНОСТИ ОНЛАЙН ПОЛУЧАТЬ КОДОМ СТЭК ВЫЗОВОВ И КОДОМ ЖЕ ОНЛАЙН АНАЛИЗИРОВАТЬ. Повторю, что костыли у инвалидов (если "другой разработчик не будет подозревать, что система так себя может вести", значит он не умеет читать код и он не разработчик, а инвалид). И согласен с тобой, что "нельзя надеятся на завтра" т.к. большая часть твоего кода из ERP 2.4 не будет в ERP 2.5 работать.
(36) те кто пишет, что это костыль, просто почитали и не поняли. Почитай комменты 98% альтернативного решения определить на лету место вызова в коде не могут предложить, только со стула могут пЁрнуть
(31) Ну про то, что нужно сделать опознание формата вывода стека, я думал итак понятно хорошему программисту. При изменении формата нужно выбрасывать исключение. К тому же этот формат меняться не будет с большой вероятностью навсегда (в пользу этого говорит история платформы 1С). Из-за очень низкой вероятности этого изменения, этим уже можно и пренебречь в частных случаях, для которых предлагается этот прием.
(3) Не согласен. Объем усилий по ограждению этого фрагмента сигнальными флажками типа "Осторожно мины" сопоставим с конвенционными методами исправления. Такой подход может иметь место максимум для понимания где именно причина проблемы, то есть как часть отладки в процессе разработки.
Выпускать в релиз такое решение без соответствующей изоляции и документирования чреват более серьезными проблемами, особенно в условиях коллективной разработки.
Такой подход может иметь место максимум для понимания где именно причина проблемы, то есть как часть отладки в процессе разработки
А этого более чем достаточно (именно для этого и используется стек вызовов). Автор красавчик.
(3) Еще в обычном приложении стек до сих пор не формируется в описании ошибки (проверено на 8.3.18). Так что и здесь могут возникнуть отличия.
Вполне годно для ограниченного применения - в рамках конкретной задачи в конкретной организации.
Масштабировать такие решения, наверное, будет не совсем правильно. А, в связи с этим, и проверять минимальную версию платформы не обязательно - вероятность отката платформы для продуктовых баз невелика.
Присоединяюсь к вышесказанному. В данном случае - почти годно. Надо только понимать - что обработка исключений - дело затратное по-производительности - и всюду вставлять вставки как на первом скриншоте (т.е. специально генерируя исключение, чтобы получить стек вызова) - может дать сильное проседание производительности - так что это скорее уж очень специальный приём - не для всех! Другое дело - когда (как далее по тексту) исключение и так уже создаётся - тогда да - данный финт можно применить.
Но. надо понимать, что 1С постоянно тусует код типовых конфигураций - от чего названия модулей и процедур может меняться (полный путь) - а тут как раз идёт его анализ. Это не есть хорошо! Поэтому - тут тогда лучше делать всегда конкретные условия на ветки ветвления - без секции "Иначе" - вернее с ней - в неё должна быть генерация исключения - что ветка условия Вышла за границы условия и программисту нужно его пересмотреть!
Ну а я, всё-таки за то, чтобы передавать доп параметры через внешние переменные (обычно - параметры сеанса для управляемых приложений). Это куда надёжнее - заводишь такую переменную (параметр сеанса) типа "Соответствие"("ФиксированноеСоотвествие"), парой общих функций помещаешь и извлекаешь оттуда доп параметры для конкретной вложенной функции (по её имени, аргументу, и, возможно, дополнительной текстовой пометке-ограничению).
А вообще - для решения таких задач есть АОП - жаль в 1С его нет (хотя сами расширения - вообще-то это уже АОП - вот только очень ограниченный) - не хватает в 1С продвинутого АОП, очень не хватает.
Ну а данной статье очень не хватает приложения како-нибудь функции алгоритма - для продвинутого и чёткого разбора текста стека - а то как-то использовать функцию "Найти" по месту вызова - совсем не кошерно!
Здравствуйте! Подскажите, кто, что знает, по данной теме? Интересует последовательность выполнения всех процедур и функций, например, в модуле формы какой-либо обработки. Знаю что есть стек вызовов, но он не поможет, т.к. он показывает предшествующие процедуры из которых вызывалась текущая, а надо посмотреть какие процедуры вообще выполнялись, или чтоб была возможность пройтись по ним всем отладчиком по порядку. Единственный вариант какой знаю - это наставить во всех процедурах точек останова - но это очень долго и трудоемко, особенно в больших модулях. Может знает кто более изящный способ?
Не совсем понятно зачем это нужно. Можно например в каждой процедуре вызывать свою процедуру и передавать ей параметр Имя процедуры, а в процедуре писать в регистр или во внешний файл стек всех вызовов.
Насколько мне известно, "из коробки" такой возможности нет даже в более "взрослых" средах разработки, не говоря об 1С.
(3) Gulf_Stream,
В древнем клиппере, например, была трассировка.
Пользительность такая: не надо непрерывно жать на кнопку. Программа не спеша пробегает построчно модуль, заходя во все процедуры и, естественно, тут же отображает стек вызовов. В любой момент процедуру можно приостановить, возобновить.
Не совсем понятно зачем это нужно.
Это нужно для того чтоб быстро понять как выполняется тот или иной модуль, например в УПП при открытии конструктора спецификаций, запускается не только процедура "ПриОткрытии", но и срабатывает куча событий, типа "СписокНоменклатураОтдельныйПриАктивизацииСтроки", и многие другие.
Так вот чтоб разобраться что реально происходит в тот или иной промежуток времени, без трассировщика никак.
Я понимаю, что все последовательности описаны в документации, но процедур и объектов очень много, и что за чем выполняется, довольно сложно уследить в комплексе.
. Можно например в каждой процедуре вызывать свою процедуру.
То о чем вы тут пишете успешно решается стеком вызовов, но в данной задаче это не пойдет, нужен вариант без доделки, а то если в модуле полсотни процедур - то в каждую чтоли писать?! Тогда уж проще точек останова натыкать.
Немного теории Стек вызовов - это инструмент, который показывает последовательность процедур и функций, исполнение которых привело к той строке модуля, что отлаживается сейчас. Стек большинство разработчиков используют при отладке исполнения кода. Также многие заметили, что начиная с платформы 8.3.15 в Журнал регистрации базы 1С и в операторе "Попытка . Исключение . КонецПопытки" возможно увидеть полный стек вызовов всех процедур, а не только вызов последней строки как было раньше (и this is хорошо).
Для начала расскажу как первый раз применил получение и разбор стека исполнения самим кодом 1С. В конец дам общий принцип по применению на практике.
Возникла проблема: При закрытии месяца в 1С: ERP, при выполнении операции "Формирование записей книг покупок и продаж" произошла ошибка: Операцию не удалось выполнить по причине того, что Отражение документов в регл учете невозможно поместить в запрещенный период. Дате 01.06.2019 соответствует запрет изменения данных для пользователя "Администратор (Михаил)" по 31.05.2020 (установлена общая дата запрета)
Сформировалась задача, которую нужно было быстро сделать: Не нужно применять контроль даты запрета в случае выполнения операции "Формирование записей книг покупок и продаж" при закрытии месяца.
Приступив к решению задачи:
При выполнении операции "Формирование записей книг покупок и продаж" произошла ошибка:
Не удалось выполнить по причине Отражение документов в регл учете невозможно поместить в запрещенный период.
Дате 01.06.2019 соответствует запрет изменения данных для пользователя "ГлавныйБухгалтерЗаместитель" по 29.02.2020 (установлена общая дата запрета)
: ВызватьИсключение ОписаниеОшибки;
: ПроверитьДатуЗапретаДляОтраженияДокументовВРеглУчете(ШаблонЗапретаДанных);
: РеглУчетПроведениеСервер.ВернутьДокументыКОтражению(ПараметрыРасчета.МенеджерВременныхТаблиц);
: ВернутьДокументыКОтражениюВУчете(ПараметрыРасчета);
: ВыполнитьРасчет(ПараметрыРасчета);
: ВыполнитьРасчетСЗамеромВремени(ПараметрыРасчета);
: УчетНДСУПСлужебный.СформироватьЗаписиКнигиПокупокПродаж(КонецПериода, МассивОрганизаций, МассивСчетовФактур);
: УчетНДСУП.ВыполнитьЗаданияПоФормированиюКнигиПокупокПродаж(
:ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж(Параметры[0])
: Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
: ОбщегоНазначения.ВыполнитьМетодКонфигурации(
:Обработки.ОперацииЗакрытияМесяца.ВыполнитьРасчетЭтапов(Параметры[0])
: Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
Открыл в конфигураторе ОбщийМодуль.РеглУчетПроведениеСервер строку № 3509 с текстом ВызватьИсключение ОписаниеОшибки;
Вижу, что процедура обща я (вызывается для разных ситуаций), на первый взгляд нет никакого признака показывающего, что вызов идет из обработки закрытия месяца.
- В поисках решения сразу пришли мысли: протянуть из обработки закрытия какой-нибудь параметр функции или сделать некий глобальный признак. Стал смотреть стек вызовов всех процедур (см. выше блок "Текст ошибки со стеком вызова")
и тут загорается лампочка!
Можно ведь по тексту стека вызовов понять, что вызов идёт из закрытия месяца!
- Нашёл, как получить стек вызовов в коде. Строку с данными стека вызовов можно получить только следующей комбинацией ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()). Причем отдельно в ИнформацияОбОшибке() данных о стеке не содержится, она загадочным образом достается только функцией ПодробноеПредставлениеОшибки().
- Далее создал расширение конфигурации, в которое перетащил процедуру &Вместо("ПроверитьДатуЗапретаДляОтраженияДокументовВРеглУчете") из ОбщийМодуль.РеглУчетПроведениеСервер . Описал условие Если [. ] Тогда , где поиском выражений-маркеров в полном тексте ошибки понимаю, что идёт вызов этапа формирования книг из обработки закрытия месяца и не применяю контроль даты запрета.
Разбор стека самим кодом помог определять откуда пользователь стартует вызов, чтобы снять типовое ограничение в общем методе.
Какой могу сделать вывод в заключение:
Используя инъекцию конструкции (см. ниже) в код конфигурации (напрямую или через расширение) можно дополнительно анализировать данные стека вызовов. Возможность, которая немного расширяет горизонты разработки условий.
Коллеги, все знают о том, что попытки исключения - это затратный по времени механизм его нужно применять с осторожностью, это не панацея, я лично против него.
Основная мысль заложенная в данную публикацию это ИДЕЯ как вытащить дерево стека в сам исполняемый код, идея которую можно положить себе в ячейку памяти. Возможно она пригодиться!
На практике такой приём позволяет зашить часть возможностей отладки в СВОЙ КОД 1С, чтобы он получал и анализировал дерево стека и направлял алгоритм в разные ветки, в зависимости от наличия в тексте стека вызова определенных процедур (выражений-маркеров).
Обработка выгрузки и загрузки данных через XML между идентичными конфигурациями с возможностью установки произвольных отборов на выгружаемые объекты.
Подключаемый отчет на системе компоновки данных по типам объектов 1С показывает: 1) Совокупности таблиц SQL для хранения объекта 1С и их предназначение; 2) Число объектов данного типа; 3) Размеры хранения данных и индексов в MB (мегабайтах); 4) Сравнение данных двух баз
Предназначается для запуска сеанса другого пользователя из своего сеанса 1С (если пароль вам неизвестен).
Если пользователю не хватает прав на объект, то на практике в 90 % случаев, недостающую роль можно найти через типовой регистр сведений Права ролей. Также с помощью дополнительного отчета или небольшого расширения можно ускорить описанный процесс.
Онлайн диаграмма доступных лицензий 1С и показателей ресурсов сервера 1С в различных измерениях и отборах.
Обработка ищет все объекты базы, в которых одновременно присутствуют перечисленные элементы. Построена на базе типовой обработки Все функции - Стандартные - Поиск ссылок на объект, но позволяет накладывать отбор не по одному объекту, а по нескольким, что позволяет настраивать поиск по комбинациям условий
Часто не хватает визуализации хронологии документов в структуре подчиненности и кнопок проведения. Это расширение конфигурации, с функционалом структуры подчиненности документов, отображающее хронологическую последовательность документов во времени и дающее доступ к проведению, отмене проведения, пометке на удаление документов непосредственно в форме подчиненности.
Обработка для массовой проверки доработок конфигурации: Открытие форм, Печать, Формирование отчетов, Проведение документов, Запись справочников, ПВХ, ПВР. Выдает список обнаруженных ошибок. Рекомендуется применять для тестирования обновленной конфигурации, перед установкой пользователям. В коде используются универсальные методы поэтому подходит для большинства конфигураций, построенных на базе библиотеки стандартных подсистем.
Групповая обработка ссылок вида Объект не найден (502:37855254002e11eb11e73b8f36150d9e) заполняется максимально просто копированием и вставкой из буфера: 1) Выделяет уникальные идентификаторы (далее УИ); 2) Ищет ссылки на объекты базы по УИ; 3) Создаёт пустые объекты с указанным УИ; 4) Регистрирует найденные ссылки для обмена данными. Работает на любых продуктах 8.3
Обработка на управляемых формах для работы с календарями google, событиями календарей и контактами.
Обработка проверяет наличие и решает проблему с ошибкой развернутого сальдо в Оборотно-сальдовой ведомости (регистр бухгалтерии Хозрасчетный) из-за ошибки Универсального редактора реквизитов или кода программиста, устанавливающего пустые ссылки в значениях Валюты, Подразделения, Направления деятельности не равными NULL. И пересчёт итогов тут точно не поможет.
Выполнил 3 разных теста для проверки серверного оборудования (тест 1С, тесты gilev) на возможное число 1С онлайн-пользователей одновременно работающих на нем и интерпретировал результаты тестов через легких, средних и тяжелых пользователей с помощью таблицы с профилями реальных пользователей.
Перед началом проекта требуется определить параметры серверного и клиентского оборудования, необходимые для работы внедряемой программы 1С:Предприятие, и учесть будущую нагрузку, которая ляжет на систему в реальной рабочей обстановке. Мощность оборудования должна быть достаточной для нормальной работы пользователей. Но как подобрать сервер простым способом?
На время сеанса отключаем контроль остатков и проверку документов в ERP, КА, УТ типовыми средствами и простым расширением.
Часто при моделировании примеров бизнес-процессов, на запуске в эксплуатацию или закрытии требуется несколько раз прогнать ситуацию с разными настройками, а для этого изменить, удалить ранее введенную цепочку документов. Дается все это с трудом. Ты уверен, что не навредишь своими действиями системе, но документы цепляют друг друга и ругаются контролями остатков, не разрешая тебе менять их в произвольном порядке.
Есть несколько удобных опций для облегчения внесения изменений.
Для уведомления пользователей программных продуктов 1С о разных событиях, в них включена подсистема «Новостной центр». Это довольно удобная штука, т.к. новостные ленты сообщают о выходе обновлений, о новостях и событиях в сфере учёта. Но можно увеличить пользу от новостной подсистемы используя её локально в рамках 1С базы. Например, внутренняя служба техподдержки или внедряющая компания может через новостную ленту оповещать пользователей информационной базы об изменениях в программе, совещаниях, проведении тестирований, заполнения нужных документов или сдача отчетов к определенной дате и т.п.
Пример технического задания для практического понимания основных разделов.
Кратко описаны основополагающие моменты при старте групповой разработки конфигурации несколькими программистами. Полезно для проектной документации как требование к разработчикам или сопровождающей компании
Ссылка на компетенции по 1С:ERP - команда со знаниями, умениями и успешными проектами.
Отладчик является встроенным в конфигуратор инструментом. Он помогает отлаживать программные модули, создаваемые в процессе разработки прикладного решения. Отладчик позволяет отслеживать последовательность выполнения операторов встроенного языка и просматривать значения переменных.
Основные возможности отладки
Точки останова
Отладчик позволяет установить на конкретную строку модуля специальный маркер — точку останова, — при достижении которой исполнение программного модуля останавливается и управление передается отладчику. Точки останова могут быть безусловными или с условием. При достижении безусловной точки останова исполнение программного модуля останавливается в любом случае:
При достижении точки останова с условием, выполнение программного модуля останавливается только в том случае, если заданное условие истинно:
Отладчик поддерживает возможность отключения точек останова. При этом строка модуля остается отмечена маркером, однако на ход исполнения модуля он никакого влияния не оказывает:
При большом количестве точек останова удобно использовать отдельное окно для работы с точками останова, позволяющее просматривать и редактировать их в едином списке:
Пошаговое выполнение
После того, как при достижении точки останова управление прикладным решением передано отладчику, существует возможность дальнейшего исполнения модуля в нескольких режимах: пошаговое выполнения, исполнение вызова функции или процедуры, прерывание пошагового исполнения функции или процедуры, выполнения модуля до той строки, на которой стоит курсор или продолжение свободного выполнения модуля:
Просмотр выражений
Во время пошагового выполнения существует возможность просматривать значения переменных, содержащихся в модуле, и рассчитывать произвольные значения. Для этого используется специальное окно, отображающее результат расчета:
Для объектов встроенного языка значения их свойств представляются в виде древовидной структуры. Для значений, являющихся строками, массивами и коллекциями значений также возможен просмотр в отдельном окне:
Текущее значение переменной также можно просмотреть, подведя указатель мыши к этой переменной. Текущее значение будет показано в виде короткой подсказки рядом с переменной.
Табло и локальные переменные
Результаты вычислений, которые требуется просматривать на протяжении выполнения некоторой части модуля, можно вывести в отдельное окно — табло, — в котором есть возможность распределить все просматриваемые выражения по четырем страницам:
Для удобного просмотра и изменения локальных переменных, что представляется наиболее частой задачей, существует команда Локальные переменные. Она открывает табло, которое уже автоматически заполнено всеми локальными переменными.
Изменение значений переменных
Значения примитивных типов можно изменить прямо в ячейке Значение.
В этом окне полностью функционирует контекстная подсказка.
Стек вызовов
Отладчик позволяет использовать стек вызовов, который показывает последовательность вызовов процедур и функций, приведшую к строке модуля, которая отлаживается в данный момент:
Двойным щелчком мыши на имени процедуры в стеке вызова можно перейти в соответствующую строку процедуры.
Остановка по ошибке
В платформе предусмотрена возможность использовать режим Остановка по ошибке. В этом режиме отладка может быть остановлена либо при каждой возникающей ошибке, либо при ошибке, в тексте которой присутствует подстрока, указанная разработчиком. Подстроки интересующих ошибок указываются в настройках отладки.
Во время отладки при такой настройке отладка будет останавливаться только при возникновении ошибок, связанных с делением на ноль.
В этой статье я разберу пять интересных, нужных и, самое главное, эффективных инструментов по отладке кода в конфигураторе 1С, которые существенно облегчат жизнь 1С программисту.
Очень часто, особенно когда возникает ошибка в непонятном куске кода, нужно понять каким путем программа пришла именно в этот кусок кода. В этом поможет нужный инструмент – стек вызовов. Данный инструмент необходимо запустить, когда сработала точка останова. Стек вызовов запускается, или через главное меню
Или, используя панель «Отладка конфигурации»
После запуска, откроется окно, в котором будет показан путь к текущему методу снизу вверх. В самом верху списка будет процедура (функция), где сработала точка останова.
Если кликнуть по какой-нибудь строке стека вызова, то произойдет открытее модуля, в котором находится процедура или функция, указанная в этой строке. Причем курсор установится на то место кода, где произошел переход на метод более верхнего уровня.
На этом рисунке мы кликнули на вторую сверху строку стека вызова, и открылось место в модуле, где произошел вызов процедуры «ПечатнаяФорма», в которой сработала точка останова.
Работайте со стеком вызова всегда, когда программа имеет разветвленную структуру процедур и функций, это существенно облегчит Вашу жизнь.
Обычно, разработчики запускают отладку кода в конфигураторе 1С, используя кнопку «Начать отладку».
Этот метод очень удобен, и, конечно же, имеет право на жизнь. Но очень часто могут возникать следующие ситуации:
- 1С: Предприятие уже запущенно и в нем выполняется какой-то процесс, остановить Вы его не можете
- Нужно отладить работу программы под пользователем, у которого нет прав на работу с конфигуратором
В этом случае, после открытия конфигуратора 1С необходимо подключить отладку к уже запущенному сеансу. Сделать это можно при помощи команды «Подключение» меню «Отладка».
После выполнения команды выйдет окно «Предметы отладки», где в верхней таблице будут перечислены пользователи, к которым можно подключиться, а так же типы подключения (тонкий клиент, сервер), в том случае, когда отлаживаете управляемое приложение.
Чтобы начать отлаживать нужный тип подключения, достаточно выделить соответствующую строку и нажать на кнопку «Подключить» (дважды кликнуть левой кнопкой мышки).
Заметьте, если Вы подключите отладку только на сервере, как на рисунке выше, то сможете работать только с кодом, который выполняется в серверном контексте. Если же код в клиентском контексте, то точка останова в этом месте кода не сработает.
Справедливо и наоборот: если подключена отладка только на клиенте, то можно работать только с клиентским контекстом формы. Отлаживать код в серверном контексте формы, в также в процедурах и функциях модулей объектов, менеджеров и т.д. не будет возможно.
Подробно о клиентском и серверном контексте формы читайте в моей книге: Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов
Обычно, нельзя подключиться к пользовательскому сеансу. Чтобы это стало возможным, необходимо в параметрах пользовательского приложения 1С включить возможность отладки. Установить в параметр «Откладка в текущем сеансе» значение «Разрешена (протокол TCP/IP)» , когда отлаживаем работу по локальной сети.
В этом случае отладка будет включена единовременно. Если мы хотим, чтобы под этим пользователем всегда была включена отладка, то нужно в параметр «Отладка при перезапуске» установить значение «Разрешена (протокол TCP/IP)»
Очень часто нужно остановиться в каком-то месте кода не просто так, а когда какая-нибудь переменная принимает определенное значение. В этом нам поможет точка останова с условием.
При установке точки останова с условием, в условие необходимо указать какое-либо булево выражение.
Можно задать различные комбинации условий
Остановка программы в точке останова с условием произойдет тогда, когда переменные программы примут такие значения, при которых булево выражение в точке останова вернет истину.
Очень часто в процессе отладки программист может поставить так много точек останова, что сам забудет, где и что ставил. Быстро сориентироваться во всех поставленных точках останова поможет список точек останова. Открыть его можно через главное меню: Главное меню – Отладка – Список точек останова.
Или с помощью комбинации клавиш Alt + F9
В этом списке можно как включить-выключить нужную точку останова, так и перейти в модуль, где эта точка находится. Достаточно просто дважды кликнуть по нужной строке.
У формы списка точек останова есть очень интересные возможности сохранения и последующей загрузки сохраненных точек останова, которые осуществляются при помощи кнопок «Сохранить» и «Открыть файл»
И последний в этой статье инструмент отладки, который мы рассмотрим, это возможность останавливать выполнение программы, в случае возникновения ошибки.
Эту функцию отладки очень удобно применять, когда у Вас в процессе работы программы возникает ошибка, и Вы не знаете, что к ней приводит, и не понимаете её природу.
Включить остановку по ошибке достаточно просто: Главное меню – Отладка- Остановка по ошибке.
В открывшемся окне нужно установить флаг «Остановка по ошибке» и нажать на кнопку «Ок».
Теперь, если в процессе выполнения программы платформой будет сгенерирована ошибка, то программа остановиться на той строке модуля, код которой приводит к ошибке.
И Вы при помощи табло (или Вычислить выражение) сможете проанализировать значения переменных, которые, возможно, привели к ошибке.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Читайте также: