Отладка расширения конфигурации 1С 8.3 от точки останова до технологического журнала

· 9 мин

Содержание

Отлаживать расширение конфигурации 1С можно тем же отладчиком, что и основную конфигурацию: откройте расширение в конфигураторе, поставьте точку останова (F9) в его модуле и запустите отладку (F5). Код расширения выполняется в одном потоке с типовым, поэтому отладчик переходит из типовой процедуры в процедуру с аннотацией &Перед, &После или &Вместо и обратно.

Типичная ситуация: доработали печатную форму в расширении, загрузили его в рабочую базу, а пользователь видит старый макет. Или точка останова стоит, а отладчик молча проходит мимо. Причина часто в настройке среды, а не в коде. Ниже порядок, по которому удобно искать ошибку в расширении: от настройки отладки к журналам и внешним инструментам.

Подготовка среды: отладка расширения в файловой и серверной базе

Отладка работает на платформе 8.3 в любой базе, но подготовка различается.

Файловая база. Дополнительных настроек нет. Конфигуратор сам поднимает отладку при запуске клиента через F5.

Клиент-серверная база . Серверный код (модули с &НаСервере, общие модули, модули объектов) отлаживается, только если кластер запущен в режиме отладки. Для этого в командную строку службы агента сервера 1С (ragent) добавляют ключ:

-debug -http

Вариант -debug без -http включает старый протокол TCP. В современных релизах 8.3 используют HTTP: он нужен для отладки из EDT, веб-клиента и мобильного приложения.

Ключ -debug применяется только после перезапуска службы агента сервера. Перезапуск обрывает все сеансы пользователей, поэтому делайте его вне рабочего времени и предупредите людей заранее.

Не держите рабочий кластер постоянно в режиме отладки. Любой разработчик с доступом к конфигуратору сможет подключиться и остановить чужой сеанс на точке останова. Правильная схема: копия базы на тестовом сервере, отладка там.

Настройки конфигуратора

  1. Откройте Сервис → Параметры → Отладка и выберите протокол отладки: HTTP или TCP. Он должен совпадать с режимом сервера.
  2. На вкладке запуска 1С:Предприятия укажите клиент, который будет стартовать по F5: тонкий, толстый или веб-клиент.
  3. Откройте окно расширений: Конфигурация → Расширения конфигурации. Выделите расширение и откройте его конфигурацию через меню действий окна.
  4. Внесите изменения и обновите конфигурацию базы данных для расширения (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-объектам, внешним компонентам и привилегированному режиму. Попытка сделать это вызывает исключение о нарушении прав. Если код в расширении падает только в рабочей базе, а в тестовой работает, сравните свойства безопасного режима и защиты от опасных действий в окне расширений.

Ошибки при обновлении и применении расширения

После обновления типовой конфигурации расширение может перестать применяться. Чаще всего это видно при запуске базы: появляется сообщение, что расширение не может быть применено, с перечнем объектов.

ПричинаКак проявляетсяЧто делать
Заимствованный объект удалён или переименован в типовойРасширение не применяется, в тексте ошибки имя объектаУдалить объект из расширения или заимствовать заново под новым именем
Типовая процедура изменилась, а у вас &ИзменениеИКонтрольОшибка контроля: текст процедуры не совпадаетСравнить и перенести вставки в новый текст процедуры
Режим совместимости расширения выше, чем у конфигурацииРасширение не подключается к базеПонизить режим совместимости расширения до уровня основной конфигурации
Расширение меняет структуру данных, а у пользователя нет правОшибка при записи или открытии своих объектов расширенияДобавить роли расширения пользователям

Порядок действий после обновления типовой

  1. Сделайте копию базы и обновляйте типовую конфигурацию на ней.
  2. Откройте расширение в конфигураторе и выполните проверку модулей (Конфигурация → Проверка модулей, отметьте расширение).
  3. Сравните процедуры с &ИзменениеИКонтроль: конфигуратор подсвечивает те, где типовой текст изменился.
  4. Обновите конфигурацию базы данных для расширения.
  5. Откройте клиент и пройдите сценарии, которые трогает расширение.

Перед обновлением типовой выгрузите расширение в файл .cfe через меню действий в окне расширений. Если что-то пойдёт не так, его можно загрузить обратно за минуту.

Загрузка файла .cfe и обновление конфигурации базы данных — два отдельных шага. Если загрузили новую версию и не обновили, база продолжит работать со старой.

Внешние инструменты для отладки и профилирования расширений

Встроенного отладчика хватает для большинства задач. Но есть случаи, где удобнее сторонний инструмент.

ИнструментДля чего
1C:Enterprise Development Tools (EDT)Отладка и профилирование расширений как проекта, работа с Git, сравнение версий
«Инструменты разработчика» (бесплатная портативная обработка)Консоль кода и запросов, расширенный анализ журнала регистрации и технологического журнала
Vanessa AutomationАвтоматические сценарные тесты: прогон сценариев после каждого обновления расширения
Центр управления производительностью (из корпоративного инструментального пакета)Анализ производительности на нагруженных серверных базах

Когда переходить на EDT

EDT удобен, если с расширением работает команда. Расширение хранится как набор файлов в Git, видно, кто и что поменял, а отладчик и профайлер встроены в среду. Для одиночной доработки печатной формы конфигуратора достаточно.

Профилирование запросов

Если расширение тормозит, сначала включите замер производительности в конфигураторе. Узкое место обычно видно сразу: запрос в цикле или обращение к реквизитам через точку. Если строка с запросом выполняется долго один раз, смотрите план запроса: в технологическом журнале включите события DBMSSQL (для MS SQL) или DBPOSTGRS (для PostgreSQL) со свойством плана.

Частые вопросы

Можно ли отлаживать расширение прямо в рабочей базе?
Технически да, но остановка на точке останова замораживает сеанс. В клиент-серверной базе для этого придётся перезапустить агент сервера с ключом -debug, а это оборвёт сеансы. Безопаснее отлаживать на копии.
Нужно ли выгонять пользователей, чтобы обновить расширение?
Если расширение не меняет структуру данных, его обычно можно применить без монопольного доступа. Пользователи увидят изменения после перезапуска своих сеансов.
Почему в стеке вызовов нет моей процедуры расширения?
Скорее всего, расширение не активно или не применено в этом сеансе. Проверьте флаг активности в окне расширений и перезапустите клиент.
Как отладить расширение в веб-клиенте?
Сервер отладки должен работать по протоколу HTTP, а клиент запускается с параметром отладки. После этого сеанс веб-клиента появится в списке предметов отладки конфигуратора.
Чем отличается назначение расширения «Исправление», «Адаптация» и «Дополнение»?
Назначение задаёт порядок применения, если расширений несколько: сначала исправления, затем адаптации, затем дополнения. При отладке это важно, когда два расширения перехватывают одну процедуру.