Отладка серверного кода 1С: от настройки до технологического журнала

· 10 мин

Содержание

Процедура с директивой &НаСервере падает у пользователей, а у вас в тонком клиенте всё работает. Пошагово посмотреть, что происходит на сервере, можно двумя способами: запустить базу из конфигуратора в режиме отладки (клавиша F5) или подключить отладчик к уже работающему приложению через меню «Отладка → Подключение». Если отладчик недоступен, остаются журнал регистрации и технологический журнал.

Серверная отладка устроена иначе, чем клиентская. Код выполняется в отдельном процессе, поэтому отладчик должен до него «дотянуться»: нужен доступ по сети, нужный протокол и права. Именно на этом этапе спотыкается большинство разработчиков, а не на самих точках останова.

Ниже порядок действий, который работает и для файловой базы на своём компьютере, и для кластера серверов.

Что подготовить до запуска отладки

Сначала определите, где живёт база. От этого зависит, что придётся настраивать.

Вариант базыГде выполняется серверный кодЧто настраивать
ФайловаяВ процессе самого клиентаПочти ничего, отладка работает сразу
Клиент-серверная, свой кластерВ рабочем процессе rphostПротокол отладки, доступ по сети, права
Клиент-серверная, чужой серверТам жеСогласовать с администратором, лучше работать на копии

Не отлаживайте рабочую базу в рабочее время. Остановка на точке замораживает серверный вызов, и пользователи, которые обращаются к тому же коду, ждут вашего шага F10.

Делайте копию базы и отлаживайте на ней. Это снимает сразу три проблемы: не мешаете людям, не получите случайных изменений данных и можете спокойно проводить документы «вхолостую».

Что проверить перед стартом:

  • ✅ конфигурация в конфигураторе совпадает с той, что запущена в базе (иначе точки встанут «не туда»);
  • ✅ модуль не защищён от просмотра и не поставлен «на поддержку без возможности изменения» там, где вам нужен код;
  • ✅ платформа на компьютере разработчика той же версии, что на сервере, иначе отладчик может не подключиться;
  • ✅ база, которую вы отлаживаете, — копия, а не боевая.

Права и учётная запись

Пользователь, под которым вы входите в базу, должен иметь право запускать её в режиме разработки. Для начала отладки проще войти под пользователем с полными правами.

Отдельно подумайте о сервере. Служба агента сервера 1С запускается от своей учётной записи, и если у неё нет доступа к каталогам, портам и временным файлам, часть сценариев отладки молча не заработает. Когда отладка в клиент-серверном варианте не стартует, проблема чаще в сети и службе, чем в правах внутри 1С.

Протокол отладки

В клиент-серверном режиме отладчик соединяется с сервером по сетевому протоколу. Платформа поддерживает два варианта: TCP и HTTP. Выбор делают в настройках конфигуратора (раздел параметров запуска и отладки, найдите по слову «отладка») и в ключах запуска сервера.

Для локальной работы подходит TCP. Если между вами и сервером файрвол или прокси, удобнее HTTP: он не требует открывать широкий диапазон портов.

Сервер переводят в режим отладки ключом запуска агента -debug. Для HTTP-варианта добавляется -http. Пример строки для запуска агента вручную:

ragent.exe -debug -http -d "C:\srvinfo" -port 1540 -regport 1541 -range 1560:1591

Путь к каталогу сведений и порты у вас свои. Если сервер работает как служба Windows, этот ключ вписывают в параметры службы, после чего её перезапускают.

Запуск отладки: толстый клиент и другие режимы

Самый предсказуемый вариант — запуск из конфигуратора.

  1. Откройте конфигуратор нужной базы.
  2. Выберите в меню «Отладка» пункт «Начать отладку» или нажмите F5.
  3. Платформа запустит 1С:Предприятие в режиме отладки. Какой клиент запустится (толстый, тонкий, веб-клиент), задают в параметрах запуска.
  4. Выполните в программе действие, которое вызывает вашу процедуру.

Толстый клиент хорош для отладки по одной причине: он стабильно работает с отладчиком и показывает серверный вызов в той же связке, что и клиентский. Если проблема воспроизводится в любом клиенте, начинайте с него.

Подключение к уже запущенному приложению

Иногда ошибка проявляется только в живом сеансе: воспроизвести её с нуля долго. Тогда в конфигураторе откройте меню «Отладка → Подключение» и включите подключение для нужных типов приложений (клиент, сервер). После этого отладчик будет цеплять запускаемые сеансы.

