Как найти ошибку в коде 1С: точки останова, табло и замер производительности
Содержание
Отладку в 1С 8.3 запускают из Конфигуратора клавишей F5 (меню Отладка → Начать отладку), а точку останова ставят на строке модуля клавишей F9. Когда выполнение дойдёт до этой строки, программа замрёт, и в Конфигураторе можно смотреть значения переменных, идти по коду шаг за шагом и проверять результат запросов.
Это основной инструмент поиска ошибок в коде: вместо догадок «почему документ не проводится» вы видите, какая строка выполняется и что лежит в каждой переменной. Отладчик один для всех конфигураций — Бухгалтерии, ЗУП, УТ, своих разработок. Разница только в настройке для файловой и клиент-серверной базы.
Зачем нужна отладка в Конфигураторе
Отладчик отвечает на три вопроса: какой код реально выполняется, с какими данными и где именно ломается логика. Без него разработчик ставит Сообщить() в десяток мест и перезапускает программу снова и снова.
Типичные задачи, которые закрывает отладка:
- 🐞 найти строку, на которой падает ошибка
Ошибка при вызове метода контекстаилиПоле объекта не обнаружено; - 🔍 понять, почему проведение даёт не те движения: посмотреть таблицу движений до записи;
- 🧮 проверить, что вернул запрос и какие параметры в него ушли;
- 🧩 разобраться в чужом коде типовой конфигурации: куда ведёт вызов общего модуля, кто подписан на событие;
- ⏱ найти медленный участок, из-за которого отчёт формируется минуту.
Отладка ничего не меняет в базе сама по себе. Но код, который вы выполняете под отладчиком, работает с реальными данными. Документ, проведённый в режиме отладки, проведётся по-настоящему. Поэтому разбор ошибок ведите на копии базы, а не на рабочей.
Как запустить отладку 1С 8.3 в файловой и серверной базе
Файловая база
Здесь настройка не нужна. Клиентский и серверный код выполняются в одном процессе на вашем компьютере.
- Откройте базу в Конфигураторе.
- Если конфигурация менялась, обновите конфигурацию базы данных:
Конфигурация → Обновить конфигурацию базы данных(F7). При запуске отладки Конфигуратор сам предложит это сделать. - Нажмите
F5илиОтладка → Начать отладку. Откроется 1С:Предприятие, уже подключённое к отладчику. - Повторите действие, которое вызывает ошибку.
Выбрать тип клиента (тонкий, толстый, веб-клиент) можно в Сервис → Параметры → Запуск 1С:Предприятия. Это важно, если ошибка воспроизводится только в одном из них.
Клиент-серверная база
В серверной базе код &НаСервере, модули объектов и регламентные задания выполняются в рабочих процессах кластера. Чтобы отладчик видел этот код, отладка должна быть включена на сервере 1С.
- На сервере откройте свойства службы агента сервера 1С (в реестре параметр
ImagePathслужбы или командную строку запускаragent.exe). - Добавьте в строку запуска ключ
-debug. Для отладки по протоколу HTTP —-debug -http. - Перезапустите службу сервера 1С.
- В Конфигураторе откройте
Сервис → Параметры → Отладкаи выберите тот же протокол, что и на сервере. - Запустите отладку
F5.
Перезапуск службы сервера 1С обрывает сеансы всех пользователей всех баз кластера. Делайте это вечером или в согласованное технологическое окно, предупредив пользователей заранее.
Не держите включённую отладку на рабочем сервере постоянно: это лишняя нагрузка и возможность подключиться к чужим сеансам. Для разбора ошибок лучше иметь отдельный тестовый сервер или хотя бы копию базы .
Подключение к уже запущенному сеансу
Иногда ошибку не повторить из-под F5: она возникает у конкретного пользователя или в фоновом задании. Тогда пригодится окно Отладка → Подключение.
- 👤 Предметы отладки — список сеансов, которые разрешили отладку. Выделите нужный и подключитесь.
- ⚙️ Автоматическое подключение — отметьте типы: тонкий клиент, сервер, фоновое задание, HTTP-сервис, веб-сервис. Отладчик сам подцепит каждый новый такой сеанс.
Чтобы клиентский сеанс, запущенный не из Конфигуратора, появился в списке предметов, запускайте 1С:Предприятие с ключом командной строки /DEBUG.
Точки останова и пошаговое выполнение кода
Точка останова — метка на строке, где выполнение остановится. Ставится и снимается клавишей F9 или двойным щелчком по левому полю модуля. Строка помечается красным кружком.
Виды точек останова
| Вид | Как поставить | Когда нужна |
|---|---|---|
| Обычная | F9 на строке | Остановиться всегда, когда код дойдёт до строки |
| С условием | Отладка → Точка останова с условием | Остановиться только при нужных данных, например в цикле на 500-й строке |
| Остановка по ошибке | Отладка → Остановка по ошибке | Найти место исключения, когда неизвестно, где оно возникает |
Условная точка экономит массу времени в циклах. Условие пишется на встроенном языке, например:
Номенклатура.Код = "00-00001234" И Количество = 0
Отладчик проверит выражение на каждом проходе и остановится только там, где оно истинно.
«Остановка по ошибке» особенно полезна в типовых конфигурациях. Ошибки там часто перехватываются в Попытка … Исключение, и пользователь видит обобщённое сообщение. Включите остановку по всем ошибкам или только по ошибкам с определённым текстом — и отладчик встанет ровно на строке, где исключение возникло.
Список всех точек останова открывается через Отладка → Список точек останова. Там их можно временно отключить, не удаляя, и перейти к любой.
Управление выполнением
Когда программа остановилась, текущая строка подсвечивается стрелкой. Дальше двигаетесь командами меню Отладка:
| Команда | Клавиша | Что делает |
|---|---|---|
| Шагнуть в | F11 | Выполнить строку и зайти внутрь вызываемой процедуры |
| Шагнуть через | F10 | Выполнить строку целиком, не заходя в вызовы |
| Шагнуть из | Shift+F11 | Дойти до конца текущей процедуры и вернуться в вызывающую |
| Идти до курсора | Shift+F10 | Выполнять до строки, где стоит курсор |
| Продолжить отладку | F5 | Идти до следующей точки останова |
| Завершить отладку | Shift+F5 | Закрыть отлаживаемый сеанс |
Стек вызовов
Отладка → Стек вызовов показывает цепочку процедур, которая привела к текущей строке. Двойной щелчок по строке стека открывает модуль на месте вызова, и там можно посмотреть локальные переменные того уровня.
Это главный приём для разбора типовой конфигурации. Ошибка возникает глубоко в общем модуле, а причина — в том, что передал документ тремя уровнями выше. Стек показывает этот путь целиком.
Анализ переменных: подсказка, табло и вычисление выражений
Всплывающая подсказка
Наведите курсор на переменную в остановленном коде — появится её значение. Для простых типов (число, строка, дата) этого хватает.
Табло
Отладка → Табло — окно, куда добавляете переменные и выражения для постоянного наблюдения. Значения пересчитываются после каждого шага. У табло несколько страниц: можно держать на одной реквизиты документа, на другой — промежуточные итоги.
Сложные значения раскрываются деревом. У объекта документа видно реквизиты, у табличной части — строки, у структуры — ключи и значения.
Вычислить выражение
Shift+F9 (или Отладка → Вычислить выражение) открывает окно, где можно выполнить любое выражение встроенного языка в текущем контексте:
Объект.Товары.Итог("Сумма")
Объект.Товары.Количество()
СтрДлина(ТекстЗапроса)
ТипЗнч(Контрагент)
Для коллекций есть просмотр в виде таблицы: таблица значений, табличная часть, результат выгрузки показываются колонками и строками. Так удобно искать строку с пустой номенклатурой или нулевой ценой.
Если выражение вызывает функцию, которая что-то записывает в базу, запись произойдёт по-настоящему. Вычисляйте только чтение и проверки.
Изменение значения на лету
В окне вычисления выражения и в табло значение переменной примитивного типа можно изменить и продолжить выполнение. Приём помогает проверить гипотезу: «а если бы здесь была другая дата» — без правки кода и перезапуска.
Отладка запросов и работа с данными
Ошибки в запросах — самая частая причина «неправильных цифр». Порядок разбора такой.
- Поставьте точку останова на строке
Запрос.Выполнить(). Когда отладчик встанет, у вас будет готовый объект запроса. - Проверьте текст. В табло добавьте
Запрос.Текст. Текст можно скопировать и открыть в консоли запросов или конструкторе. - Проверьте параметры.
Запрос.Параметры— структура, в ней видно каждый параметр и его значение. Частая находка — пустая дата или ссылка не того типа. - Посмотрите результат. В окне вычисления выражения выполните:
Запрос.Выполнить().Выгрузить()
Результат откроется таблицей значений. Сразу видно, сколько строк вернулось и что в колонках.
Временные таблицы
Если запрос пакетный и пишет промежуточные данные во временные таблицы, проверьте каждую из них. В актуальных версиях платформы 8.3 отладчик показывает содержимое менеджера временных таблиц: раскройте Запрос.МенеджерВременныхТаблиц в табло или окне вычисления — там будут таблицы и их строки.
Если такой возможности в вашей версии нет, выгрузите пакет целиком:
Запрос.ВыполнитьПакет()
Функция вернёт массив результатов — по одному на каждый запрос пакета. Раскройте нужный элемент и вызовите для него Выгрузить().
Проверка движений документа
Чтобы понять, что документ запишет в регистры, остановитесь в конце обработки проведения, до записи движений. В табло добавьте Движения.<ИмяРегистра> — это набор записей, который можно раскрыть таблицей. Сравните его с тем, что ожидаете увидеть в оборотно-сальдовой ведомости или в отчёте по регистру.
Замер производительности и журналы для поиска ошибок
Замер производительности
Когда код работает, но медленно, точки останова не помогут. Нужен замер.
- Запустите отладку.
- Включите
Отладка → Замер производительности. - Выполните медленную операцию в 1С:Предприятии.
- Выключите замер той же командой.
Конфигуратор покажет список строк кода с числом выполнений, временем и долей от общего времени. Отсортируйте по времени — наверху окажется узкое место. Обычно это запрос в цикле или обращение к реквизиту ссылки через точку внутри перебора тысяч строк.
| Что видно в замере | Вероятная причина | Что делать |
|---|---|---|
| Одна строка с запросом выполнена 5000 раз | Запрос внутри цикла | Вынести запрос из цикла, получить данные одним пакетом |
Много времени на строке вида Ссылка.Реквизит | Чтение объекта из базы на каждой итерации | Получить нужные поля запросом заранее |
| Почти всё время — на одном вызове сервера | Тяжёлый серверный вызов из формы | Проверить, не передаётся ли лишний объём данных |
Журнал регистрации
Если ошибку нельзя поймать отладчиком — она возникает у пользователя раз в неделю или в регламентном задании ночью, — пишите информацию в журнал регистрации:
Попытка
ВыполнитьОбмен(Узел);
Исключение
ЗаписьЖурналаРегистрации("Обмен.Выгрузка",
УровеньЖурналаРегистрации.Ошибка,
,
Узел,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
ПодробноеПредставлениеОшибки даёт не только текст, но и стек: модуль и строку. Журнал смотрят в 1С:Предприятии через Администрирование → Обслуживание → Журнал регистрации в БП 3.0 и ЗУП 3.1 или в Конфигураторе через Администрирование → Журнал регистрации. Отберите события по своему имени — и увидите все случаи с подробностями.
Технологический журнал
Для серверных проблем (взаимоблокировки, долгие запросы к СУБД, падения рабочих процессов) нужен технологический журнал. Он включается файлом logcfg.xml в каталоге conf платформы на сервере. В нём перечисляют события, которые нужно писать, например EXCP (исключения) и DBMSSQL (запросы к MS SQL Server).
Технологический журнал без отборов быстро занимает гигабайты на диске сервера. Включайте только нужные события, задавайте срок хранения и выключайте журнал после разбора.
Почему отладчик не останавливается на точке
Самая частая жалоба: точка стоит, а программа проходит мимо. Пройдитесь по симптомам.
Ещё одна причина — точка отключена в списке точек останова. Она тогда отображается бледным кружком; включите её флажком в Отладка → Список точек останова.
Частые вопросы
Можно ли отлаживать типовую конфигурацию на поддержке?
Работает ли отладка в расширениях конфигурации?
Конфигурация → Расширения конфигурации и ставьте точки как в основной конфигурации.