Как найти ошибку в коде 1С: точки останова, табло и замер производительности

· 10 мин

Содержание

Отладку в 1С 8.3 запускают из Конфигуратора клавишей F5 (меню Отладка → Начать отладку), а точку останова ставят на строке модуля клавишей F9. Когда выполнение дойдёт до этой строки, программа замрёт, и в Конфигураторе можно смотреть значения переменных, идти по коду шаг за шагом и проверять результат запросов.

Это основной инструмент поиска ошибок в коде: вместо догадок «почему документ не проводится» вы видите, какая строка выполняется и что лежит в каждой переменной. Отладчик один для всех конфигураций — Бухгалтерии, ЗУП, УТ, своих разработок. Разница только в настройке для файловой и клиент-серверной базы.

Зачем нужна отладка в Конфигураторе

Отладчик отвечает на три вопроса: какой код реально выполняется, с какими данными и где именно ломается логика. Без него разработчик ставит Сообщить() в десяток мест и перезапускает программу снова и снова.

Типичные задачи, которые закрывает отладка:

  • 🐞 найти строку, на которой падает ошибка Ошибка при вызове метода контекста или Поле объекта не обнаружено;
  • 🔍 понять, почему проведение даёт не те движения: посмотреть таблицу движений до записи;
  • 🧮 проверить, что вернул запрос и какие параметры в него ушли;
  • 🧩 разобраться в чужом коде типовой конфигурации: куда ведёт вызов общего модуля, кто подписан на событие;
  • ⏱ найти медленный участок, из-за которого отчёт формируется минуту.

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

Как запустить отладку 1С 8.3 в файловой и серверной базе

Файловая база

Здесь настройка не нужна. Клиентский и серверный код выполняются в одном процессе на вашем компьютере.

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

Выбрать тип клиента (тонкий, толстый, веб-клиент) можно в Сервис → Параметры → Запуск 1С:Предприятия. Это важно, если ошибка воспроизводится только в одном из них.

Клиент-серверная база

В серверной базе код &НаСервере, модули объектов и регламентные задания выполняются в рабочих процессах кластера. Чтобы отладчик видел этот код, отладка должна быть включена на сервере 1С.

  1. На сервере откройте свойства службы агента сервера 1С (в реестре параметр ImagePath службы или командную строку запуска ragent.exe).
  2. Добавьте в строку запуска ключ -debug. Для отладки по протоколу HTTP — -debug -http.
  3. Перезапустите службу сервера 1С.
  4. В Конфигураторе откройте Сервис → Параметры → Отладка и выберите тот же протокол, что и на сервере.
  5. Запустите отладку F5.

Перезапуск службы сервера 1С обрывает сеансы всех пользователей всех баз кластера. Делайте это вечером или в согласованное технологическое окно, предупредив пользователей заранее.

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

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

Иногда ошибку не повторить из-под F5: она возникает у конкретного пользователя или в фоновом задании. Тогда пригодится окно Отладка → Подключение.

  • 👤 Предметы отладки — список сеансов, которые разрешили отладку. Выделите нужный и подключитесь.
  • ⚙️ Автоматическое подключение — отметьте типы: тонкий клиент, сервер, фоновое задание, HTTP-сервис, веб-сервис. Отладчик сам подцепит каждый новый такой сеанс.

Чтобы клиентский сеанс, запущенный не из Конфигуратора, появился в списке предметов, запускайте 1С:Предприятие с ключом командной строки /DEBUG.

Точки останова и пошаговое выполнение кода

Точка останова — метка на строке, где выполнение остановится. Ставится и снимается клавишей F9 или двойным щелчком по левому полю модуля. Строка помечается красным кружком.

Виды точек останова

ВидКак поставитьКогда нужна
ОбычнаяF9 на строкеОстановиться всегда, когда код дойдёт до строки
С условиемОтладка → Точка останова с условиемОстановиться только при нужных данных, например в цикле на 500-й строке
Остановка по ошибкеОтладка → Остановка по ошибкеНайти место исключения, когда неизвестно, где оно возникает

Условная точка экономит массу времени в циклах. Условие пишется на встроенном языке, например:

Номенклатура.Код = "00-00001234" И Количество = 0

Отладчик проверит выражение на каждом проходе и остановится только там, где оно истинно.

«Остановка по ошибке» особенно полезна в типовых конфигурациях. Ошибки там часто перехватываются в Попытка … Исключение, и пользователь видит обобщённое сообщение. Включите остановку по всем ошибкам или только по ошибкам с определённым текстом — и отладчик встанет ровно на строке, где исключение возникло.

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

Управление выполнением

Когда программа остановилась, текущая строка подсвечивается стрелкой. Дальше двигаетесь командами меню Отладка:

КомандаКлавишаЧто делает
Шагнуть вF11Выполнить строку и зайти внутрь вызываемой процедуры
Шагнуть черезF10Выполнить строку целиком, не заходя в вызовы
Шагнуть изShift+F11Дойти до конца текущей процедуры и вернуться в вызывающую
Идти до курсораShift+F10Выполнять до строки, где стоит курсор
Продолжить отладкуF5Идти до следующей точки останова
Завершить отладкуShift+F5Закрыть отлаживаемый сеанс

Стек вызовов

Отладка → Стек вызовов показывает цепочку процедур, которая привела к текущей строке. Двойной щелчок по строке стека открывает модуль на месте вызова, и там можно посмотреть локальные переменные того уровня.

Это главный приём для разбора типовой конфигурации. Ошибка возникает глубоко в общем модуле, а причина — в том, что передал документ тремя уровнями выше. Стек показывает этот путь целиком.

Анализ переменных: подсказка, табло и вычисление выражений