Для запуска клиента с «прицепом» к отладчику используют ключ командной строки /DEBUG и адрес отладчика:

1cv8c.exe ENTERPRISE /S "srv01\base_copy" /DEBUG -http /DebuggerURL http://localhost:1550

Адрес и порт замените своими. В строке выше srv01 — имя сервера, base_copy — имя копии базы.

Если для отладки используете веб-клиент, сначала убедитесь, что отладка включена в параметрах публикации и в браузере открыта нужная вкладка. Для первых попыток надёжнее толстый клиент.

Точки останова и работа с контекстом

Точка останова ставится в нужной строке модуля клавишей F9 или щелчком в левом поле редактора. Когда выполнение дойдёт до этой строки, программа остановится, а конфигуратор выйдет на передний план.

Основные команды шагов:

  • F10 — шаг с обходом: выполняет строку целиком, не заходя в вызываемые процедуры;
  • F11 — шаг с заходом: идёт внутрь вызываемой процедуры;
  • Shift+F11 — шаг с выходом: выполняет остаток текущей процедуры и возвращается к месту вызова;
  • «Выполнить до курсора» — удобно, чтобы проскочить длинный цикл.

Не ставьте точку на первой же строке процедуры, которая вызывается тысячи раз. Лучше поставить её внутри Если с нужным условием или воспользоваться условной точкой останова.

Условные точки останова

Допустим, процедура обрабатывает 5000 строк документа, а падает на одной. Остановка на каждой строке — пытка. В свойствах точки останова задают условие, например:

Строка.Номенклатура.Артикул = "ТЕСТ-001"

Выполнение остановится только на строке с этим артикулом. Условие должно быть корректным выражением на встроенном языке, иначе точка просто не сработает.

Что смотреть на остановке

После остановки вам нужны три окна.

  1. Локальные переменные. Показывают всё, что объявлено в текущей процедуре: параметры, коллекции, ссылки.
  2. Табло. Сюда добавляют выражения, которые хотите видеть при каждом шаге: например, Объект.Проведен или ТаблицаДанных.Количество().
  3. Вычисление выражения (Shift+F9). Разовая проверка: выполнить запрос к объекту, получить реквизит ссылки, проверить результат функции.

В окне вычисления можно вызывать процедуры, которые меняют данные. Делайте это только на копии базы.

Контекст на сервере важно понимать правильно. В серверной процедуре нет форм, нет ЭтаФорма, нет клиентских данных: всё, что вы хотите проверить, должно прийти параметром или быть прочитано из базы. Если на остановке переменная пуста — значит, клиентский код не передал нужное значение, и искать ошибку надо до вызова.

Исключения: остановка по ошибке и разбор причин

Часто не нужно знать, где процедура идёт, нужно найти, где она падает. Для этого в меню «Отладка» есть пункт остановки по ошибке: отладчик прервёт выполнение в момент возникновения исключения и покажет место в коде.

Дальше работайте по цепочке:

  1. Прочитайте текст ошибки целиком, включая подробное представление.
  2. Откройте стек вызовов и найдите в нём первую процедуру из вашей конфигурации.
  3. Посмотрите значения переменных в этой точке: чаще всего это Неопределено, пустая ссылка или выход за границы коллекции.

Если ошибка перехватывается конструкцией Попытка … Исключение … КонецПопытки, отладчик с настройкой по умолчанию её «не увидит». Чтобы поймать такое исключение, включите остановку по любому исключению (в том же меню) и временно уберите перехват.

Не глотайте ошибку

Типичная ловушка:

Попытка
    ОбработатьДокумент(Ссылка);
Исключение
    // тишина
КонецПопытки;

Пользователь видит «ничего не произошло», а причину не найти. Минимум, который нужно делать в блоке Исключение, — записать подробное описание ошибки:

