1) Получение конкретного места и номера строки возникновения исключения.
1.1) Через установку настроек отладки
Зачастую у пользователей возникают разные ошибки при работе с системой 1С:Предприятие. При этом они связываются с поддержкой, разработчиками и всё, что могут доложить об ошибке — это текст, который выводится у них на экране.
Например, при открытии документа «Реализация Товаров и услуг» возникает следующая ошибка:
Зачастую отловить быстро местонахождение такой ошибки не так просто. В типовых конфигурациях уже при открытии формы часто происходит вызов ряда процедур общего модуля и быстро понять место возникновения исключения не просто.
Многие разработчики также знают, что когда они из конфигуратора запускают отладочный режим в случае возникновения исключения система помимо кнопки Ок, выводит также и кнопку Подробно.
При нажатии на кнопку «Подробно…» можно получить информацию о точном месте возникновения ошибки.
Но, оказывается, существует недокументированная возможность получать полную информацию об ошибке и без конфигуратора или подключения из него отладочного режима.
Что для этого надо сделать?
Все очень просто. Необходимо сначала зайти через пункты Главное меню (пиктограмма со стрелкой в верхнем левом углу экрана) – Сервис –Параметры.
И в открывшемся окне значение параметра «Отладка в текущем сеансе:» установить в значение «Разрешена (протокол TCP/IP)».
Вот и всё.
Воспроизведем теперь ошибку и Вуаля!) Доступна кнопка "Подробно…"!
1.2) Получение данных об ошибке через форму информации для технической поддержки.
Спасибо Bonv, он подсказал еще способ, требующий даже еще меньше телодвижений.
После возникновения ошибки необходимо нажать пиктограмму "Показать информацию о программе", а затем в открывшемся окне — "Информация для технической поддержки".
В открывшемся окне будет также видна подробная информация о возникшем исключении.
Есть еще несколько удобных механизмов платформы, которыми не всё пользуются, а зря)
2) Переопределение значений переменных, свойств объектов, параметров прямо во время отладки.
Зачастую при отладке возникают ситуации, когда необходимо поменять значения локальных переменных или каких-то свойств для возможности выполнения каких-то действий, противоречащих текущей логике.
Начиная с 8.3.7 платформа 1С стала предоставлять такую возможность.
Например, у Вас существует документ, у которого в событии «При создании на сервере» выполняется масса всяких проверок, в которых выполняется контроль на наличие специальных ролей, каких-то доп. свойств у текущего пользователя, контроль закрытого периода.
В результате форма при открытии недоступна для изменения, а Вам необходимо срочно выполнить для проверки какие-то интерактивные действия. Как быть?
Запускаем отладчик и устанавливаем точку останову в самом конце процедуры ПриСозданииНаСервере
Срабатывает точка останова, теперь просмотрим значение свойства формы ТолькоПросмотр.
Для этого перейдем к окну вычисления выражения (Отладка – Вычислить выражение) или Shift + F9.
В открывшемся окне в поле выражения пропишем свойство формы ТолькоПросмотр и нажимаем Enter или Рассчитать.
Мы видим, что действительно свойство формы «ТолькоПросмотр» установлено в значение Истина. Мы можем это исправить.
Для этого нажимаем пиктограмму установки нового значения.
В открывшемся окне вводим Ложь и нажимаем кнопку «Установить».
Появляется сообщение об успешном изменении значения.
Вот и всё! Форма доступна для изменения.
Понятно, что далеко не всегда при недоступности формы будет работать этот алгоритм, где-то может быть установлено не свойство ТолькоПросмотр, а свойство Доступность (в Ложь). Возможно (хотя и маловероятно), что свойство будет установлено в событии ПриОткрытии.
Возможно переопределять и значение Параметров.
Например, в событии НачалоВыбора поля ввода подразделения присутствует следующий код:
Процедура ПодразделениеНачалоВыбора (Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОбработатьНачалоВыбораПодразделения();
КонецПроцедуры
В процедуре ОбработатьНачалоВыбораПодразделения реализован нестандартный выбор подразделения по ограниченному списку. В результате, существует возможность выбрать лишь ограниченный список подразделений, а нам в рамках проверки необходимо выбрать подразделение, не попадающее в этот список. Вопрос также решается очень легко. Ставим точку останова в конце процедуры и также через окно вычисления выражения устанавливаем значение параметра СтандартнаяОбработка в Истина.
Привел лишь несколько примеров. На самом деле очень часто эта возможность платформы позволяет выполнять самые разные действия в обход текущей логики и значительно упрощает тестирование или выполнение каких-то проверочных действий.
3) Просмотр временных таблиц запроса.
3.1) Возможности при использовании платформы 8.3.8 и выше.
Фирма 1С, начиная с версии 8.3.8, предоставила нам ряд возможностей по просмотру содержимого временных таблиц при отладке.
Рассмотрим два варианта:
1. Объявляется только запрос, менеджер временных таблиц не объявляется. Тогда для получения данных любой из временных таблиц запроса необходимо выполнить следующие действия:
Перейти к окну Выражения («Отладка» –> «Вычислить Выражение»… или Shift + F9).
В открывшемся окне в поле Выражение прописываем:
Запрос.ВыполнитьПакетСПромежуточнымиДанными()
И нажимаем «Рассчитать».
В результате в окне результата нам выведен результат выполнения метода ВыполнитьПакетСПромежуточнымиДанными() – это массив последовательно расположенных результатов каждого запроса пакета из нашей переменной Запрос.
Для того, чтобы получить данные из результата запроса напомню необходимо использовать метод Выгрузить(). Таким образом, если, например, Вы хотите получить результат, содержащийся во второй по счету таблице из пакета, вы должны в окне вычисления выражения написать:
Запрос.ВыполнитьПакетСПромежуточнымиДанными()[1].Выгрузить()
В результате в окне результата вы получите таблицу значений с интересующими вас данными:
Можно увидеть её значения, для этого необходимо сначала перейти к строке в поле Результат, а затем либо нажать пиктограмму открытия значения либо нажав F2.
2. Следующая ситуация, когда таблицы у нас находятся внутри менеджера временных таблиц и нам необходимо увидеть их содержимое. Допустим менеджер временных таблиц находится в переменной МенеджерВТ (он может быть привязан и к запросу, в этом случае получаем его как Запрос.МенеджерВременныхТаблиц).
Можно увидеть список всех таблиц, хранящихся в менеджере. Для этого в окне Выражения надо прописать МенеджерВТ.Таблицы
В окне Результата отобразиться значение специального типа ВременныеТаблицыЗапроса.
Можно увидеть список временных таблиц перейдя к этой строке и нажав пиктограмму открытия значения либо F2.
А чтобы увидеть содержимое любое из временных таблиц необходимо от типа ВременнаяТаблицаЗапроса перейти к таблице значений, это можно сделать двумя способами: по индексу временной таблице и по имени:
МенеджерВТ.Таблицы[1].ПолучитьДанные().Выгрузить() //Обращение по индексу 1. Не забывайте что индексы ведут счет с 0, поэтому мы получим вторую по счету таблицу в пакете.
МенеджерВТ.Таблицы["ВТ_Подразделения"].ПолучитьДанные().Выгрузить() // Обращение по имени временной таблицы "ВТ_Подразделения"
3.2) Просмотр содержимого временных таблиц в версиях платформы ниже 8.3.8
Если же Вы работаете с версией платформы ниже 8.3.8, то не стоит сильно печалиться)
Можно реализовать альтернативный вариант в своей конфигурации.
Для этого необходимо в общем модуле создать следующую процедуру:
Функция СодержимоеВременнойТаблицы(МенеджерВременныхТаблиц, ИмяВременнойТаблицы) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Теперь также открыв окно вычисления выражения, можете прямо в поле Выражение обратиться к этой функции общего модуля.
Например, если общий модуль, в котором Вы прописали функцию СодержимоеВременнойТаблицы, называется Расчеты, переменная с менеджером временных таблиц — МенеджерВТ, а имя временной таблицы — ВТ_Сотрудники, то необходимо прописать следующее выражение:
Расчеты.СодержимоеВременнойТаблицы (МенеджерВТ, "ВТ_Сотрудники")
Либо если менеджер временных таблиц установлен для запроса с именем Запрос:
Расчеты.СодержимоеВременнойТаблицы (Запрос.МенеджерВременныхТаблиц, "ВТ_Сотрудники")
В результате Вы получите таблицу значений с содержимым временной таблицы!
Спасибо за уделенное время и внимание моей статье!
Надеюсь, она Вам пришлась по душе и хоть чему-то да научила) Если статья оказалась полезной, не забываем плюсовать её)
Спасибо. Действительно полезные советы.
Платформа 1С v8.x (все механизмы)
напишите для каких платформ актуальны эти механизмы. Первый например тянется ее с 8.2, второй не помню, а последний на 8.3.9
По поводу просмотра временных таблиц уже была статья
https://infostart.ru/public/822287/
Там много что дельного в комментариях по этому поводу:
Строку кода, вызвавшую исключение, можно увидеть в журнале регистрации. Предложенный способ поможет в случае, если нет доступа к журналу регистрации (например он отключен) или если ошибка воспроизводится на компьютере, где установлен толстый клиент и можно сразу зайти в конфигуратор.
Порекомендую еще очень хорошее видео по этой же теме. Много интересных приёмов продемонстрировано :
https://www.youtube.com/watch?v=y098oG9XT98
Вы уверены, что 1с-хак №1 сработает при выключенной отладке на сервере ?
(0) По п.1
Просто идем в «О программе…» и далее «Информация для техподдержки», там и будет подробная информация об исключении
(6)Да, никаких проблем быть не должно. Данный пункт управляет только отладкой на клиенте!
Эх…. ждать нам встроенную в платформу фичу для быстрого обращения в тех поддержку — видимо вечно 🙁 А всего-то надо было сделать у корня конфигурации доп. свойство «ФормаОбращенияПоТехподдержку» и встроить в окно с системной ошибкой кнопку — «Техподдежка», открывающую данную форму (которая будет назначена в конфигурации для этих целей) и передающая туда объект ИнформацияОбОшибке.
Конечно, в идеале, ещё и значение, на котором возникла ошибка (например при попытке вызвать метод у переменной примитивного типа), и значения объекта контекста, в котором произошла ошибка (например ЭтотОбъект — значение типа «ФормаКлиентскогоПриложения», а ещё ДополнительныеСвойстваОтладки — которые программист может заранее задать для некоторого контекста выполнения — поместив туда всё что угодно); а ещё круто было бы — если бы туда ещё и автоскриншот окна приложения передавался.
Ну это в идеале.
Всё — а далее уже конфигурация пусть сама определяет такую форму и её функционал (ну, опять-таки, в идеале, хорошо бы чтобы и в платформу была встроена хоть-примитивная форма обращения в техподдержку — позволяющая направить сериализованне вышеупомянутые данные (+ номер сеанса и имя пользователя, строку соединения ИБ и дату события) на указанный e-mail адрес, и сохраняющая их в Ж/Р для анализа; а ещё можно преднастроить для ней web-сервис, который она может взывать и передавать данные туда; но это так для галочки — тут, конечно, надо в конфигурации свою форму делать под себя; ну в типовых тоже должна быть своя форма — чтобы и во Фреше ей удобно можно было пользоваться, и самостоятельным компаниям с нетребовательной техподдержкой тоже её использовать для своего информирования).
Вот это было бы круто! А главное — плёвое дело то, такой функционал замутить-то, разработчикам платформы (и далее разработчикам конфигураций). Но в компании 1С не всё для людей…. тем более для программистов делается! 🙁
(0) Красавчик !
Новым для меня оказалась только настройка разрешения отладки для вывода подробностей об ошибке, раньше отладку в конфигураторе запускал, теперь буду знать. Спасибо за подсказку.
(1)Рад, что статья оказалась полезной и помогла кому-то заполнить пробелы в знаниях.
(11) Собственно главный акцент в статье и был сделан на эту часть. Это видно и по заголовку) Изначально даже планировалось и статью написать только на эту тему, но уже в процессе решил добавить описание еще двух довольно часто используемых мною весьма ценных плюшек, о которых многие всё-таки не знают.
(3)Согласен. Но мне кажется в конфигураторе рабочей базы вообще всегда надо быть осторожным и не совершать непонятных или неосмысленных действий.
Тем более меняя какие-то значения в системе, мы фактически нарушаем реализованный, прописанный в системе алгоритм, заложенную логику. Так что действительно — пользоваться можно, но осторожно) С умом.
(2) Возможность работы с Таблицами менеджера временных таблиц и метод ВыполнитьПакетСПромежуточнымиДанными() появились в версии платформы 8.3.8
Возможность динамически переопределять значения переменных — с версии 8.3.7
Добавил эту информацию в статью. Более того, прописал как с помощью функции общего модуля можно получать содержимое временных таблиц в версиях платформы младше версии 8.3.8.
(3) Инспектор объектов отладчика не копирует объекты (работает с оригиналами). Поэтому все изменения свойств объектов сразу применяются. Поэтому некорректно писать «в некоторых случаях» (правильнее будет написать «всегда»).
(7) bonv, спасибо за предложенный вариант. Добавил информацию в статью.
(16) я имел в виду случай, когда человек забыл вернуть обратно исходное значение, но да, вы правы, выразился не точно
зачастую пользователи клиента звонят, говорят об ошибке, при подключении ошибка не воспроизводится. теперь можно просить их высылать информацию для технической поддержки из окна «О программе». Испытаю данный способ! Возьму на вооружение.
(9) а если ошибка в собственных доработках возникнет? то есть не в типовом функционале.
а если ошибка не в алгоритмах, а кривых данных?
я думаю, разработчики типовых решений и платформы защитили себя от подобного спама, просто не реализовав вашу идею. 😉
(20)Не понимаю сути претензий! Причём здесь собственные алгоритмы и защита разработчиков 1С?
Я говорю об универсальном решении обращения в техподдержку. А уж кто оказывает её — такому решению должно быть побарабану — что будет настроено туда и будет отправлять! Я даже предложил так, чтобы в самих конфигурациях можно было бы (и нужно было бы) свою форму для обращения в техподдержку подключать (где уже можно было реализовать любые «извращения»; кстати, как вариант — иметь возмоджность переопределить форму из конфигурации, формой из внешней обработки — но это уже тонкости конфигурирования самой формы, а не платформы). А платформенная форма — просто могла бы брать данные настроек из общего ХранилищаНастроек чтобы определить e-mail адрес по умолчанию (куда отправлять, которые пользователь мог бы изменить), параметры доступа к почтовому аккаунту для отправки (или, как альтернативный, вариант создавать письмо через почтовый клиент ОС по умолчанию), web-сервис для передачи данных в специальное автоматзированное ПО (любое это к решению не относится), и телефон техподдержки. Это всё (или часть) можно было бы указать при настройке ИБ (да ещё и с разделителями данных — для фреша): получателем будет либо своя IT-служба, либо поддержка франча (в т.ч. бухофон, или как он там сейчас называется), либо поддержка сопровождения фреш-решения в облаке. Но никак не сама компания 1С. Туда уже информация об ошибке может быть переслана вышеуказанными получателями(службами), по существующие и сейчас схеме обращения регистрации ошибок платформы
(21) Статьи заостряют внимание других участниках сообщества на теме. Кто-то уже знает. Кому-то эта информация попадется на глаза и будет полезна.
(22) я без претензий 🙂
(5)
Не всегда, к сожалению. Правда, не уверен что в этих случаях спасут и предложенные методы. Буду посмотреть.
(24)Ну, надеюсь теперь ещё и с лучшим пониманием того, чего мне так хочется 😉 а хочется мне чтобы этого хотелось подавляющему числу пользователей платформы 1С Предприятие 8, и уж тем более хотелось её архитекторам!
(21)
Надо пойти запостить лафх*йак — как посмотреть, какой код выполняется при открытии формы %) чую, нарублю звезд выше крыши
(21)
Если автор не умеет пользоваться отладчиком или не в курсе как запускать сеанс с отладкой (а 1С этому учит и полно этого в сети), то наверно автору нужно еще поучиться самому
Вы статью вообще читали?
Причем здесь пользоваться отладчиком, при чем здесь запуск сеанса с отладкой?
Статья учит как получить моментально полную информацию об ошибке от пользователей без запуска конфигуратора, без обращения к журналу регистрации. И это в некоторых случаях действительно очень помогает.
Иногда лучше промолчать, чем сказать глупость.
(29)
Это в принципе его работа!
Программист — это человек, способный писать программы для решения различных задач.
Уметь находить ошибки — это не далеко его работа в принципе.
Если это в принципе Ваша работа, как программиста, то мне Вас искренне жаль)
Посмотрел, а Вы тут всем решили писать гневные отзывы на их никчемные статьи?))
Это очень забавно звучит от человека, за 4 года на сайте, не написавшего ни единой статьи, не выложившего ни единой разработки.
Видимо знаний хватает только чтобы засорять темы.
Ну и про девочек в песочнице Вы тоже я смотрю всем пишите?)
Настолько небогатый словарный запас? Ну придумайте на досуге еще хоть что-нибудь поинтереснее.
Больше вести с Вами диалог не вижу смысла, в связи с чем дальнейшие Ваши сообщения буду игнорировать. Удачи!
Плохо, что в платформе нет расширенной ошибки с некоторым уровнем вложенности стека. Вот что мне дает информация о том, что ошибка возникла в общем модуле БСП на строке номер такая-то и функция ЗначениеРеквизитаОбъекта() ? Да эта функция вызывается из огромного числа мест, мне важно знать кто её вызвал, а не то, что она не справилась с поставленной задачей по причине косячного значения переданного параметра.
Мне удобней так (сразу оговоримся что я работаю почти 100% времени с переписанными конфигами).
Где-то в общем модуле создать функцию типа:
В модуле допустим «О» — Отладочный
Тогда изменение значений можно делать быстрее, быстро набрал в строке
и вся недолга.
Набрать проще сразу в редакторе кода и нажать Shift +F9, если строка окажется годной то она там и останется, после отладки убрать вызовы или regexp`ом заменить. Если объект не снят с поддержки то сперва Shift+F9 потом замена по рассчитать.
Действительно быстрее и никаких лишних телодвижений, только горячие клавиши и никакой мышки.
Ещё насколько помню отладчик не даст присвоить значение какой-то функции, а П() запросто.
(31)Согласен, данного функционала тоже не хватает!
Спасибо. Полезные советы.
Большое спасибо!
Полезная статья
(29) Я тоже так раньше думал. Жизнь заставляет пересмотреть свои взгляды. Да, можно подходить к обучению со всей серьезностью, копаться в документации, читать описание изменений к платформе, пойти на очные курсы по 1С в Учебном центре №1. Это малоэффективно. Чтение таких статей для «чайников» — самый эффективный путь обучения для новичка. Проблема в том что без практики теория не дает должного понимания. Статья небольшая, ее можно применить на практике. Как раз то что нужно.
Спасибо, что поделились сокровенными знаниями! 🙂 Полезно очень!
Полезная статья, добавил себе. Спасибо)
В управляемых формах есть аналог «Вычислить выражение…»?
(39)Вопрос не ясен. Функция «Вычислить» доступна в тонком клиенте.
(40) меня интересует вопрос — есть ли в режиме предприятия штатные механизмы, аналоличные тому, что описал автор. Про свой велосипед я знаю
(41)Нет, в управляемом приложении в режиме 1С Предприятие такого механизма нет. В неуправляемом — есть «Табло» но его функционал сильно ограничен. Но самостоятельно вполне можно сделать такой инструмент и встроить его в конфигурацию, чтобы он был доступен в режиме 1С Предприятие (на любых формах) и мало отличался от штатного.
(42) жалко, что нет. Было бы полезно
(43)Вот поэтому, тут уже выложили самописки:
Если поискать — может ещё найдутся другие похожие решения
(31) так это, в конфигураторе есть такая функция отладки, стек вызовов называется. Не пробовали её?
Спасибо.
(45) Пробовал и активно использую. Я говорю об ошибках пользователей и тех ошибках, которые пишутся в ЖР Обычные пользователи под отладчиками не сидят, а чтобы угадать чего они там такого нажали надо быть победителем шоу битвы экстрасенсов и обладателем синей пятерни.
(47) тогда я видимо неправильно вас понял, извиняюсь. Имеете в виду что-то вроде слепка стека вызовов в момент возникновения ошибки, который бы сохранялся в ЖР?
(48) В момент возникновения исключения брать хотя бы 3 уровня стека вызова (напр. форма документа, общий модуль, общий модуль БСП). Скорее всего это затруднительно реализовать сохранив скорость работы рабочих процессов, так как на уровне C++ придется завести массив, в который перед каждым вызовом процедуры/функции/метода системы писать информацию о том откуда был произведен вызов. Но, например, при включенном режиме отладки (ключ -debug), такое сделать, наверное, можно было бы. Можно к этому ключу добавить параметр уровня отладки (0 — по умолчанию, стандартный режим, 1 — расширенный, 2 — экспертный и т.д.), тогда ключ мог бы задаваться как «-debug 1», «-debug 2», «-debug 3»
(0) Еще можно прописать в параметрах запуска /debug -tcp или -http, чтобы сразу устанавливался режим разрешения отладки при запуске в режиме 1С предприятия и была кнопка «Подробно». Так еще удобней, нежели рассказывать каждый раз пользователям, как вытянуть информацию для технической поддержки.
(49) Возможно пригодится:
В конструкции попытка-исключении можно использовать конструкцию «ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());»
В ней собирается стек ошибки.
(52) Может и пригодится, но в попытку/исключения всю конфигурацию не завернешь.