Отладка расширения конфигурации 1С 8.3 от точки останова до технологического журнала
Содержание
Отлаживать расширение конфигурации
1С можно тем же отладчиком, что и основную конфигурацию: откройте расширение в конфигураторе, поставьте точку останова (F9) в его модуле и запустите отладку (F5). Код расширения выполняется в одном потоке с типовым, поэтому отладчик переходит из типовой процедуры в процедуру с аннотацией &Перед, &После или &Вместо и обратно.
Типичная ситуация: доработали печатную форму в расширении, загрузили его в рабочую базу, а пользователь видит старый макет. Или точка останова стоит, а отладчик молча проходит мимо. Причина часто в настройке среды, а не в коде. Ниже порядок, по которому удобно искать ошибку в расширении: от настройки отладки к журналам и внешним инструментам.
Подготовка среды: отладка расширения в файловой и серверной базе
Отладка работает на платформе 8.3 в любой базе, но подготовка различается.
Файловая база. Дополнительных настроек нет. Конфигуратор сам поднимает отладку при запуске клиента через F5.
Клиент-серверная база
. Серверный код (модули с &НаСервере, общие модули, модули объектов) отлаживается, только если кластер запущен в режиме отладки. Для этого в командную строку службы агента сервера 1С (ragent) добавляют ключ:
-debug -http
Вариант -debug без -http включает старый протокол TCP. В современных релизах 8.3 используют HTTP: он нужен для отладки из EDT, веб-клиента и мобильного приложения.
Ключ -debug применяется только после перезапуска службы агента сервера. Перезапуск обрывает все сеансы пользователей, поэтому делайте его вне рабочего времени и предупредите людей заранее.
Не держите рабочий кластер постоянно в режиме отладки. Любой разработчик с доступом к конфигуратору сможет подключиться и остановить чужой сеанс на точке останова. Правильная схема: копия базы на тестовом сервере, отладка там.
Настройки конфигуратора
- Откройте
Сервис → Параметры → Отладкаи выберите протокол отладки: HTTP или TCP. Он должен совпадать с режимом сервера. - На вкладке запуска 1С:Предприятия укажите клиент, который будет стартовать по
F5: тонкий, толстый или веб-клиент. - Откройте окно расширений:
Конфигурация → Расширения конфигурации. Выделите расширение и откройте его конфигурацию через меню действий окна. - Внесите изменения и обновите конфигурацию базы данных для расширения (
F7в окне конфигурации расширения).
Подключение к уже запущенному клиенту
Если пользователь уже открыл базу и ошибка воспроизводится только у него, клиент можно подключить к отладке на лету. Для этого клиент запускают с параметрами командной строки:
1cv8c.exe /DEBUG -http -attach /DEBUGGERURL "http://localhost:1550"
Порт 1550 — порт сервера отладки по умолчанию. Затем в конфигураторе откройте Отладка → Подключение, найдите нужный сеанс в списке предметов отладки и подключитесь.
Точки останова и пошаговое выполнение в модулях расширения
Точку останова ставят прямо в модуле расширения. Не нужно ставить её в типовом модуле, чтобы «поймать» вход: отладчик остановится в коде расширения сам.
| Действие | Клавиша |
|---|---|
| Поставить или снять точку останова | F9 |
| Шаг с заходом в процедуру | F11 |
| Шаг без захода (через процедуру) | F10 |
| Выйти из текущей процедуры | Shift+F11 |
| Продолжить до следующей точки | F5 |
| Вычислить выражение | Shift+F9 |
Как отладчик ведёт себя с аннотациями
- 🔹
&Перед— отладчик заходит в процедуру расширения, затем поF10возвращается в типовую процедуру. - 🔹
&После— сначала отрабатывает типовой код, потом ваш. Если поставить точку в типовой процедуре и идти поF11, в конце вы попадёте в код расширения. - 🔹
&Вместо— типовая процедура выполняется только при вызовеПродолжитьВызов(). Шагните внутрь него поF11, чтобы увидеть типовой код. - 🔹
&ИзменениеИКонтроль— процедура заимствуется целиком, вставки помечены директивами#Вставкаи#Удаление. Отладчик идёт по итоговому тексту, поэтому шаги совпадают со строками модуля расширения.
Точка останова с условием
Когда ошибка возникает только на одном документе из тысячи, обычная точка останова бесполезна: придётся сто раз нажимать F5. Щёлкните правой кнопкой по точке останова в списке точек (окно открывается из меню Отладка) и задайте условие. Например:
Объект.Номер = "0000-000123"
Отладчик остановится только на этом документе.
💡 Окно «Табло» удобнее, чем вычисление выражения по одному. Перетащите туда переменные, которые хотите видеть на каждом шаге, и следите за ними без лишних кликов. Окно «Стек вызовов» показывает, из какой типовой процедуры пришёл вызов в расширение.
Журнал регистрации и трассировка вызовов в расширении
Отладчик хорош, когда ошибку можно повторить. Если сбой случается у пользователя раз в день, нужен журнал.
Своя запись в журнал регистрации
Добавьте в код расширения запись в журнал на подозрительном участке:
ЗаписьЖурналаРегистрации(
"МоёРасширение.Проведение",
УровеньЖурналаРегистрации.Информация,
Объект.Метаданные(),
Объект.Ссылка,
"Сумма до пересчёта: " + Формат(СуммаДо, "ЧГ=0") + "; после: " + Формат(СуммаПосле, "ЧГ=0"));
Имя события задавайте с префиксом расширения. Тогда в журнале легко отфильтровать только ваши записи. В типовых конфигурациях журнал открывается через Администрирование → Обслуживание → Журнал регистрации, в конфигураторе — через Администрирование → Журнал регистрации.
💡 Не пишите в журнал на каждой строке цикла по 10 000 записей. Журнал разрастётся, а нужная запись утонет. Пишите на входе и выходе процедуры и в ветке ошибки.
Технологический журнал
Технологический журнал записывает события платформы: исключения, запросы к СУБД, вызовы сервера. Он включается файлом logcfg.xml в каталоге conf платформы на сервере. Пример для поиска исключений:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\v8logs" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Параметр history="24" хранит логи 24 часа. Без него каталог быстро займёт гигабайты.
Не оставляйте технологический журнал включённым со сбором всех событий. На нагруженном сервере это замедляет работу и забивает диск. Собрали данные — удалите или переименуйте logcfg.xml.
Клиент и сервер: где выполняется код расширения
Многие «необъяснимые» ошибки расширения — это код, выполненный не на той стороне.
- 📌 Процедура с
&НаКлиентене видит объектов базы напрямую. Если в ней обратиться к реквизиту ссылки через точку, получите ошибку или лишний серверный вызов. - 📌 Общий модуль расширения наследует флаги «Клиент», «Сервер», «Вызов сервера» от собственных свойств, а не от типового модуля, который вы дорабатываете.
- 📌 Обработчик формы
ПриСозданииНаСерверев расширении не может открыть форму или показать предупреждение: это клиентские действия.
Как увидеть лишние серверные вызовы
Включите замер производительности (Отладка → Замер производительности) и повторите действие пользователя. В результатах видно, сколько раз выполнялась каждая строка и сколько времени она заняла. Строки расширения отображаются в своём модуле, их легко отличить от типовых.
Если одна клиентская строка вызывает сервер 200 раз в цикле, вынесите цикл в серверную процедуру без контекста (&НаСервереБезКонтекста) и передавайте ей готовый массив.
Предметы отладки
В окне Отладка → Подключение отображаются все подключённые предметы: клиентские сеансы, сервер, фоновые задания, HTTP-сервисы, веб-сервисы. Кнопка автоматического подключения позволяет выбрать типы предметов, которые конфигуратор будет подхватывать сам. Для отладки HTTP-сервиса расширения включите подключение HTTP-сервисов, иначе отладчик не остановится в его модуле.
Исключения в расширении: как поймать и не потерять текст ошибки
Самая вредная конструкция в расширении — пустое исключение:
Попытка
ВыполнитьОбмен();
Исключение
КонецПопытки;
Ошибка исчезает, а через неделю бухгалтер обнаруживает, что обмен не работал. Минимум, который нужен в блоке Исключение:
Попытка
ВыполнитьОбмен();
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации(
"МоёРасширение.Обмен",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(Инфо));
ВызватьИсключение;
КонецПопытки;
ПодробноеПредставлениеОшибки даёт стек: модуль, номер строки, вложенные вызовы. ВызватьИсключение без параметров пробрасывает исходную ошибку выше, и пользователь видит её текст.
Остановка по ошибке
В меню Отладка есть режим остановки по ошибке. Включите его, и отладчик встанет на строке, где возникло исключение, даже если оно внутри Попытка. В настройках режима можно указать фрагмент текста ошибки: тогда остановка сработает только на нужной, а не на каждой ожидаемой ошибке типового кода.
Безопасный режим расширения
Расширение может работать в безопасном режиме. Тогда код не может обращаться к файлам, COM-объектам, внешним компонентам и привилегированному режиму. Попытка сделать это вызывает исключение о нарушении прав. Если код в расширении падает только в рабочей базе, а в тестовой работает, сравните свойства безопасного режима и защиты от опасных действий в окне расширений.
Ошибки при обновлении и применении расширения
После обновления типовой конфигурации расширение может перестать применяться. Чаще всего это видно при запуске базы: появляется сообщение, что расширение не может быть применено, с перечнем объектов.
| Причина | Как проявляется | Что делать |
|---|---|---|
| Заимствованный объект удалён или переименован в типовой | Расширение не применяется, в тексте ошибки имя объекта | Удалить объект из расширения или заимствовать заново под новым именем |
Типовая процедура изменилась, а у вас &ИзменениеИКонтроль | Ошибка контроля: текст процедуры не совпадает | Сравнить и перенести вставки в новый текст процедуры |
| Режим совместимости расширения выше, чем у конфигурации | Расширение не подключается к базе | Понизить режим совместимости расширения до уровня основной конфигурации |
| Расширение меняет структуру данных, а у пользователя нет прав | Ошибка при записи или открытии своих объектов расширения | Добавить роли расширения пользователям |
Порядок действий после обновления типовой
- Сделайте копию базы и обновляйте типовую конфигурацию на ней.
- Откройте расширение в конфигураторе и выполните проверку модулей (
Конфигурация → Проверка модулей, отметьте расширение). - Сравните процедуры с
&ИзменениеИКонтроль: конфигуратор подсвечивает те, где типовой текст изменился. - Обновите конфигурацию базы данных для расширения.
- Откройте клиент и пройдите сценарии, которые трогает расширение.
Перед обновлением типовой выгрузите расширение в файл .cfe через меню действий в окне расширений. Если что-то пойдёт не так, его можно загрузить обратно за минуту.
Загрузка файла .cfe и обновление конфигурации базы данных — два отдельных шага. Если загрузили новую версию и не обновили, база продолжит работать со старой.
Внешние инструменты для отладки и профилирования расширений
Встроенного отладчика хватает для большинства задач. Но есть случаи, где удобнее сторонний инструмент.
| Инструмент | Для чего |
|---|---|
| 1C:Enterprise Development Tools (EDT) | Отладка и профилирование расширений как проекта, работа с Git, сравнение версий |
| «Инструменты разработчика» (бесплатная портативная обработка) | Консоль кода и запросов, расширенный анализ журнала регистрации и технологического журнала |
| Vanessa Automation | Автоматические сценарные тесты: прогон сценариев после каждого обновления расширения |
| Центр управления производительностью (из корпоративного инструментального пакета) | Анализ производительности на нагруженных серверных базах |
Когда переходить на EDT
EDT удобен, если с расширением работает команда. Расширение хранится как набор файлов в Git, видно, кто и что поменял, а отладчик и профайлер встроены в среду. Для одиночной доработки печатной формы конфигуратора достаточно.
Профилирование запросов
Если расширение тормозит, сначала включите замер производительности в конфигураторе. Узкое место обычно видно сразу: запрос в цикле или обращение к реквизитам через точку. Если строка с запросом выполняется долго один раз, смотрите план запроса: в технологическом журнале включите события DBMSSQL (для MS SQL) или DBPOSTGRS (для PostgreSQL) со свойством плана.