Почему серверная точка останова 1С не срабатывает и как запустить отладку на сервере
Содержание
Точку останова на сервере 1С включают в два этапа: сначала запускают агент сервера (ragent) с ключом -debug -http и перезапускают службу, затем в Конфигураторе через Отладка → Подключение подключают серверные предметы отладки. Только после этого F9 в процедуре с &НаСервере действительно останавливает выполнение.
Частое заблуждение — что красного кружка в модуле достаточно. В файловой базе так и есть. В клиент-серверной без режима отладки на стороне сервера точка останова молча пропускается: код выполняется в рабочем процессе rphost, к которому Конфигуратор просто не подключён. Всё ниже относится к платформе 8.3 (8.3.7 и новее, где появилась отладка по HTTP).
Что нужно проверить до включения отладки на сервере
Отладка на сервере — вмешательство в работу кластера. Прежде чем трогать службу, ответьте на четыре вопроса:
- 🖥️ Какая это база. Рабочую базу лучше не отлаживать вовсе. Сделайте копию на тестовом сервере или хотя бы в отдельной базе того же кластера.
- 🔢 Совпадают ли версии. Конфигуратор, из которого отлаживаете, должен быть той же версии платформы, что и сервер. При расхождении подключиться к серверным предметам не получится.
- 🔐 Есть ли доступ к серверу. Нужны права администратора Windows на машине с сервером 1С (или root на Linux), чтобы поменять параметры службы.
- 🧱 Открыт ли порт. При HTTP-отладке клиенты и рабочие процессы обращаются к серверу отладки
dbgs. Его порт по умолчанию —1550. Если Конфигуратор стоит на другой машине, порт должен быть доступен через брандмауэр.
Чтобы новый ключ запуска вступил в силу, службу агента придётся перезапустить. Все пользователи кластера потеряют сеансы. Делайте это в нерабочее время или на тестовом сервере.
TCP или HTTP
У платформы два протокола отладки. Выбирать почти не приходится, но разницу знать полезно.
| Протокол | Ключ агента | Когда подходит | Минусы |
|---|---|---|---|
| HTTP | -debug -http | Основной вариант для 8.3.7+, удалённая отладка, отладка через веб-сервер | Нужен открытый порт сервера отладки |
| TCP | -debug -tcp или просто -debug | Старые релизы платформы до 8.3.7 | Нельзя отлаживать мобильные и веб-клиенты, хуже работает через сеть |
Дальше в инструкции везде используется HTTP.
Как включить режим отладки на сервере 1С: Windows и Linux
Режим отладки задаётся параметром командной строки агента сервера. Отдельной галочки в консоли кластера для этого нет.
Windows
- Откройте
services.mscи найдите службу агента сервера 1С. Её имя содержит «1C:Enterprise 8.3 Server Agent». - Откройте свойства службы и посмотрите поле «Исполняемый файл». Строка выглядит примерно так:
"C:\Program Files\1cv8\8.3.24.1548\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
- Поле в окне службы не редактируется. Поменяйте путь в реестре: откройте
regeditи перейдите вHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<имя службы>. - Откройте параметр
ImagePathи добавьте послеragent.exe"ключи-debug -http:
"C:\Program Files\1cv8\8.3.24.1548\bin\ragent.exe" -debug -http -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
- Перезапустите службу.
- Проверьте результат в «Диспетчере задач» на вкладке «Подробности»: рядом с
ragent.exeиrmngr.exeдолжен появиться процессdbgs.exe. Это и есть сервер отладки.
Номер версии в пути (8.3.24.1548 в примере) у вас свой. Копируйте исходную строку целиком и только вставляйте ключи — не набирайте путь заново.
Linux
На Linux всё зависит от того, как установлен сервер.
- 🐧 Старая схема с init-скриптом. В файле
/etc/sysconfig/srv1cv83(RHEL-подобные) или/etc/default/srv1cv83(Debian, Ubuntu) раскомментируйте строкуSRV1CV8_DEBUG=1. Затем перезапустите службуsrv1cv83. - 🐧 Новая схема на systemd (поставка с юнитами в составе платформы). Найдите имя юнита командой
systemctl list-units | grep 1cv8, посмотрите его черезsystemctl cat, добавьте-debug -httpв строкуExecStartчерезsystemctl edit, выполнитеsystemctl daemon-reloadи перезапустите юнит.
Проверка та же: в выводе ps aux | grep dbgs должен появиться процесс сервера отладки.
Подключаем Конфигуратор к серверным предметам отладки
Сервер теперь готов принимать отладчик. Дальше — настройка Конфигуратора.
Шаг 1. Протокол отладки в Конфигураторе
Откройте Сервис → Параметры и вкладку «Отладка». Выберите протокол HTTP — тот же, что указан у агента. Если протоколы разные, Конфигуратор не увидит сервер отладки.
Шаг 2. Запуск отладки
Самый простой путь — Отладка → Начать отладку (F5) прямо из Конфигуратора. Платформа запустит клиент с параметрами отладки и сама подключит его к серверу отладки.
Если пользовательский сеанс уже открыт отдельно или работает на другой машине, клиент можно запустить с параметрами командной строки:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8c.exe" ENTERPRISE /S "srv1c\buh_test" /DEBUG -http -attach /DEBUGGERURL "http://srv1c:1550"
Здесь srv1c — имя сервера, buh_test — имя базы в кластере.
Шаг 3. Подключение серверных предметов
- В Конфигураторе откройте
Отладка → Подключение. - В списке будут клиентские и серверные предметы отладки этой базы. Серверный предмет — это сеанс в рабочем процессе кластера.
- Нажмите кнопку автоматического подключения и отметьте типы предметов: «Сервер», «Фоновое задание», при необходимости «Тонкий клиент» и «Веб-клиент».
- Закройте окно. Теперь каждый новый сеанс выбранного типа будет подключаться к отладчику сам.
Автоподключение действует, пока открыт Конфигуратор. После перезапуска Конфигуратора настройку стоит проверить заново.
Ставим точку останова в серверной процедуре
Сама точка останова ставится одинаково для клиентского и серверного кода. Разница только в том, какой предмет отладки её отработает.
- Откройте модуль: модуль объекта, общий модуль, модуль формы или модуль менеджера.
- Встаньте на строку с исполняемым кодом. На пустой строке, комментарии или строке
Процедура …точка не сработает. - Нажмите
F9или дважды щёлкните по левому полю модуля. Появится красный кружок. - Выполните в пользовательском режиме действие, которое вызывает этот код: проведите документ, нажмите кнопку, откройте отчёт.
Когда выполнение остановится, работают стандартные клавиши:
| Клавиша | Действие |
|---|---|
F5 | Продолжить выполнение до следующей точки |
F10 | Шаг с обходом (не заходя в вызываемые процедуры) |
F11 | Шаг с заходом в процедуру |
Shift+F11 | Выйти из текущей процедуры |
Shift+F9 | Вычислить выражение |
Alt+F9 | Список всех точек останова |
Где именно выполняется код
Точка останова в модуле формы может оказаться и в клиентской, и в серверной процедуре. Смотрите на директиву компиляции над процедурой:
- 💻
&НаКлиенте— останавливает клиентский предмет, сервер не нужен. - 🖥️
&НаСервере,&НаСервереБезКонтекста— нужен серверный предмет. - 🧩 Общий модуль с флагом «Сервер» или модуль объекта при проведении — тоже сервер.
Если точка в серверной процедуре не срабатывает, а в соседней клиентской — срабатывает, почти всегда дело в том, что серверный предмет не подключён (см. предыдущий раздел).
Отладка фоновых и регламентных заданий
Фоновые и регламентные задания выполняются на сервере в отдельных сеансах. Обычное подключение клиента их не захватывает.
Фоновые задания
В окне Отладка → Подключение в автоматическом подключении отметьте тип «Фоновое задание». Затем запустите задание из пользовательского режима — например, длительную операцию: формирование тяжёлого отчёта, групповое перепроведение. Точка останова в процедуре, которую вызывает ФоновыеЗадания.Выполнить(), сработает в новом серверном предмете.
Регламентные задания
Регламентное задание запускается по расписанию, и ждать его неудобно. Есть два способа.
- Запустить задание вручную. В типовых конфигурациях на БСП откройте
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания, выберите задание и выполните его сразу. При включённом автоподключении фоновых заданий отладчик остановится в обработчике. - Вызвать обработчик напрямую. В свойствах регламентного задания в Конфигураторе посмотрите поле «Имя метода» — это процедура общего модуля. Вызовите её из внешней обработки в серверной процедуре и поставьте точку останова там.
Если на время отладки вы отключаете регламентные задания в базе, не забудьте включить их обратно. Иначе обмены, загрузка курсов валют и другие фоновые операции так и останутся выключенными.
В файловой базе регламентные задания выполняет один из клиентских сеансов, а не сервер. Поэтому для их отладки удобнее второй способ или копия базы на сервере.
Почему Конфигуратор не подключается к серверу отладки
Большинство проблем с серверной отладкой сводятся к нескольким причинам. Ниже — симптомы и что проверить.
Отдельно про расширения. Если серверная процедура переопределена в расширении через &Перед, &После или &Вместо, ставьте точку в модуле расширения. Точка в основной конфигурации может не сработать, если расширение заменяет её код целиком.
Не держите рабочий сервер в режиме отладки постоянно. Он расходует ресурсы на сервер отладки и даёт подключаться к сеансам пользователей любому, у кого есть доступ к порту. Отладили — уберите ключ -debug и перезапустите службу в удобное время.
Условные точки останова: как не нажимать F5 сто раз
Серверный код часто крутится в цикле: перепроведение 3 000 документов, обработка 500 строк табличной части. Обычная точка останова остановит выполнение на первой итерации, а нужна, скажем, 412-я.
Для этого есть точка останова с условием. Поставить её можно через меню Отладка (пункт про точку останова с условием) или через контекстное меню строки. В открывшемся окне впишите выражение на встроенном языке. Отладчик остановится, только когда оно вернёт Истина.
Примеры условий:
// Остановиться на конкретном документе
Ссылка.Номер = "0000-000412"
// Остановиться на строке с определённым контрагентом
СтрокаТЧ.Контрагент.ИНН = "7701234567"
// Остановиться, когда сумма ушла в минус
Сумма < 0
Что важно знать об условиях:
- 📌 Условие вычисляется в контексте строки, где стоит точка. Переменные из других процедур в нём недоступны.
- 📌 Если в выражении ошибка (опечатка в имени переменной), отладчик сообщит об этом при попытке вычислить условие. Проверьте выражение через
Shift+F9на обычной остановке. - 📌 Условие проверяется на каждом проходе. В цикле на сотни тысяч итераций со сложным выражением это заметно замедлит выполнение.
Остановка по ошибке
Вторая полезная возможность — меню Отладка → Остановка по ошибке. Отладчик остановится в момент, когда возникнет исключение, даже если код его перехватывает через Попытка … Исключение. В окне можно задать текст, который должна содержать ошибка, — тогда остановок на посторонних исключениях не будет.
Это быстрее, чем расставлять точки по всем подозрительным местам: запускаете проведение, и отладчик сам показывает строку, где всё упало.
Отключить, но не удалять
В списке точек останова (Alt+F9) точки можно временно отключить, не стирая. Удобно, когда в длинной отладке расставлено десять точек, а сейчас нужна одна.