Серверная отладка в 1С 8.3: ключ -debug, протоколы, точки останова
Содержание
Чтобы подключить отладку на сервере 1С, добавьте ключ -debug в строку запуска службы агента сервера (ragent.exe) и перезапустите службу. Для отладки по HTTP строка дополняется ключом -http, тогда агент сам поднимает сервер отладки dbgs.exe на порту 1550. После этого в Конфигураторе включите автоматическое подключение серверных предметов отладки — и точки останова в серверных модулях начнут срабатывать.
По умолчанию серверная отладка выключена, и это правильно: она замедляет рабочие процессы и открывает лишний сетевой вход. Всё ниже относится к клиент-серверному варианту платформы 8.3 (релизы 8.3.2x) на Windows Server 2016 и новее и на Linux. В файловой базе серверной части нет — там код сервера выполняется в процессе клиента, и отладка работает без настройки служб.
Подготовка окружения и прав перед включением отладки
Отладка на сервере требует перезапуска службы агента. Значит, это работа администратора, а не программиста с доступом к одной базе.
Проверьте заранее:
- 🔑 Права в Windows или Linux. Нужен локальный администратор (или
sudo), чтобы править параметры службы и перезапускать её. - 🔑 Доступ к Конфигуратору базы. Пользователь 1С должен иметь роль, позволяющую открыть Конфигуратор (обычно «Администратор системы» или «Полные права»).
- 🧩 Одинаковая версия платформы. Конфигуратор и сервер должны быть одной сборки, например 8.3.24.1548 и 8.3.24.1548. При расхождении база просто не откроется в клиент-серверном режиме.
- 🌐 Сетевые порты. Для HTTP-отладки с машины разработчика должен быть доступен порт 1550 сервера. Для TCP-отладки нужен прямой доступ к рабочим процессам — это порты из диапазона рабочего сервера (по умолчанию 1560–1591).
- ⏱ Окно для перезапуска. Перезапуск службы обрывает сеансы всех пользователей всех баз кластера.
Не включайте отладку на рабочем сервере в разгар дня. Перезапуск агента выкидывает всех пользователей, а несохранённые документы теряются. Планируйте это на вечер или делайте на тестовом сервере.
Порядок соединения клиента с сервером стоит держать в голове: клиент сначала обращается к агенту сервера (порт 1540), затем к менеджеру кластера (1541), а дальше работает с рабочими процессами из диапазона портов. Код серверных модулей выполняется именно в рабочих процессах rphost.exe. Поэтому ключ отладки ставится агенту — он передаёт режим запускаемым процессам.
Что лежит в srvinfo и почему отладку включают не там
Часто ищут, какую строку дописать в srvinfo.cfg. Такого переключателя нет. Режим отладки задаётся ключом командной строки агента, а не файлом в каталоге данных кластера.
Что на самом деле хранится в каталоге srvinfo (путь задаёт ключ -d в строке запуска службы):
| Файл или папка | Назначение | Трогать для отладки? |
|---|---|---|
reg_1541\1CV8Clst.lst | Реестр кластера: базы, рабочие серверы, администраторы | Нет |
reg_1541\<GUID базы> | Служебные данные сеансов и кэш по каждой базе | Нет |
1cv8wsrv.lst | Список кластеров агента | Нет |
Файлы, которые правят руками, лежат в другом месте — в папке conf установки платформы (C:\Program Files\1cv8\conf\ для всех версий или bin\conf конкретной версии):
- 📄
logcfg.xml— настройка технологического журнала. Пригодится для анализа, об этом ниже. - 📄
conf.cfg— общие параметры платформы (например, каталог временных файлов).
Если вы где-то встретили совет «добавить debug в srvinfo», скорее всего имелся в виду ключ -d, который указывает на каталог srvinfo в той же строке запуска службы. Ключ -debug ставится рядом с ним.
Как включить отладку на сервере 1С: ключ -debug для службы агента
Windows: правка строки запуска службы
Служба агента обычно называется 1C:Enterprise 8.3 Server Agent (x86-64). В новых установках в имени может стоять номер версии — смотрите в оснастке services.msc.
- Откройте
regeditот имени администратора. - Перейдите в ветку
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и найдите раздел службы агента. - Откройте параметр
ImagePath. В нём строка вида:
"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"
- Допишите в конец ключи отладки. Для HTTP-отладки:
"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" -debug -http
- Сохраните значение и перезапустите службу в
services.msc(или командами ниже).
net stop "1C:Enterprise 8.3 Server Agent (x86-64)"
net start "1C:Enterprise 8.3 Server Agent (x86-64)"
Проверка: в диспетчере задач после старта службы появится процесс dbgs.exe. Если его нет — служба запустилась со старой строкой или ключ записан с опечаткой.
HTTP или TCP: что выбрать
| Режим | Ключи | Когда подходит | Ограничения |
|---|---|---|---|
| HTTP | -debug -http | Почти всегда: один порт 1550, проходит через сетевые экраны | Нужен процесс dbgs.exe на сервере |
| TCP | -debug или -debug -tcp | Старые проекты, где Конфигуратор настроен на TCP | Нужен доступ ко всему диапазону портов рабочих процессов |
Режим сервера и режим Конфигуратора должны совпадать. Сервер в HTTP, а Конфигуратор в TCP — серверные точки останова не сработают.
Linux: systemd и старые init-скрипты
На Linux с платформой 8.3.21 и новее сервер ставится как юнит systemd. Порядок такой:
- Найдите имя юнита:
systemctl list-units | grep srv1cv8. - Посмотрите строку запуска:
systemctl cat <имя юнита>. - Не правьте файл поставки. Создайте переопределение через
sudo systemctl edit <имя юнита>, повторите в нёмExecStartцеликом и допишите-debug -http. - Выполните
sudo systemctl daemon-reloadиsudo systemctl restart <имя юнита>.
На старых сборках с init-скриптом srv1cv83 отладку включает переменная SRV1CV8_DEBUG=1 в файле настроек службы (/etc/sysconfig/srv1cv83 или /etc/default/srv1cv83 — зависит от дистрибутива).
После правки проверьте, что ключ действительно применился: ps aux | grep ragent покажет полную строку запуска процесса.
Отладка для одного кластера или тестовой базы
Ключ -debug включает режим для всего агента — то есть для всех его кластеров и всех баз. Галочки «разрешить отладку» в свойствах отдельной базы или кластера в консоли администрирования нет.
Если отладка нужна только на тестовой копии, а рабочие базы трогать нельзя, есть два рабочих варианта:
- 🖥 Отдельный сервер. Самый чистый путь: тестовый сервер с той же версией платформы, на нём
-debugвключён постоянно. - 🔀 Второй агент на том же сервере. Регистрируется вторая служба агента на других портах, например
-port 2540 -regport 2541 -range 2560:2591и свой каталог-d. Ключ-debug -httpставите только ей. Тестовую базу публикуете в кластере второго агента, строка подключения —Srvr="server:2541";Ref="test_base";.
У второго агента должна быть своя лицензия на сервер или общий ключ, который он видит. Порт сервера отладки у двух агентов тоже не должен совпадать: если первый агент уже запущен с отладкой, второму назначьте другой порт сервера отладки. Ключ для порта сверьте с документацией к вашей сборке платформы.
Подключение к серверной отладке из Конфигуратора
Настройка протокола в Конфигураторе
- Откройте базу в Конфигураторе.
- Меню
Сервис → Параметры, вкладкаЗапуск 1С:Предприятия. - В поле режима отладки выберите тот же протокол, что на сервере (HTTP или TCP/IP).
- Для HTTP укажите адрес сервера отладки:
http://<имя сервера>:1550.
Автоматическое подключение серверных предметов
Без этого шага Конфигуратор видит только клиентский сеанс, а серверный код идёт мимо точек останова.
- Меню
Отладка → Подключение. - В окне «Предметы отладки» откройте настройку автоматического подключения.
- Отметьте нужные типы: сервер, фоновые задания, HTTP-сервисы, веб-сервисы.
- Запустите клиент кнопкой
Отладка → Начать отладку(F5).
Подключаться можно и к уже работающему сеансу. Клиент, запущенный не из Конфигуратора, нужно стартовать с ключом отладки:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /S "srv1c\buh_test" /DEBUG -http -attach /DEBUGGERURL "http://srv1c:1550"
После этого сеанс появится в списке предметов отладки, и его можно подключить вручную.
Точки останова, табло и технологический журнал
Как ставить точки останова в серверном коде
Точка ставится клавишей F9 на строке модуля. Серверными считаются процедуры с директивами &НаСервере, &НаСервереБезКонтекста, модули менеджеров и объектов, общие модули с флажком «Сервер».
Полезные клавиши в режиме отладки:
| Клавиша | Действие |
|---|---|
| F9 | Поставить или снять точку останова |
| F10 | Шаг через вызов |
| F11 | Шаг в процедуру |
| Shift+F11 | Выйти из процедуры |
| Shift+F9 | Вычислить выражение |
| F5 | Продолжить выполнение |
Для кода, который вызывается тысячи раз (проведение документа в цикле, обработчики подписок), используйте точку останова с условием — её ставят через меню Отладка. Условие пишется на встроенном языке, например Ссылка.Номер = "0000-000123".
Для фонового задания точка в его процедуре сработает, только если в автоподключении отмечены фоновые задания. Чтобы не ждать расписания, запустите задание вручную из обработки управления регламентными заданиями.
Когда отладчик не подходит: технологический журнал
Ошибку, которая возникает раз в сутки у одного пользователя, удобнее ловить журналом, а не точкой останова. Технологический журнал включается файлом logcfg.xml в папке conf платформы, без перезапуска службы — сервер перечитывает его примерно раз в минуту.
Минимальный пример: записывать все исключения на сервере, хранить 24 часа.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\1c_techlog" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Журнал без фильтра по событиям быстро забивает диск. Указывайте конкретные события и короткую историю, а после разбора удаляйте logcfg.xml.
Журнал регистрации базы (меню Администрирование → Журнал регистрации есть и в пользовательском режиме, и в Конфигураторе) тоже помогает: по нему видно, какой пользователь и в каком документе получил ошибку. Дальше на этот участок кода ставите точку останова.
Почему отладка на сервере не подключается: разбор ошибок
Отдельный случай — кластер из нескольких рабочих серверов. Ключ -debug нужно поставить агенту на каждом сервере, где могут выполняться рабочие процессы базы. Иначе сеанс попадёт на «неотлаживаемый» сервер, и точки останова будут срабатывать через раз.
Как выключить серверную отладку после работы
Оставлять отладку включённой на рабочем сервере нельзя. Рабочие процессы с отладкой работают медленнее, а открытый порт сервера отладки — лишний вход в систему.
- В Конфигураторе завершите отладку:
Отладка → Завершить отладку(Shift+F5). - Снимите все точки останова, чтобы они не сработали при следующем запуске из Конфигуратора.
- Отключите автоподключение серверных предметов в
Отладка → Подключение. - Уберите
-debug -httpизImagePath(или из переопределения systemd). - В нерабочее время перезапустите службу агента. Перезапуск снова оборвёт сеансы пользователей — предупредите их заранее.
- Удалите или переименуйте
logcfg.xml, если включали технологический журнал, и очистите каталог с логами. - Закройте порт 1550 в сетевом экране, если открывали его только под отладку.
Проверка: процесса dbgs.exe на сервере больше нет, а в строке запуска ragent отсутствует -debug.