Отладка серверного кода 1С 8.3: ключ -debug, Linux и техжурнал
Содержание
Чтобы включить debug на сервере 1С, добавьте ключ -debug в строку запуска агента сервера ragent и перезапустите службу. В Windows это параметр ImagePath службы агента в реестре, в Linux — переменная SRV1CV8_DEBUG=1 или аргумент в unit-файле systemd. Флажка «включить отладку» в консоли кластера нет.
Типичная ситуация: программист поставил точку останова в общем модуле с директивой &НаСервере, запустил базу, а отладчик проходит мимо. В файловой базе всё работает, в клиент-серверной — тишина. Причина почти всегда одна: агент сервера запущен без режима отладки, и серверные процессы к отладчику не подключаются.
Что даёт режим отладки на сервере и когда его включать
Без ключа -debug рабочие процессы rphost не принимают подключение отладчика. Клиентский код отлаживается, серверный — нет. Поэтому debug на сервере нужен, когда проблема живёт на стороне сервера.
Типичные поводы:
- 🐞 ошибка воспроизводится только в клиент-серверной базе, а в файловой копии её нет;
- ⏳ нужно пройти по шагам проведение документа, закрытие месяца , расчёт зарплаты;
- ⚙️ падает регламентное или фоновое задание, и надо увидеть значения переменных в момент ошибки;
- 🌐 нужно отладить HTTP-сервис или веб-сервис, который выполняется на сервере;
- 🔌 обмен через COM-соединение ведёт себя иначе, чем при ручном запуске.
На рабочем сервере режим отладки держать постоянно не стоит. Любой, у кого есть права на Конфигуратор, сможет подключиться к серверным процессам и остановить код на точке останова. Пока код стоит, у пользователя «висит» документ, а его блокировки держат других.
Для разработки и тестовых баз отладку включают один раз и не выключают. Для продуктивного сервера — на время разбора инцидента, лучше в нерабочие часы.
Протоколы отладки TCP и HTTP: какой выбрать
У платформы 8.3 два механизма отладки. От выбора зависит строка запуска агента и настройка Конфигуратора.
| Протокол | Как включается на сервере | Когда подходит | Ограничения |
|---|---|---|---|
| TCP/IP | -debug или -debug -tcp | разработка в локальной сети, старые конфигурации и привычные сценарии | не работает через NAT и прокси, неудобен для удалённых серверов |
| HTTP | -debug -http | удалённый сервер, отладка мобильных приложений, EDT, несколько разработчиков | нужен сервер отладки dbgs, порт по умолчанию 1550 должен быть открыт |
При HTTP-отладке появляется посредник — сервер отладки dbgs.exe. Его запускает Конфигуратор или сам агент, и через него идут все команды отладчика. По умолчанию он слушает порт 1550.
💡 Если вы работаете в EDT, выбирайте HTTP: EDT использует именно этот протокол. Для Конфигуратора подойдут оба, но протокол в Конфигураторе и на сервере должен совпадать.
В Конфигураторе протокол выбирают в Сервис → Параметры, на закладке «Отладка». Там же задают адрес сервера отладки, если он запущен не на вашем компьютере.
Способ 1. Ключ -debug в службе агента сервера в Windows
Это основной и постоянный способ. Агент сервера работает как служба Windows, и всё, что передаётся ragent.exe при старте, записано в свойствах службы.
Шаг 1. Найдите имя службы
Откройте командную строку от имени администратора и выполните:
sc query state= all | findstr /i "1C:Enterprise"
Для 64-разрядного сервера имя обычно такое: 1C:Enterprise 8.3 Server Agent (x86-64). Если на сервере стоят несколько версий платформы, в имени может быть номер версии.
Шаг 2. Посмотрите текущую строку запуска
sc qc "1C:Enterprise 8.3 Server Agent (x86-64)"
В поле BINARY_PATH_NAME будет примерно так:
"C:\Program Files\1cv8\8.3.24.1342\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
Номер версии, порты и каталог srvinfo у вас могут быть другими. Не меняйте их — только добавьте ключ.
Шаг 3. Добавьте ключ -debug
Вариант через реестр:
- Запустите
regedit. - Перейдите в
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и откройте раздел с именем службы из шага 1. - Откройте параметр
ImagePath. - Сразу после пути к
ragent.exe(после закрывающей кавычки) допишите-debugдля TCP или-debug -httpдля HTTP. - Нажмите «ОК».
Результат должен выглядеть так:
"C:\Program Files\1cv8\8.3.24.1342\bin\ragent.exe" -debug -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
Тот же результат даёт sc config. Пробел после binPath= обязателен, а внутренние кавычки экранируются обратной косой чертой:
sc config "1C:Enterprise 8.3 Server Agent (x86-64)" binPath= "\"C:\Program Files\1cv8\8.3.24.1342\bin\ragent.exe\" -debug -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d \"C:\Program Files\1cv8\srvinfo\""
Сделайте экспорт раздела службы из regedit перед правкой: одна потерянная кавычка — и служба не стартует.
Шаг 4. Перезапустите службу
При перезапуске агента обрываются все сеансы пользователей на этом сервере, несохранённые документы пропадут. Предупредите людей и перезапускайте в нерабочее время.
net stop "1C:Enterprise 8.3 Server Agent (x86-64)"
net start "1C:Enterprise 8.3 Server Agent (x86-64)"
Можно и через оснастку services.msc. После старта проверьте sc qc ещё раз: ключ -debug должен быть в строке.
Способ 2. Отладка на сервере 1С под Linux
На Linux ключ передают так же, меняется только место, где записана строка запуска. Оно зависит от того, как установлен сервер.
Старая схема: init-скрипт и файл настроек
Если служба называется srv1cv83 и запускается скриптом из /etc/init.d/, параметры лежат в отдельном файле:
/etc/sysconfig/srv1cv83— в дистрибутивах семейства RHEL;/etc/default/srv1cv83— в Debian и Ubuntu.
Найдите в нём строку с SRV1CV8_DEBUG, раскомментируйте и поставьте единицу:
SRV1CV8_DEBUG=1
Затем перезапустите службу (сеансы пользователей оборвутся):
sudo systemctl restart srv1cv83
Новая схема: unit-файл systemd
В свежих версиях платформы сервер регистрируется как unit systemd с номером версии в имени. Посмотрите, как он называется и что запускает:
systemctl list-units --all | grep -i srv1cv8
systemctl cat <имя-юнита>
В выводе systemctl cat найдите строку ExecStart с вызовом ragent. Править файл в каталоге платформы не надо — при обновлении он перезапишется. Создайте переопределение:
sudo systemctl edit <имя-юнита>
И впишите в открывшийся редактор:
[Service]
ExecStart=
ExecStart=<скопированная строка ExecStart> -debug
Пустой ExecStart= обязателен: он сбрасывает исходную команду, иначе systemd откажется запускать сервис с двумя командами. Потом:
sudo systemctl daemon-reload
sudo systemctl restart <имя-юнита>
ps aux | grep ragent
В выводе ps у процесса ragent должен появиться -debug.
💡 При HTTP-отладке на Linux добавьте -debug -http и откройте в файрволе порт сервера отладки, по умолчанию 1550.
Способ 3. Временный запуск ragent из консоли
Когда службу трогать нельзя (например, она настроена подрядчиком) или отладка нужна на час, агент запускают вручную.
- Остановите службу агента (сеансы оборвутся).
- Откройте командную строку от имени администратора.
- Запустите
ragentс теми же параметрами, что в службе, но без-srvcи с ключом-debug:
"C:\Program Files\1cv8\8.3.24.1342\bin\ragent.exe" -debug -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
- Не закрывайте окно: пока оно открыто, сервер работает в режиме отладки.
- После отладки закройте окно (Ctrl+C) и снова запустите службу — она стартует без
-debug.
Каталог -d указывайте тот же, что у службы. Иначе агент создаст новый пустой кластер, и ваших баз в нём не окажется.
Агент из консоли работает от имени текущего пользователя, а не от учётной записи службы. Если у пользователя нет прав на каталог srvinfo, каталог журналов или сетевые ресурсы, поведение будет отличаться от рабочего.
Что можно сделать в консоли администрирования кластера
Включить отладку из консоли нельзя: ключ задаётся только при запуске агента. Но консоль пригодится:
- 👀 найти сеанс программиста и фоновые задания в списке сеансов;
- 🔄 после перезапуска убедиться, что рабочие процессы
rphostподнялись заново; - ⛔ завершить зависший сеанс, если код остановлен на точке останова, а программист ушёл.
Перед завершением сеанса предупредите его владельца: несохранённые данные пропадут.
Подключение отладчика к серверу и проверка
Ключ на сервере — половина дела. Теперь Конфигуратор нужно подключить к серверным предметам отладки.
- Откройте Конфигуратор клиент-серверной базы.
- Убедитесь, что протокол в
Сервис → Параметры(закладка «Отладка») совпадает с серверным. - Откройте
Отладка → Подключение. - Нажмите «Автоматическое подключение» и отметьте нужные типы: сервер, фоновые задания, HTTP-сервисы, веб-сервисы.
- Запустите клиента из Конфигуратора (F5) и выполните действие с точкой останова.
Если в окне подключения появились серверные предметы отладки, а точка останова в &НаСервере срабатывает — всё включено.
Запустить клиента в режиме отладки можно и без Конфигуратора, ключами командной строки:
"C:\Program Files\1cv8\8.3.24.1342\bin\1cv8.exe" ENTERPRISE /S "srv1c\buh" /DEBUG -http /DEBUGGERURL "http://devpc:1550"
Здесь srv1c\buh — сервер и имя базы, devpc — компьютер, где запущен отладчик. Клиент сам подключится к нему.
sc qc или ps aux | grep ragent: есть ли -debug. Если ключ есть — служба не была перезапущена после правки.-debug -http, а в Конфигураторе выбран TCP, или наоборот.-d. Запустите с тем же путём к srvinfo, что в службе.Технологический журнал при отладке: что писать и что отсекать
Пошаговая отладка помогает, когда ошибку можно повторить руками. Если сбой случайный или у одного пользователя раз в день — нужен технологический журнал. Он пишет события сервера в файлы и включается файлом logcfg.xml.
Файл кладут в каталог conf платформы:
- Windows:
C:\Program Files\1cv8\conf\logcfg.xml; - Linux:
/opt/1cv8/conf/logcfg.xmlили каталогconfконкретной версии.
Перезапуск не нужен: платформа сама перечитывает файл, обычно в течение минуты.
Пример: только исключения и долгие обращения к СУБД, хранение 24 часа.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="D:\1c_tj" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="DBMSSQL"/>
<gt property="duration" value="1000000"/>
</event>
<property name="all"/>
</log>
</config>
Как читать параметры:
location— каталог журнала, лучше на отдельном диске, не системном;history— сколько часов хранить, старые файлы платформа удаляет сама;<eq>,<ne>,<gt>,<lt>— фильтры: «равно», «не равно», «больше», «меньше»;durationв 8.3 задаётся в микросекундах, поэтому1000000— это одна секунда.
Что исключать из записи
Журнал без фильтров на нагруженном сервере пишет гигабайты в час. Отсекайте лишнее сразу:
- 🚫 не пишите все события подряд: условие
<ne property="name" value="..."/>без других фильтров оставляет почти весь поток; - 🎯 ограничивайте журнал одной базой: добавьте в событие
<eq property="p:processName" value="buh"/>, гдеbuh— имя базы в кластере; - ⏱ для запросов к СУБД ставьте порог по
duration, иначе в журнал попадут тысячи быстрых запросов; - 👤 для разбора жалобы конкретного человека фильтруйте по свойству
Usr.
Каталог location должен быть пустым и использоваться только для журнала. Учётной записи службы агента нужны права на запись в него.
Как выключить отладку и навести порядок после разбора
Отладку на продуктивном сервере выключают сразу после работы. Порядок такой:
- Отключите Конфигуратор от предметов отладки и закройте его.
- Уберите ключ
-debug(и-http, если добавляли) изImagePath, изSRV1CV8_DEBUGили из переопределения systemd. Для systemd проще всего удалить переопределение:sudo systemctl revert <имя-юнита>. - Перезапустите службу агента в нерабочее время — сеансы пользователей оборвутся.
- Удалите или переименуйте
logcfg.xml. Подождите пару минут, пока платформа перестанет писать журнал. - Скопируйте нужные файлы журнала в архив для разбора, остальное удалите из каталога
location.
Разбирать журнал удобно не на самом сервере: скопируйте файлы .log на рабочую машину и ищите по ним findstr или grep. Каждая строка начинается с времени события и длительности, дальше идёт имя события, например EXCP или DBMSSQL.
Частые вопросы
Нужна ли отдельная лицензия для режима отладки на сервере?
-debug не требует отдельной лицензии. Сеанс Конфигуратора и запущенный из него клиент занимают лицензии как обычные сеансы.Можно ли включить отладку только для одной базы?
Сильно ли режим отладки тормозит сервер?
Как защитить HTTP-отладку паролем?
-debugServerPwd с паролем. Тот же пароль затем вводят при подключении из Конфигуратора. Порт сервера отладки не открывайте наружу.