Исключение
    ЗаписьЖурналаРегистрации("Обработка документа",
        УровеньЖурналаРегистрации.Ошибка,
        Метаданные.Документы.РеализацияТоваровУслуг,
        Ссылка,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;

Здесь запись в журнал делается с подробным представлением, а ВызватьИсключение передаёт ошибку выше, чтобы она не потерялась.

Журнал регистрации как замена отладчику

Когда отладчик подключить нельзя (чужой сервер, боевая база, веб-клиент), записывайте точки контроля в журнал регистрации. Открывается он из конфигуратора через меню «Администрирование», а в обычном режиме — из раздела администрирования программы.

Для своих событий используйте процедуру ЗаписьЖурналаРегистрации с понятным именем события и уровнем:

УровеньКогда использовать
ИнформацияХод выполнения: «начало обработки», «обработано 120 строк»
ПредупреждениеНештатная, но не фатальная ситуация
ОшибкаИсключение, после которого операция не выполнена

Пишите в комментарий события значения, которые нужны для разбора: номер документа, ссылку на объект, количество строк. По имени события потом удобно отбирать записи отбором.

Не пишите в журнал в цикле по каждой строке большого документа. Журнал вырастет, а нужное найдёте с трудом. Достаточно записи на старте, при ошибке и по итогу.

Технологический журнал: когда нужна глубина

Технологический журнал (ТЖ) пишет не 1С-код, а сама платформа: вызовы, обращения к СУБД, блокировки, исключения. Он включается файлом logcfg.xml, который кладут в каталог conf платформы (для типовой установки в Windows это C:\Program Files\1cv8\conf). Платформа читает файл самостоятельно, перезапускать сервер обычно не нужно.

Минимальный пример: собрать все исключения на сервере.

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="C:\techlog\excp" history="24">
    <event>
      <eq property="name" value="EXCP"/>
    </event>
    <property name="all"/>
  </log>
</config>

Что здесь важно:

  • location — каталог, куда пишутся файлы; у учётной записи сервера должны быть права на запись;
  • history — сколько часов хранить файлы, после этого платформа удаляет старые;
  • EXCP — событие исключения;
  • property name="all" — записывать все свойства события.

Для разбора медленных процедур добавляют события CALL и SCALL (вызовы), а для запросов — DBMSSQL с условием по длительности. Условие по длительности нужно обязательно, иначе файлы растут очень быстро.

Не оставляйте технологический журнал включённым без ограничения по времени и по событиям. Он способен занять диск за несколько часов, а на рабочем сервере это остановит всех пользователей.

Читают ТЖ текстовым редактором или утилитами разбора: каждое событие — отдельная строка с метками времени, длительностью и свойствами. Начинайте с поиска по слову EXCP и текста ошибки, затем смотрите соседние события того же потока.

Если отладка не работает: типичные причины

Три сценария, которые вы встретите чаще остальных.

Точка останова серая или не срабатывает. Код модуля в конфигураторе отличается от того, что выполняется в базе. Обновите конфигурацию базы данных (F7) и перезапустите сеанс. Также проверьте, что процедура действительно серверная и выполняется там, где вы ждёте.

Отладчик не подключается к серверу. Проверьте по порядку: сервер запущен с ключом -debug; выбран тот же протокол, что в настройках конфигуратора; порты не закрыты файрволом; версия платформы совпадает.

Остановка есть, но данные «не те». Вы смотрите не тот сеанс. При одновременной работе нескольких пользователей отладчик может цеплять чужой вызов. Отключите лишние подключения или отлаживайте на отдельной копии.

Диагностика: выберите симптом

Порядок работы на практике

Когда нужно найти причину сбоя в серверной процедуре, действуйте по этой схеме: сначала воспроизведите ошибку на копии, затем включите остановку по ошибке и посмотрите стек. Если причина не очевидна, поставьте условные точки на подозрительных ветках. Если отладчик недоступен, добавьте записи в журнал и сверьтесь с ТЖ.

Перед серверной отладкой
Выполнено: 0 / 6

Частые вопросы

Можно ли отлаживать серверную процедуру в файловой базе?
Да. В файловом варианте серверный код выполняется в том же процессе, что и клиент, поэтому отладка запускается клавишей F5 без дополнительных настроек.
Почему в тонком клиенте точка останова не срабатывает, а в толстом срабатывает?
Подключение отладчика к тонкому клиенту требует отдельной настройки типов приложений в меню «Отладка → Подключение». Если она не включена, начните с толстого клиента.
Нужно ли перезапускать сервер, чтобы включить технологический журнал?
Обычно нет. Платформа сама перечитывает logcfg.xml. Перезапуск нужен, только если файл положили не в тот каталог или изменили параметры службы.
Как отладить фоновое задание или регламентное задание?
В отладчике включите подключение для соответствующего типа приложений. Если подключиться не удаётся, запишите ход выполнения в журнал регистрации: это надёжнее для долгих фоновых процессов.
Можно ли отлаживать конфигурацию на поддержке?
Отладчик читает код и ставит точки останова и на поддержке. Менять код без снятия с поддержки нельзя, но смотреть его выполнение можно.