Всплывающая подсказка

Наведите курсор на переменную в остановленном коде — появится её значение. Для простых типов (число, строка, дата) этого хватает.

Табло

Отладка → Табло — окно, куда добавляете переменные и выражения для постоянного наблюдения. Значения пересчитываются после каждого шага. У табло несколько страниц: можно держать на одной реквизиты документа, на другой — промежуточные итоги.

Сложные значения раскрываются деревом. У объекта документа видно реквизиты, у табличной части — строки, у структуры — ключи и значения.

Вычислить выражение

Shift+F9 (или Отладка → Вычислить выражение) открывает окно, где можно выполнить любое выражение встроенного языка в текущем контексте:

Объект.Товары.Итог("Сумма")
Объект.Товары.Количество()
СтрДлина(ТекстЗапроса)
ТипЗнч(Контрагент)

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

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

Изменение значения на лету

В окне вычисления выражения и в табло значение переменной примитивного типа можно изменить и продолжить выполнение. Приём помогает проверить гипотезу: «а если бы здесь была другая дата» — без правки кода и перезапуска.

Отладка запросов и работа с данными

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

  1. Поставьте точку останова на строке Запрос.Выполнить(). Когда отладчик встанет, у вас будет готовый объект запроса.
  2. Проверьте текст. В табло добавьте Запрос.Текст. Текст можно скопировать и открыть в консоли запросов или конструкторе.
  3. Проверьте параметры. Запрос.Параметры — структура, в ней видно каждый параметр и его значение. Частая находка — пустая дата или ссылка не того типа.
  4. Посмотрите результат. В окне вычисления выражения выполните:
Запрос.Выполнить().Выгрузить()

Результат откроется таблицей значений. Сразу видно, сколько строк вернулось и что в колонках.

Временные таблицы

Если запрос пакетный и пишет промежуточные данные во временные таблицы, проверьте каждую из них. В актуальных версиях платформы 8.3 отладчик показывает содержимое менеджера временных таблиц: раскройте Запрос.МенеджерВременныхТаблиц в табло или окне вычисления — там будут таблицы и их строки.

Если такой возможности в вашей версии нет, выгрузите пакет целиком:

Запрос.ВыполнитьПакет()

Функция вернёт массив результатов — по одному на каждый запрос пакета. Раскройте нужный элемент и вызовите для него Выгрузить().

Проверка движений документа

Чтобы понять, что документ запишет в регистры, остановитесь в конце обработки проведения, до записи движений. В табло добавьте Движения.<ИмяРегистра> — это набор записей, который можно раскрыть таблицей. Сравните его с тем, что ожидаете увидеть в оборотно-сальдовой ведомости или в отчёте по регистру.

Замер производительности и журналы для поиска ошибок

Замер производительности

Когда код работает, но медленно, точки останова не помогут. Нужен замер.

  1. Запустите отладку.
  2. Включите Отладка → Замер производительности.
  3. Выполните медленную операцию в 1С:Предприятии.
  4. Выключите замер той же командой.

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

Что видно в замереВероятная причинаЧто делать
Одна строка с запросом выполнена 5000 разЗапрос внутри циклаВынести запрос из цикла, получить данные одним пакетом
Много времени на строке вида Ссылка.РеквизитЧтение объекта из базы на каждой итерацииПолучить нужные поля запросом заранее
Почти всё время — на одном вызове сервераТяжёлый серверный вызов из формыПроверить, не передаётся ли лишний объём данных

Журнал регистрации

Если ошибку нельзя поймать отладчиком — она возникает у пользователя раз в неделю или в регламентном задании ночью, — пишите информацию в журнал регистрации:

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

ПодробноеПредставлениеОшибки даёт не только текст, но и стек: модуль и строку. Журнал смотрят в 1С:Предприятии через Администрирование → Обслуживание → Журнал регистрации в БП 3.0 и ЗУП 3.1 или в Конфигураторе через Администрирование → Журнал регистрации. Отберите события по своему имени — и увидите все случаи с подробностями.

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

Для серверных проблем (взаимоблокировки, долгие запросы к СУБД, падения рабочих процессов) нужен технологический журнал. Он включается файлом logcfg.xml в каталоге conf платформы на сервере. В нём перечисляют события, которые нужно писать, например EXCP (исключения) и DBMSSQL (запросы к MS SQL Server).

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

Почему отладчик не останавливается на точке

Самая частая жалоба: точка стоит, а программа проходит мимо. Пройдитесь по симптомам.

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

Ещё одна причина — точка отключена в списке точек останова. Она тогда отображается бледным кружком; включите её флажком в Отладка → Список точек останова.

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

Можно ли отлаживать типовую конфигурацию на поддержке?
Да. Для точек останова и пошагового выполнения конфигурацию не нужно снимать с поддержки или включать возможность изменения. Код вы только читаете.
Работает ли отладка в расширениях конфигурации?
Да. Откройте модуль расширения в Конфигураторе через Конфигурация → Расширения конфигурации и ставьте точки как в основной конфигурации.
Как отладить код в веб-клиенте?
Выберите веб-клиент в настройках запуска Конфигуратора и включите отладку по протоколу HTTP. Клиентский код в браузере отлаживается так же, через точки останова.
Нужны ли права администратора для отладки?
Для запуска Конфигуратора нужны права на администрирование конфигурации. Для подключения к серверу с ключом -debug нужен доступ к службе сервера 1С, его обычно настраивает системный администратор.
Чем отладка в Конфигураторе отличается от отладки в EDT?
Принципы те же: точки останова, шаги, просмотр переменных. В 1С:EDT другой интерфейс, а отладка всегда идёт через HTTP-сервер отладки.