Серверная отладка 1С 8.3: флаг -debug, конфигуратор и технологический журнал
Содержание
Чтобы включить отладку на сервере 1С, добавьте ключ -debug (лучше -debug -http) в строку запуска службы агента ragent.exe и перезапустите службу. Затем в конфигураторе выберите тот же протокол отладки и включите автоподключение к предмету «Сервер». Без этого ключа точки останова в серверных процедурах в клиент-серверной базе не срабатывают.
Для файловой базы ничего настраивать не нужно: серверный код там выполняется в процессе клиента, и отладчик видит его сразу. Всё, что ниже, касается клиент-серверного варианта: кластера 1С на Windows или Linux.
Как устроена серверная отладка и что подготовить
Отладчик конфигуратора не «залезает» в рабочий процесс сам. Рабочий процесс rphost должен быть запущен в режиме отладки и уметь отдавать отладчику информацию о выполняемом коде. Этот режим задаёт агент сервера ragent при старте.
Есть два протокола:
| Протокол | Ключ агента | Когда подходит | Ограничения |
|---|---|---|---|
| HTTP | -debug -http | Основной вариант для 8.3: фоновые задания, HTTP- и веб-сервисы, несколько разработчиков | Нужен доступ по сети к серверу отладки dbgs (по умолчанию порт 1550) |
| TCP/IP | -debug -tcp или просто -debug | Старые конфигураторы, простые сценарии на одной машине | Меньше предметов отладки, хуже работает через сеть |
Перед началом проверьте:
- 🔑 у вас есть права локального администратора на сервере (нужно менять параметры службы);
- 👥 есть окно, когда можно перезапустить службу 1С;
- 🧩 у пользователя конфигуратора есть право «Отладка» в роли (обычно у «Полных прав» оно есть);
- 🔌 между сервером и машиной разработчика открыты порты: 1540, 1541, диапазон рабочих процессов (по умолчанию 1560–1591) и порт отладки 1550 для HTTP.
Перезапуск службы агента обрывает все сеансы пользователей. Делайте его вечером или в согласованное технологическое окно, предупредив людей заранее.
Включаем отладку на сервере 1С: ключ -debug у службы агента
Windows
Служба агента обычно называется 1C:Enterprise 8.3 Server Agent (x86-64). Сначала посмотрите текущую строку запуска:
sc qc "1C:Enterprise 8.3 Server Agent (x86-64)"
В поле BINARY_PATH_NAME будет примерно такая строка:
"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"
Добавьте ключи отладки после -agent. Удобнее всего через реестр:
- Откройте
regeditот имени администратора. - Перейдите в
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и найдите раздел службы агента 1С. - Откройте параметр
ImagePath. - Допишите
-debug -httpпосле-agent, остальные ключи не трогайте. - Перезапустите службу в
services.msc(или командамиnet stop/net start).
Итоговая строка:
"C:\Program Files\1cv8\8.3.24.1586\bin\ragent.exe" -srvc -agent -debug -http -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
💡 После перезапуска откройте Диспетчер задач, вкладку «Подробности», и включите столбец «Командная строка». У процесса ragent.exe должен быть виден -debug. Если ключа нет — правили не ту службу (на сервере бывает несколько версий платформы).
Linux
На Linux порядок зависит от того, как запущен сервер:
- 📄 Старый скрипт
/etc/init.d/srv1cv83читает файл настроек (/etc/sysconfig/srv1cv83или/etc/default/srv1cv83). Там раскомментируйте строкуSRV1CV8_DEBUG=1и перезапустите службу. - ⚙️ Unit systemd в новых платформах передаёт ключи прямо в
ExecStart. Выполнитеsystemctl editдля юнита сервера 1С, переопределитеExecStart, добавив-debug -http, затемsystemctl daemon-reloadиsystemctl restart.
Проверка та же: ps aux | grep ragent должен показать ключ -debug.
Почему не через консоль и ras
Переключателя «включить отладку» в консоли администрирования кластера нет. Утилиты ras и rac управляют кластером, базами и сеансами, но режим отладки задаётся только при старте агента. rac при этом полезна для контроля: rac cluster list покажет кластеры, rac session list — сеансы, где видно, какой пользователь и с какого приложения сидит в базе. Остальные подкоманды смотрите в rac help.
Подключаем конфигуратор к отладке на сервере
Сервер запущен с -debug, теперь настраиваем сторону разработчика.
- В конфигураторе откройте
Сервис → Параметры, вкладку «Отладка». - В блоке отладки для данной информационной базы выберите тот же протокол, что у агента: HTTP или TCP/IP.
- Нажмите F5 (
Отладка → Начать отладку) или запустите пользовательский режим обычным способом. - Откройте
Отладка → Подключение. В HTTP-режиме здесь виден список предметов отладки: клиенты, серверные сеансы, фоновые задания. - Нажмите «Автоматическое подключение» и отметьте нужные типы: «Сервер», «Фоновое задание», «HTTP-сервис», «Веб-сервис».
Теперь точка останова в модуле с директивой &НаСервере или в общем модуле с флагом «Сервер» остановит выполнение.
Отладка чужого сеанса
Если ошибка воспроизводится только у конкретного пользователя, запустите его клиент с ключами отладки:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S "srv1c\buh" /Debug -http -attach /DebuggerURL "http://dev-pc:1550"
Сеанс сам появится в списке предметов отладки. Учтите, что пока выполнение стоит на точке останова, пользователь видит «зависшую» программу.
В HTTP-режиме рабочие процессы сервера сами подключаются к серверу отладки на машине разработчика. Если предметы «Сервер» в списке не появляются, первым делом проверьте брандмауэр: порт 1550 на ПК разработчика должен быть доступен с сервера 1С.
Уровни детализации: отладчик, замер и технологический журнал
Под словом «отладка» на сервере понимают три разных инструмента. Они отвечают на разные вопросы:
| Инструмент | Что показывает | Нагрузка | Когда брать |
|---|---|---|---|
| Пошаговая отладка | Значения переменных, стек вызовов в момент останова | Останавливает один сеанс | Ошибка в логике, неверный результат расчёта |
| Замер производительности | Время и число выполнений каждой строки кода | Умеренная, только на время замера | «Документ проводится 40 секунд» |
| Технологический журнал | События платформы: исключения, запросы к СУБД, блокировки | От минимальной до высокой, зависит от фильтров | Ошибки без воспроизведения, тормоза у всех |
Внутри технологического журнала тоже есть свои уровни. Чем шире набор событий, тем больше данных и тем выше нагрузка:
- 🟢 Минимум — только
EXCP(исключения) иQERR(ошибки компиляции запросов). Можно держать постоянно. - 🟡 Производительность —
CALL,SCALL,DBMSSQLилиDBPOSTGRSс фильтром по длительности. Включать на часы, не на недели. - 🔴 Блокировки —
TLOCK,TTIMEOUT,TDEADLOCK. Самый тяжёлый вариант, только на время разбора конкретной проблемы.
Настройка технологического журнала (logcfg.xml)
Журнал управляется файлом logcfg.xml. Он лежит в каталоге conf платформы: на Windows обычно C:\Program Files\1cv8\conf\, на Linux — /opt/1cv8/conf/ (или в каталоге conf конкретной версии). Создайте файл, если его нет.
Пример для поиска ошибок:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog\errors" history="48">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="QERR"/>
</event>
<property name="all"/>
</log>
</config>
Пример для медленных запросов (дольше одной секунды):
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog\slow" history="12">
<event>
<eq property="name" value="DBMSSQL"/>
<gt property="duration" value="1000000"/>
</event>
<event>
<eq property="name" value="CALL"/>
<gt property="duration" value="1000000"/>
</event>
<property name="all"/>
</log>
</config>
Пояснения к параметрам:
- ⏱
durationв 8.3 пишется в микросекундах: 1 секунда =1000000. - 🗂
history— сколько часов хранить файлы. Старше — платформа удалит сама. - 📁
location— отдельный каталог на диске с запасом места, не системныйC:.
💡 Перезапускать службу после правки logcfg.xml не нужно. Платформа перечитывает файл примерно раз в минуту. Включили, подождали, воспроизвели проблему.
Диагностика производительности на сервере 1С
Начинайте с замера, а не с журнала. Это быстрее и точнее показывает виновную строку.
- Убедитесь, что агент запущен с
-debug. Без него замер покажет только клиентский код, а серверные процедуры будут пустыми. - В конфигураторе запустите отладку и подключитесь к серверу.
- Включите
Отладка → Замер производительности. - В пользовательском режиме выполните медленную операцию: проведите документ, сформируйте отчёт.
- Выключите замер. Отсортируйте результат по колонке времени.
Обычно наверху оказывается одна из трёх вещей:
- 🐢 запрос внутри цикла — сотни одинаковых обращений к базе вместо одного;
- 🔒 ожидание блокировки — строка проста, а время огромное;
- 📦 обращение через точку к реквизитам ссылки в цикле (
Документ.Контрагент.ИНН), которое каждый раз читает объект из базы.
Если замер не воспроизводит тормоза (у разработчика всё быстро, у бухгалтеров медленно), включайте журнал с событиями CALL и DBMSSQL из примера выше. Он покажет реальные сеансы, реальных пользователей и реальное время.
Для запросов дополнительно можно включить запись планов: элемент <plansql/> внутри <config>. Это заметно нагружает сервер — включайте на 15–30 минут.
Анализ логов и поиск ошибок
Журнал раскладывается по папкам процессов: rphost_4120, ragent_2280, rmngr_3304. Внутри — файлы вида 26100714.log: год, месяц, день, час.
Каждая запись начинается с минут, секунд и длительности:
14:07.512003-2350112,DBMSSQL,5,process=rphost,p:processName=buh,Usr=Иванова,Sql='SELECT ...',Rows=18240,Context='Документ.РеализацияТоваровУслуг.МодульОбъекта : 245 : ...'
Здесь видно: запрос шёл 2,35 секунды, пользователь Иванова, база buh, вызван из модуля объекта реализации, строка 245. Поле Context — самое ценное: оно ведёт прямо к строке кода.
Быстрый поиск без специальных программ:
# Все исключения за сегодня по всем процессам
Get-ChildItem D:\techlog\errors -Recurse -Filter *.log |
Select-String -Pattern ",EXCP," |
Select-Object -First 50
На Linux то же делает grep -r ",EXCP," /var/log/1c/techlog/errors | head -50.
Что искать в первую очередь:
- ❌
EXCPсDescr=— текст ошибки, который пользователь видел в окне или не видел вовсе (ошибки фоновых заданий); - ⏳
TTIMEOUT— превышено время ожидания на блокировке, в записи есть список сеансов, которые держали ресурс; - 💥
TDEADLOCK— взаимоблокировка, в записи видна пара конфликтующих сеансов; - 🔁 одинаковый
Contextу сотен событий подряд — запрос в цикле.
Для больших журналов (гигабайты за час) удобнее отдельные анализаторы технологического журнала. Принцип тот же: группировка по Context и сумма duration.
Безопасность и очистка после отладки
Режим отладки на рабочем сервере не стоит оставлять включённым «на всякий случай»:
- 🔓 пользователь с правом «Отладка» может подключиться к чужому сеансу и увидеть значения переменных, включая персональные данные и суммы;
- 🧊 остановка на точке останова держит транзакцию и блокировки — у остальных встанут документы;
- 🌐 открытый порт отладки — лишняя точка входа в сеть.
Порядок после завершения работ:
- Удалите
-debug -httpизImagePath(или вернитеSRV1CV8_DEBUG=0на Linux). - Перезапустите службу в технологическое окно — снова оборвутся сеансы.
- В
logcfg.xmlоставьте только минимальный журнал ошибок или удалите файл совсем. - Удалите каталоги журнала. В них лежат тексты запросов и имена пользователей, а при включённом
<property name="all"/>— и значения параметров. - Закройте порт 1550 в брандмауэре, если открывали его только для отладки.
Не раздавайте право «Отладка» всем подряд через роль «Полные права» в рабочей базе. Для разработки держите копию базы, а на рабочем сервере включайте отладку адресно и на ограниченное время.
Частые вопросы
Замедляет ли ключ -debug работу сервера?
Можно ли отлаживать одну базу, не трогая остальные на том же кластере?
-debug действует на весь агент и все его базы. Ограничить отладку можно только правами пользователей в конкретной базе.Могут ли два разработчика отлаживать одну серверную базу одновременно?
Почему точка останова в обработчике проведения не срабатывает, хотя отладка включена?
Нужно ли перезапускать сервер после изменения logcfg.xml?
-debug в строке запуска агента.