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) Вадим, привет, а со второго взгляда - тут прежде всего идея, о том как подтянуть дополнительные аналитики из стека исполнения кода. Не многие знают, что можно получить путь всех вызовов и использовать для анализа в самом коде. Например, есть задача починить в течение пары часов до обеда, а после обеда уже пользователи сдают результат руководству, или выплачивают зарплату в банк. Тут никто не думает о костыльности, а думает как сделать здесь и сейчас, и дополнительное знание такого варианта окажется возможной палочкой выручалочкой. Upiterus; dmryzhkov; mikl79; SergeRSA; leonidy4; sasha777666; VKislitsin; + 7 – 1 Ответить(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 – Ответить (3) А завтра 1С по другому данные стека будет показывать и все, приехали)) (31) интересная позиция, тогда по твоей логике любой код завтра работать не будет, согласен? (1С постоянно всё меняет, а мы допиливаем и получаем зарплату) (32) я с позиции специфики нашей работы (тут код стабилен как и любая другая доработка. до очередного обновления релиза), доработка тут нормальная, не говнокод написанный из корыстных целей, а затем его поддержки. Не "а ля снимаем колеса и он наш"
(32)
1. как выше писали это костыли и притом неявные, другой разработчик не будет подозревать, что система так себя может вести
2. нельзя надеяться на то что и завтра "ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж" будет так же называться
3. нельзя надеяться на то что формируемая строка в ПодробноеПредставлениеОшибки будет такого же формата, да и к тому же думаю она там малость и на разных языках может формироваться
я в своей практике стараюсь не опираться на жиденькие конструкции
а в последнее время блин превратился в бесплатного дебаггера ERP. писец качество продукта под номером 2.4.12.75 . пока пытаешься воспроизвести одну ошибку, по пути еще пару находишь
Вот сегодня новая встретилась в заказе клиента, Онлайн взаиморасчеты.
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
: Объект.Движения.Записать();
: ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
: НаборЗаписей.Записать();
: ВернутьДокументыКОтражению(МенеджерВременныхТаблиц);
: РеглУчетПроведениеСервер.ЗарегистрироватьДокументыРасчетовСПартнерамиКОтражениюВРеглУ чете(ТаблицаИзменений);
: ЗаполнитьОперативныеВзаиморасчеты(ОсновныеПараметры);
: ОперативныеВзаиморасчетыСервер.РассчитатьПоИзменениям(Запрос.МенеджерВременныхТаблиц, Истина, Отбор.Регистратор.Значение, ДополнительныеСвойства);
: Объект.Движения.Записать();
: ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
Выпускать в релиз такое решение без соответствующей изоляции и документирования чреват более серьезными проблемами, особенно в условиях коллективной разработки. (3) Еще в обычном приложении стек до сих пор не формируется в описании ошибки (проверено на 8.3.18). Так что и здесь могут возникнуть отличия. Вполне годно для ограниченного применения - в рамках конкретной задачи в конкретной организации.
Масштабировать такие решения, наверное, будет не совсем правильно. А, в связи с этим, и проверять минимальную версию платформы не обязательно - вероятность отката платформы для продуктовых баз невелика.
Присоединяюсь к вышесказанному. В данном случае - почти годно. Надо только понимать - что обработка исключений - дело затратное по-производительности - и всюду вставлять вставки как на первом скриншоте (т.е. специально генерируя исключение, чтобы получить стек вызова) - может дать сильное проседание производительности - так что это скорее уж очень специальный приём - не для всех! Другое дело - когда (как далее по тексту) исключение и так уже создаётся - тогда да - данный финт можно применить.
Но. надо понимать, что 1С постоянно тусует код типовых конфигураций - от чего названия модулей и процедур может меняться (полный путь) - а тут как раз идёт его анализ. Это не есть хорошо! Поэтому - тут тогда лучше делать всегда конкретные условия на ветки ветвления - без секции "Иначе" - вернее с ней - в неё должна быть генерация исключения - что ветка условия Вышла за границы условия и программисту нужно его пересмотреть!
Ну а я, всё-таки за то, чтобы передавать доп параметры через внешние переменные (обычно - параметры сеанса для управляемых приложений). Это куда надёжнее - заводишь такую переменную (параметр сеанса) типа "Соответствие"("ФиксированноеСоотвествие"), парой общих функций помещаешь и извлекаешь оттуда доп параметры для конкретной вложенной функции (по её имени, аргументу, и, возможно, дополнительной текстовой пометке-ограничению).
А вообще - для решения таких задач есть АОП - жаль в 1С его нет (хотя сами расширения - вообще-то это уже АОП - вот только очень ограниченный) - не хватает в 1С продвинутого АОП, очень не хватает.
Ну а данной статье очень не хватает приложения како-нибудь функции алгоритма - для продвинутого и чёткого разбора текста стека - а то как-то использовать функцию "Найти" по месту вызова - совсем не кошерно!
. Можно например в каждой процедуре вызывать свою процедуру.
То о чем вы тут пишете успешно решается стеком вызовов, но в данной задаче это не пойдет, нужен вариант без доделки, а то если в модуле полсотни процедур - то в каждую чтоли писать?! Тогда уж проще точек останова натыкать.Замер производительности не подходит?
Нет конечно, там же сортировка идет по длительности, а не по порядку исполнения. Может что то не понимаю, но чем не угодила команда "Шагнуть из" (Shift+F11) отладчика?Поставил точку останова и прыгай сколько угодно.
Может что то не понимаю.
Ну, да малость не поняли. Выйдете из процедуры, и куда попадете? Вверх по стеку - так его и так посмотреть можно. А мне надо увидеть процедуры которые не связаны с этой процедурой, а будут выполняться независимо от нее - например обработчики событий. Впустую теряете время. Такую щтуку не написали, потому что она не имеет смысла.Например есть события, на которые есть обработчики, и эти обработчики друг из друга не вызываются.
В п.4 привели пример насчет "ПриОткрытии" и "СписокНоменклатураОтдельныйПриАктивизацииСтроки".
Они между собой никак не связаны.
. Такую щтуку не написали, потому что она не имеет смысла.
Если Вам смысл не понятен, то это не значит, что его нет. То что обработчики друг из друга не вызываются, про это как раз я и пишу, и как раз здесь и есть смысл необходимости трассировщика. Я как раз и хочу посмотреть последовательность выполнения НЕСВЯЗАННЫХ процедур. А такая штука в платформе есть - это замер производительности, только он малость недоделанный, т.к. нельзя отсортировать результат в порядке выполнения строк. Поэтому и спрашиваю, может профи знают как поступить. Единственный выход который я пока нашел - наставить точек останова в начале всех процедур модуля, но повторяюсь, это довольно долго в больших модулях.и терпение, терпение и еще раз терпение
и, в том числе и поэтому, спецы по УПП вполне могут рассчитывать на +-100К
P.S. иногда использую "сообщить(<где я>)", когда надо отловить последовательность событий
(11) romansun, да, это все понятно, просто не понятно почему разработчики платформы не могли добавить в замер производительности еще один столбец "Момент исполнения" и возможность сортировать по нему, множество проблем и вопросов бы сразу отпало. (12) JohnySC, потому что это немного противоречит самой идее замера производительности ;) (14) JohnySC, по Вашей логике, в случае, если какая-то строка кода вызывалась несколько раз, то и в результат замера производительности она должна быть включена несколько раз (чтобы можно было выстроить все в порядке вызова). В таком случае какие значения будут содержать колонки с количеством вызовов и суммарным временем выполнения строк (ради чего собственно эта оснастка и используется)? Я согласен, что этот механизм, вроде бы, технически несложно вызывать в режиме, когда количество и время операций не суммируется, но зато показывается порядок вызова. При этом назывался бы он, я думаю, иначе ;) (17) TheGrr, да там в другом дело. JohnySC нужно знать каким путем исполнялась его прога: какие функции из каких вызывались и т. п. В результатах замера производительности этого естественно увидеть нельзя. (18) Raise66Raise, я прекрасно понимаю, что он хочет ;) Просто я позволил себе сказать, что добавление столбца "Момент исполнения" противоречит сути инструмента замера производительности. Вот и пришлось пояснить свою точку зрения. Насчет противоречия трассировщика и замера производительности точка зрения TheGrr понятна :-)Но все равно мне кажется можно было бы объединить трассировщик и замер, просто галочку сверху, как сортировать, по порядку или по времени исполнения. Кстати можно было бы по трассировщику смотреть даже сколько по времени выполняется, например, один проход цикла - в замере этого не увидишь! Здесь по сути в платформе и делать-то практически уже нечего, малость бы замер допилили и все, получился бы очень серьезный и полезный инструмент. Трассировщик вообще много где есть, и чего это 1С на него не смотрит?
как некое временное решение. для анализов и раздумий :)
Для этих целей в 1С можно использовать условную точку останова, т.к. условие проверяется на каждом проходе кода через условную точку останова.
Рассмотрим код:
С=0;
Для Инд=1 по 10 Цикл
С=С+Инд;
КонецЦикла; //Здесь ставим условную точку останова
На указанной строке ставим точку останова с условием:
ДУ("Сообщить(""Сумма:""+П)", С)
Сумма:1
Сумма:3
Сумма:6
Сумма:10
Сумма:15
Сумма:21
Сумма:28
Сумма:36
Сумма:45
Сумма:55
Немного теории Стек вызовов - это инструмент, который показывает последовательность процедур и функций, исполнение которых привело к той строке модуля, что отлаживается сейчас. Стек большинство разработчиков используют при отладке исполнения кода. Также многие заметили, что начиная с платформы 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С знакомы как минимум с двумя методиками отладки: точки останова и узнать значение. Отладка очень полезна и эти две функции позволяют ей пользоваться на 90%.
Одна из проблем отладки – легкая возможность заблудиться. Множество общих модулей, подписки на событие, рекурсия и прочее. Кто с этим не сталкивался – попробуйте отладить типовую обработку «ОбменДаннымиXML». Очень веселое занятие.
Как найти себя в этой массе кода?
Инструкция по поиску себя
1. Установить точку останова в нужном месте.
2. Если Вы уже это сделали и успешно прошагали неизвестное количество вызова функций и заблудились – то нужно остановиться и отдышаться.
3. В меню конфигуратора «Отладка / Стек вызовов» открыть окно стека.
4. В окне изображена последовательность «попадания» в то место, где сейчас мы находимся. Функции вызывались снизу вверх.
На указанном примере, сначала была вызвана функция «Обработка проведения», в которой вызвали «ПроверитьЗаполнениеШапки», а из которой вызвали ту функцию где мы сейчас.
5. На каждую функцию в стеке можно кликнуть два раза мышкой и посмотреть на строку кода, где и был произведен вызов.
v8: Хитрости отладки
Некоторые утонченные приемы отладки кода в 1С 8.0 | Автор статьи: Гений 1С | Редакторы: Волшебник, Neco Последняя редакция №20 от 16.07.07 |
Ключевые слова: отладчик, отладка, управление,
точка останова, пошаговое выполнение
Те, кто хоть раз работал с отладчиком VBA, мечтают о том,
чтобы и в 1С можно было изменять значения переменных и переходить на любую точку кода.
Все не обещаю, но некоторые возможности доступны с помощью косметических вмешательств в конфигурацию.
Применение этих функций основано на том, что в табло отладчика в режиме Конфигуратора
или 1С:Предприятия можно вызывать доступные в контексте точки останова функции. Примеры
нужно вводить в табло Ctrl+Alt+W или в окно просмотра значения выражения Shift+F9 и сразу же получать результат.
Функция ДУ
Эта функция позволяет в любой момент выполнить любой код на языке 1С над любыми данными, переданными ей.
Примеры:
= Сообщает некий текст
= Присваивает переменной Отказ значение истина
= В отладчике нельзя вызвать процедуру, но можно это сделать через ДУ:
Функция Присвоить
Всем известно, что в 1С80 нельзя по хоту отладки менять значения переменных.
Однако есть выход!
В общем модуле объявите функцию:
Теперь вы можете в любой момент присвоить значение переменной.
Отладка в типовой конфигурации
А что же делать, если вам досталась отладка конфигурации, в которой нет этих замечательных функций?
Все очень просто. Создайте внешнюю обработку, занесите в ее модуль эти функции с ключевым словом экспорт и вызывайте их например так:
Манипуляции со стеком.
Для меня было приятной неожиданностью, когда я обнаружил, что можно смотреть переменные на разных уровнях стека.
Нужно открыть окно стека (Ctrl+F3), перейти на нужны уровень и ввести в табло имя переменной.
Лучше всего это рассмотреть на примере рекурсивной функции:
Поставьте в этой функцию точку останова и вы увидите что на разных уровнях стека переменная А принимает разные значения.
Прерывание работы программы
К сожалению, в 1С 80 можно прекратить работу некоторого кода только прекратив
работу всего 1С:Предприятия. Так сказать, для борьбы с головной болью нужно отрубить голову.
Но не все так плохо.
С помощью функции Присвоить вы можете присвоить какому-нибудь критическому объекту программы значение Неопределено или ноль и как только программа попробует получить реквизит или метод этого объекта возникнет ошибка и работа кода прекратится.
Например вы находитесь в точке:
Теперь, как только выполнение кода дойдет до строки с "Если", возникнет ошибка и выполнение прекратится.
Упреждающий просмотр
Иногда при отладке сложновложенных функций неизвестно, имеет ли смысл отлаживать данную
конкретную функцию по шагам, или лучше выполнить ее не заходя внутрь для детальной отладки.
В таких случаях удобно посмотреть в окошке просмотра значения, какое значение возвращает данная фунцкия и если она возвращает значение, которое нам интересно, выполнить отладку.
Изменение кода на лету
Если у вас много кода выполняется в операторе Выполнить, то лучше этот код занести в некоторую переменную, чтобы при случае можно было изменить этот код. Расскажу случай из практики.
Мы вставили Выполнить в Попытка-Исключение и если происходило исключение, предлагали программисту вживую изменить код. Если он соглашался, открывался диалог ввода кода, где он мог заменить старый код на новый. И перед выполнение кода мы проверяли, имеется ли он в списке замен. Если имеется, то мы перед выполнением подменяли старый код на новый. Так нам удалось быстро загрузить данные.
Отладка на сервере
Условная точка останова
Трассировка
Для этих целей в 1С можно использовать условную точку останова, т.к. условие проверяется на каждом проходе кода через условную точку останова.
На указанной строке ставим точку останова с условием:
Сумма:1
Сумма:3
Сумма:6
Сумма:10
Сумма:15
Сумма:21
Сумма:28
Сумма:36
Сумма:45
Сумма:55
Управление кодом
Предположим у нас есть такой код:
В таком случае мы можем применять программное управление кодом.
На начале оператора Если ставим условную точку останова:
Т.е. если А=1 то мы присваиваем А значение 2, и присваиваем 1 в противоположном случае.
Это позволяет, не меняя конфигурацию, постоянно перенаправлять код на нужную нам ветку.
Можно просто поставить условную точку останова, которая будет присваивать А нужное значение:
Обозримая трассировка
Если вы вставляете в код много функций Сообщить для трассировки хода выполнения программы, то потом порой бывает проблематично найти все такие трассировочные вызовы.
Если трассировка временно не нужна, ее нужно убрать так:
Интерфейс для отладки
Честно говоря, когда мне надоело постоянно после перезапуска 1С заходить через Операции-Документы в список нужных мне документов, я создал себе интерфейс "Отладчик" и в его меню воткнул нужные мне команды. Теперь после перезапуска я оказывался в нужном мне журнале/форме с одного клика.
Теперь достаточно открыть эту внешнюю обработку и десктоп настроится. В следующий раз эта обработка уже будет в списке недавно открытых файлов.
Отладка клиент-серверной базы
Использование внешней обработки
Подсовывание тестовых данных
Отладка блокировок
В этой статье я разберу пять интересных, нужных и, самое главное, эффективных инструментов по отладке кода в конфигураторе 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
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Метод Сообщить в 1С
Метод Предупреждение в 1С
Этот метод имеет следующий синтаксис:
Предупреждение(<Текст предупреждения>,<Таймаут>,<Заголовок окна>)
Текст предупреждения – или непосредственно текст предупреждения, или переменная с типом строка;
Заголовок окна – текст или переменная с типом строка, это значение будет в заголовке окна с предупреждением.
В качестве примера, на форме обработки я создал команду, в которой вывожу предупреждение:
И результат работы:
А если установить таймаут (второй параметр), то через указанное количество секунд окно закроется.
Замечу, что этот метод работает только тогда, когда у конфигурации включен режим использования модальности. Посмотреть на то, какое значение у этого режима можно в палитре свойств конфигурации:
В конфигурациях с таким режимом использования модальности следует применять метод ПоказатьПредупреждение.
Метод ПоказатьПредупреждение в 1С
У этого метода похожий синтаксис:
ПоказатьПредупреждение(<Описание оповещения о завершении><Текст предупреждения>,<Таймаут>,<Заголовок окна>)
Описание оповещения о Завершении – описание процедуры, которая будет вызвана после закрытия окна предупреждения.
Просто, первый параметр оставляем пустым.
Замечу, что метод ПоказатьПредупреждение работает как с включенной, так и с выключенной модальностью, поэтому в Ваших разработках я рекомендую применять именно этот метод!
Подробно о том, как работает метод ПоказатьПредупреждение с первым параметром «Описание оповещения о завершении» читайте в статье ниже:
Более подробно и основательно начальные вопросы программирования в 1С вы можете изучить в
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Читайте также: