Поиск причины сбоя в 1С: от текста ошибки до точки останова
Содержание
Чтобы отладить ошибку в 1С, начните с подробного текста ошибки: он называет модуль и номер строки. Дальше откройте конфигуратор, включите Отладка → Остановка по ошибке, повторите действие и посмотрите стек вызовов и значения переменных в момент сбоя. Если ошибка не воспроизводится у вас, ищите её в журнале регистрации, а для редких и серверных сбоев включайте технологический журнал.
Выбор метода зависит от ситуации. Ошибка повторяется по шагам — хватит отладчика. Возникает у одного пользователя раз в день — нужен журнал регистрации. Падает рабочий процесс сервера или ловятся блокировки — без технологического журнала не обойтись.
| Ситуация | Основной инструмент | Что получите |
|---|---|---|
| Ошибка повторяется по шагам | Отладчик конфигуратора или EDT | Строку, стек, значения переменных |
| Ошибка была, повторить не удаётся | Журнал регистрации | Время, пользователя, текст и данные |
| Сбой на сервере, блокировки, падения | Технологический журнал | События EXCP, TLOCK, TDEADLOCK |
| Неверные цифры без сообщения об ошибке | Консоль запросов + отладчик | Где теряются или дублируются строки |
Читаем текст ошибки: что в нём уже есть
Короткое окно с ошибкой почти бесполезно. Нажмите в нём ссылку Подробно или Подробный текст ошибки и скопируйте всё содержимое. Там будет:
- 📍 Модуль, например
{Документ.РеализацияТоваровУслуг.МодульОбъекта(245)}— имя объекта, вид модуля и номер строки в скобках. - 🧾 Сама строка кода, на которой произошёл сбой.
- 📚 Цепочка вызовов: несколько блоков
{...}подряд показывают, кто кого вызвал. - ⚠️ Текст исключения:
Значение не является значением объектного типа,Поле объекта не обнаружено,Деление на 0и т. п.
Первичная диагностика занимает пару минут:
- Посмотрите, что в цепочке — типовой модуль или доработка. Имена с префиксами вроде
мс_,Доп,Расши модули расширений указывают на доработку. - Проверьте, есть ли ошибка у другого пользователя на той же операции. Если нет — дело в правах или в данных конкретного документа.
- Повторите действие в копии базы. Если в копии тоже падает, можно спокойно отлаживать там.
- Если в тексте написано
Ошибка СУБДили есть упоминание блокировок, отладчик мало поможет — переходите к технологическому журналу.
Пустую строку в начале текста ошибки и слова по причине: не пропускайте. Всё, что идёт после по причине:, — исходное исключение, а то, что выше, — лишь обёртка над ним.
Встроенный отладчик 1С: как поймать ошибку в момент сбоя
Включаем отладку
Файловая база. Откройте конфигуратор и запустите клиент через Отладка → Начать отладку (F5) или Отладка → Подключение, если клиент уже запущен с ключом /DEBUG. Больше ничего не нужно.
Клиент-серверная база
. Отладка на сервере требует, чтобы служба агента сервера 1С была запущена с ключом -debug. Ключ дописывают в строку запуска службы ragent.exe, после чего службу перезапускают.
Перезапуск службы агента сервера обрывает сеансы всех пользователей кластера. Делайте это вне рабочего времени и предупредите людей заранее.
В конфигураторе проверьте Сервис → Параметры → Отладка: там выбирается протокол отладки (TCP или HTTP). Для HTTP платформа поднимает отдельный сервер отладки dbgs.exe. Протокол в конфигураторе и на сервере должен совпадать.
Остановка по ошибке — главный приём
Точку останова не нужно угадывать. Включите Отладка → Остановка по ошибке и поставьте флажок. Отладчик сам остановится на строке, где выброшено исключение, даже если ошибку потом перехватывает Попытка ... Исключение.
Если в коде много «нормальных» исключений и отладчик останавливается слишком часто, в том же окне можно задать фильтр по тексту ошибки. Тогда остановка будет только на нужном исключении.
Что смотреть в момент остановки
- 🔎 Вычислить выражение (Shift+F9) — значение любой переменной или выражения прямо сейчас. Можно вычислить
Объект.Товары.Количество()илиЗначениеЗаполнено(Контрагент). - 📚 Стек вызовов (Ctrl+Alt+C) — откуда пришли в эту процедуру. Двойной щелчок по строке стека переводит к вызывающему коду с его локальными переменными.
- 📋 Табло — список выражений, которые пересчитываются на каждом шаге.
- ⏭ Шаги: F11 — войти в процедуру, F10 — выполнить строку целиком, Shift+F11 — выйти из текущей процедуры.
Условные точки останова
Если ошибка возникает на 4 000-й строке табличной части, ставить обычную точку бесполезно. Поставьте точку (F9), откройте её свойства из списка точек останова и задайте условие, например СтрокаТЧ.Номенклатура.Пустая() или Счетчик = 4000. Отладчик пропустит все «правильные» итерации.
Фоновые задания и сервер
Ошибки в регламентных и фоновых заданиях выполняются не в вашем сеансе. Откройте Отладка → Подключение и в настройке автоматического подключения отметьте нужные типы предметов отладки: фоновые задания, серверные сеансы. После этого точки останова сработают и там.
Отладку можно вести и в 1С:EDT. Принцип тот же: точки останова, остановка по исключению, просмотр переменных. Отличается только интерфейс.
Журнал регистрации: ищем ошибку, которая уже случилась
Когда пользователь пишет «вчера не провёлся документ», повторить сбой часто не выходит. Тогда открывайте журнал регистрации:
- в БП 3.0, ЗУП 3.1, УТ 11 —
Администрирование → Поддержка и обслуживание → Журнал регистрации; - в конфигураторе —
Администрирование → Журнал регистрации.
Как отфильтровать без лишнего шума:
- Установите период — час-два вокруг времени, которое назвал пользователь.
- В отборе по уровню оставьте только
Ошибка. - Добавьте отбор по пользователю, если знаете, у кого был сбой.
- Откройте запись двойным щелчком. В поле комментария — текст ошибки, в поле данных — ссылка на документ или объект.
Записи без явной ошибки тоже полезны. Посмотрите, что пользователь делал за 5–10 минут до сбоя: какие документы записывал, обмен ли шёл в это время, запускалось ли обновление.
Своя запись в журнал из кода
Если подозрительный участок срабатывает редко, добавьте запись в журнал прямо в обработчик исключения:
Попытка
ВыполнитьРасчет(Объект);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Отладка.РасчетСебестоимости",
УровеньЖурналаРегистрации.Ошибка, , Объект.Ссылка, ТекстОшибки);
ВызватьИсключение;
КонецПопытки;
ВызватьИсключение без параметров пробрасывает исходную ошибку дальше. Так вы не «глушите» сбой, а только фиксируете его контекст с привязкой к документу.
Журнал регистрации может отключиться или урезаться настройкой уровня логирования. Если записей нет совсем, проверьте в конфигураторе Администрирование → Настройка журнала регистрации.
Технологический журнал: когда сбой глубже кода
Технологический журнал (ТЖ) пишет события платформы: исключения, запросы к СУБД, блокировки, падения процессов. Он нужен, когда текст ошибки содержит Ошибка СУБД, Превышено максимальное время ожидания предоставления блокировки, Конфликт блокировок или когда рабочий процесс сервера просто завершается.
Настройка — файл logcfg.xml в каталоге conf платформы (например, C:\Program Files\1cv8\conf). Минимальная конфигурация для поиска исключений:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\1c_techlog\excp" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
history="24" — хранить 24 часа, потом файлы удаляются сами. Платформа подхватывает изменения файла примерно за минуту, перезапуск не нужен.
Какие события включать под задачу:
| Событие | Что ловит | Когда включать |
|---|---|---|
EXCP | Исключения платформы | Непонятные падения, ошибки сервера |
TLOCK | Управляемые блокировки | Ожидание и таймауты блокировок |
TDEADLOCK | Взаимоблокировки | Ошибка «конфликт блокировок» |
DBMSSQL / DBPOSTGRS | Запросы к СУБД | Медленные запросы, ошибки СУБД |
Не включайте все события сразу на рабочем сервере. Журнал с DBMSSQL без фильтра по длительности за час занимает гигабайты и сам тормозит базу. Отбирайте по длительности, например <ge property="duration" value="..."/>, и по имени базы.
Файлы .log лежат в подкаталогах по процессам и часам. Ищите в них по времени сбоя и по тексту ошибки обычным поиском по файлам или утилитами для разбора ТЖ.
Ошибки в запросах и данных: где теряются строки
Часть ошибок не выглядит как ошибка. Отчёт показывает не ту сумму, документ задваивает строки, проведение пишет движения с пустым складом. Тут отладка идёт через запросы.
Проверяем запрос по шагам
- Остановитесь отладчиком на строке
Запрос.Выполнить(). - Через Shift+F9 вычислите
Запрос.Тексти скопируйте его. - Посмотрите параметры:
Запрос.Параметрыраскрывается в окне вычисления. - Вставьте текст и параметры в консоль запросов и выполните отдельно.
- Если запрос пакетный, выполняйте пакеты по одному и смотрите, на каком появляются лишние или пропадают нужные строки.
Частые причины неверного результата
- 🔗 Соединение «многие ко многим» — строки размножаются, суммы растут в разы.
- 🕳 Условие на правую таблицу левого соединения в
ГДЕ— левое соединение превращается во внутреннее, строки пропадают. Переносите условие вПО. - 📅 Граница периода —
&КонецПериодабезКОНЕЦПЕРИОДА(..., ДЕНЬ)отрезает последний день. - 🧩 Составной тип — поле может быть ссылкой на разные справочники, и обращение через точку даёт
NULL. - ⛔
NULLв арифметике — сумма сNULLдаётNULL. Оборачивайте поля вЕСТЬNULL(Поле, 0).
Если подозрение на «битые» данные (ссылки на удалённые объекты, пустые обязательные поля), сначала найдите такие объекты отбором в списке или запросом. Тестирование и исправление информационной базы запускайте только после резервной копии и в монопольном режиме.
Изоляция: как сузить место ошибки
Когда кода много, а ошибка плавает, помогает метод исключения.
- 🧪 Копия базы. Выгрузите
.dtили скопируйте файловую базу и отлаживайте там. В рабочей базе отладчик тормозит пользователей, а эксперименты с данными опасны. - 🔌 Отключение расширений. В
Администрирование → Печатные формы, отчёты и обработки → Расширения(БП 3.0) снимите флажок активности у расширения и повторите действие. Ушла ошибка — виновато расширение. - 📄 Минимальный пример. Скопируйте подозрительный кусок во внешнюю обработку и запустите его на одном документе. Без формы, без лишних вызовов.
- ✂️ Деление пополам. Закомментируйте половину процедуры. Ошибка осталась — она в оставшейся половине. Повторяйте, пока не останется 3–5 строк.
- 👤 Проверка под другим пользователем. Создайте тестового пользователя с той же ролью. Ошибка повторилась — это права, а не код.
Где работает код
Половина «непонятных» ошибок — в контексте выполнения. Процедура с директивой &НаСервере не видит переменных формы, &НаКлиенте не может обращаться к базе. Если в стеке вызов идёт с клиента на сервер, смотрите, какие параметры реально туда передаются: ссылки — да, сложные объекты вроде ТаблицаЗначений в клиентском контексте — нет.
Типовые ошибки 1С и с чего начать их разбор
Неопределено. В отладчике вычислите переменную перед точкой. Добавьте проверку ЗначениеЗаполнено() или найдите, почему поле не заполнилось.Количество() перед обращением.После исправления повторите исходный сценарий целиком, а не только упавшую строку. Исправление одной проверки часто вскрывает следующую ошибку ниже по коду.
Частые вопросы
Можно ли отлаживать прямо в рабочей базе?
Почему отладчик не останавливается на точке в серверном коде?
-debug или протокол отладки в конфигураторе не совпадает с сервером. Ещё одна причина — конфигурация базы данных не обновлена, и выполняется старый код.Как отладить внешнюю обработку или отчёт?
.epf или .erf в конфигураторе через Файл → Открыть, поставьте точки останова и откройте ту же обработку в подключённом к отладке клиенте. Путь к файлу должен совпадать.Как отладить код в веб-клиенте?
Отладка → Подключение в конфигураторе. Для этого на веб-сервере должна быть разрешена отладка в публикации.