Отладка серверного кода 1С 8.3: ключ -debug, Windows и Linux
Содержание
Режим отладки на сервере 1С включается ключом -debug в командной строке службы агента сервера ragent.exe. Ключ дописывают в параметры службы (в Windows — через реестр, в Linux — в unit-файл или конфиг скрипта запуска), затем перезапускают службу. После этого серверные процедуры появляются в окне Отладка → Подключение Конфигуратора, и в них можно ставить точки останова.
Без этого ключа точки останова в модулях с &НаСервере срабатывают только в файловой базе. В клиент-серверной отладчик их просто пропускает, и кажется, что код не выполняется.
Что проверить перед включением отладки на сервере
Отладка серверного кода — инструмент для тестового контура. Перед тем как править службу, пройдитесь по списку:
- 🖥️ Сервер. Лучше отдельный тестовый сервер или копия базы на нём. На рабочем сервере включайте только на время и в нерабочие часы.
- 🔢 Версии. Конфигуратор и сервер должны быть одной версии платформы, вплоть до четвёртой цифры (например, оба
8.3.24.1586). Иначе Конфигуратор не подключится к базе вообще, а не только к отладке. - 🔑 Права. Нужны права локального администратора на сервере (правка службы и реестра) и пользователь базы с правом на Конфигуратор.
- 🔌 Порты. При отладке по TCP отладчик ходит к рабочим процессам по портам из диапазона рабочего сервера (по умолчанию
1560:1591). При отладке по HTTP добавляется порт сервера отладкиdbgs(по умолчанию1550). Эти порты должны быть открыты от машины разработчика до сервера. - 👥 Пользователи. Перезапуск службы агента обрывает все сеансы на сервере. Предупредите людей заранее.
Если базу можно развернуть в файловом варианте, часть отладки удобнее сделать там. Но поведение блокировок, фоновых заданий и прав на файлы сервера в файловой базе другое, поэтому финальную проверку всё равно делают на сервере.
TCP или HTTP: какой протокол выбрать
| Протокол | Ключ службы | Когда подходит | Что учесть |
|---|---|---|---|
| TCP | -debug (или -debug -tcp) | Обычная отладка в локальной сети | Протокол по умолчанию, отдельных служб не нужно |
| HTTP | -debug -http | Отладка через сеть с ограничениями, мобильные и веб-клиенты, современные инструменты разработки | Нужен сервер отладки dbgs.exe, в Конфигураторе протокол переключается в параметрах |
Для большинства задач хватает TCP. Протокол на сервере и в Конфигураторе должен совпадать, иначе предметы отладки не появятся.
Включение режима отладки на сервере 1С под Windows
Агент сервера в Windows работает как служба. Ключ -debug надо добавить в её командную строку.
Шаг 1. Найдите службу и текущую командную строку
Откройте PowerShell от имени администратора:
Get-CimInstance Win32_Service |
Where-Object { $_.PathName -like '*ragent*' } |
Select-Object Name, State, PathName | Format-List
Типичный результат для 64-битного сервера:
Name : 1C:Enterprise 8.3 Server Agent (x86-64)
State : Running
PathName : "C:\Program Files\1cv8\8.3.24.1586\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
Имя службы бывает другим, если сервер ставили с несколькими версиями платформы или вручную. Ориентируйтесь на PathName: в нём должен быть ragent.exe.
Шаг 2. Добавьте ключ -debug в реестр
- Запустите
regedit. - Перейдите в
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и откройте раздел с именем службы из шага 1. - Дважды щёлкните параметр
ImagePath. - Допишьте
-debugпосле пути кragent.exe, перед остальными ключами.
Было и стало:
"C:\Program Files\1cv8\8.3.24.1586\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
"C:\Program Files\1cv8\8.3.24.1586\bin\ragent.exe" -debug -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
Для HTTP-отладки вместо -debug пишут -debug -http.
Не трогайте остальную часть строки. Ошибка в кавычках или в пути к каталогу srvinfo — и служба не стартует. Скопируйте исходное значение ImagePath в блокнот до правки.
Шаг 3. Перезапустите службу
Перезапуск агента обрывает сеансы всех пользователей сервера, включая фоновые задания. Делайте это, когда в базах никто не работает .
Restart-Service -Name "1C:Enterprise 8.3 Server Agent (x86-64)"
Или через services.msc: служба агента → Перезапустить.
Шаг 4. Убедитесь, что ключ применился
Повторите команду из шага 1 — в PathName должен быть -debug. Надёжнее посмотреть командную строку живого процесса:
Get-CimInstance Win32_Process -Filter "Name='ragent.exe'" | Select-Object CommandLine
Если -debug в реестре есть, а в процессе нет — служба не перезапускалась.
Включение отладки сервера 1С в Linux
В Linux порядок тот же: найти, как запускается ragent, и добавить ключ.
Старые сборки со скриптом srv1cv83 в /etc/init.d. Параметры читаются из файла /etc/sysconfig/srv1cv83 (RHEL-подобные системы) или /etc/default/srv1cv83 (Debian, Ubuntu). В нём есть переменная отладки:
SRV1CV8_DEBUG=1
Затем перезапуск:
sudo systemctl restart srv1cv83
Новые версии платформы с unit-файлом systemd. Посмотрите, как описан запуск:
systemctl list-units | grep -i 1c
systemctl cat <имя-службы>
Найдите строку ExecStart с ragent и переопределите её через sudo systemctl edit <имя-службы>: сначала пустая строка ExecStart=, затем исходная команда с добавленным -debug. Править сам файл в /lib/systemd или /opt/1cv8 не стоит — его перезапишет обновление платформы
.
sudo systemctl daemon-reload
sudo systemctl restart <имя-службы>
ps -ef | grep [r]agent
В выводе ps у процесса ragent должен появиться ключ -debug.
Ключи командной строки и подключение из Конфигуратора
Включённая на сервере отладка ничего не делает, пока к ней не подключится Конфигуратор. Ключи, которые встречаются в этой работе:
| Где | Ключ | Что делает |
|---|---|---|
ragent | -debug | Разрешает отладку серверного кода, протокол TCP |
ragent | -debug -http | То же по протоколу HTTP через сервер отладки |
Клиент (1cv8c, 1cv8) | /DEBUG | Запускает клиент с разрешённой отладкой |
| Клиент | /DEBUGGERURL <адрес> | Указывает отладчик, к которому клиент подключится сам |
Пример ярлыка тонкого клиента , который сразу подключается к отладке:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv-1c\buh_test" /DEBUG /DEBUGGERURL "tcp://dev-pc"
Порядок подключения в Конфигураторе:
- Откройте базу в Конфигураторе на машине разработчика.
- Для HTTP-отладки включите протокол HTTP в
Сервис → Параметры, на закладке отладки. - Откройте
Отладка → Подключение. В окне видны предметы отладки: клиентские сеансы и серверные. - Нажмите
Автоматическое подключениеи отметьте флажки «Сервер» и нужные клиенты (тонкий клиент, веб-клиент, фоновое задание). - Запустите клиент из Конфигуратора (
F5) или ярлыком с/DEBUG. - Поставьте точку останова (
F9) в серверной процедуре и выполните действие в клиенте.
Флажок «Сервер» в автоподключении появится только после того, как служба агента запущена с -debug. Это самый быстрый способ проверить, что ключ сработал.
-debug или после правки реестра её не перезапустили. Проверьте командную строку процесса ragent.exe.1560:1591) или, при HTTP, порт dbgs (1550) между машиной разработчика и сервером. Проверьте брандмауэр Windows на сервере.-debug -http, а в Конфигураторе выбран TCP, или наоборот. Приведите к одному протоколу.Что настроить в консоли кластера для удобной отладки
Сам ключ -debug в консоли администрирования не включается. Но консоль помогает сделать сеанс отладки предсказуемым.
- ⏸️ Блокировка регламентных заданий. В свойствах информационной базы на тестовом сервере включите флажок блокировки регламентных заданий. Иначе задания обмена или загрузки курсов срабатывают в момент, когда вы стоите на точке останова, и путают картину.
- ⚙️ Рабочие процессы. В свойствах рабочего сервера задаются ограничения «Количество ИБ на процесс» и «Количество соединений на процесс». На тестовом сервере с одной базой удобно, чтобы все сеансы шли в один
rphost— так проще сопоставлять записи логов с вашим сеансом. - 👀 Сеансы. В ветке
Сеансыбазы видно, какой сеанс ваш, с какого компьютера и в каком процессе он работает. Если отладчик держит сеанс на точке останова, здесь он висит активным. - 🔒 Блокировки. Ветка
Блокировкипоказывает, что держит сеанс, остановленный в транзакции. Это пригодится, если коллеги жалуются на «зависание» во время вашей отладки.
Завершение сеанса или рабочего процесса из консоли обрывает работу пользователя без сохранения. Используйте это только на тестовом сервере или по согласованию.
Журнал регистрации и технологический журнал при отладке
Отладчик показывает одно выполнение. Логи показывают, что происходило до и после, в том числе в чужих сеансах.
Журнал регистрации
Смотрится в Конфигураторе через Администрирование → Журнал регистрации или в пользовательском режиме из раздела администрирования. Удобные фильтры при отладке:
- по пользователю и компьютеру — чтобы видеть только свои действия;
- по уровню «Ошибка» — исключения с текстом и модулем;
- по событию фонового задания — если отлаживаете обработку в фоне.
Физически журнал лежит на сервере в каталоге кластера, в папке базы: srvinfo\reg_1541\<идентификатор базы>\1Cv8Log. Идентификатор базы виден в консоли кластера в свойствах базы.
Технологический журнал
Технологический журнал пишет события платформы: исключения, запросы к СУБД, ожидания на блокировках. Он включается файлом logcfg.xml в каталоге conf платформы на сервере (например, C:\Program Files\1cv8\conf\). Платформа подхватывает изменения файла без перезапуска службы.
Минимальная настройка для отладки ошибок и тяжёлых запросов:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="DBMSSQL"/>
</event>
<event>
<eq property="name" value="TLOCK"/>
</event>
<property name="all"/>
</log>
</config>
Здесь history="24" — хранить 24 часа. На нагруженном сервере техжурнал без фильтров заполняет диск за часы. Пишите его на отдельный диск, включайте на время и отключайте, удалив или переименовав logcfg.xml.
Поиск узких мест: замер производительности
Когда сервер отлажен, следующий вопрос обычно — почему медленно. Для серверного кода есть два инструмента.
Замер производительности в Конфигураторе. Включается в меню Отладка → Замер производительности при подключённой отладке. Порядок:
- Включите замер.
- Выполните в клиенте медленную операцию один раз.
- Выключите замер — откроется таблица строк кода с числом вызовов и временем.
- Отсортируйте по проценту времени и идите сверху вниз.
С флажком «Сервер» в автоподключении замер покажет строки серверных модулей. Без серверной отладки в таблице будет только клиентский вызов, а всё время ляжет на одну строку с вызовом сервера.
Технологический журнал. Покажет то, чего нет в замере: сколько секунд шёл конкретный запрос к СУБД (DBMSSQL), ждал ли сеанс чужую блокировку (TLOCK), не было ли взаимоблокировки. В событиях есть свойство duration — длительность; в журналах 8.3 она в микросекундах.
Что обычно находится этими двумя способами:
- 🐢 запрос в цикле — тысячи вызовов одной строки в замере;
- 🔁 обращение через точку к реквизитам ссылки внутри цикла — неявные запросы к базе;
- ⏳ долгое ожидание блокировки — видно в
TLOCK, а не в замере; - 📦 передача больших коллекций между клиентом и сервером — много времени на строке вызова серверного метода.
Как выключить отладку и почему не оставлять её на рабочем сервере
Режим отладки на постоянной основе — плохая идея по трём причинам:
- 🛑 Остановка держит ресурсы. Если разработчик поставил точку останова в серверном коде внутри транзакции, сеанс замирает с открытой транзакцией. Его блокировки ждут другие пользователи.
- 🐌 Нагрузка. Сервер с отладкой тратит ресурсы на поддержку отладочной информации, серверный код работает медленнее.
- 🔓 Доступ. Любой, кто открыл базу в Конфигураторе, может подключиться к серверным предметам отладки и смотреть значения переменных в чужих сеансах, включая персональные данные.
Чтобы выключить:
- Отключитесь от предметов отладки в Конфигураторе и закройте его.
- Уберите
-debug(и-http, если был) изImagePathв реестре или из переопределения systemd. В старом скрипте Linux вернитеSRV1CV8_DEBUG=0. - Перезапустите службу агента — снова в момент, когда никто не работает.
- Проверьте командную строку
ragent, что ключа нет. - Снимите блокировку регламентных заданий, если включали её на рабочей базе, и уберите
logcfg.xml.
Если отладка на рабочем сервере нужна регулярно, лучше один раз поднять тестовый сервер той же версии и держать там свежую копию базы. Это дешевле, чем каждый раз останавливать работу бухгалтерии.
Частые вопросы
Нужна ли отдельная лицензия для отладки на сервере?
Можно ли включить отладку для одной базы, а не для всего сервера?
-debug действует на весь агент и все базы его кластера. Ограничить отладку одной базой можно, только вынеся эту базу на отдельный сервер или в отдельный кластер.Как отлаживать фоновое задание на сервере?
Отладка работает через веб-сервер, если база опубликована?
-debug -http и сервер отладки. По TCP веб-клиент не отлаживается.Почему после обновления платформы отладка пропала?
-debug нужно добавить снова в путь к новому ragent.exe.