Поиск причины сбоя в 1С: от текста ошибки до точки останова

· 9 мин

Содержание

Чтобы отладить ошибку в 1С, начните с подробного текста ошибки: он называет модуль и номер строки. Дальше откройте конфигуратор, включите Отладка → Остановка по ошибке, повторите действие и посмотрите стек вызовов и значения переменных в момент сбоя. Если ошибка не воспроизводится у вас, ищите её в журнале регистрации, а для редких и серверных сбоев включайте технологический журнал.

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

СитуацияОсновной инструментЧто получите
Ошибка повторяется по шагамОтладчик конфигуратора или EDTСтроку, стек, значения переменных
Ошибка была, повторить не удаётсяЖурнал регистрацииВремя, пользователя, текст и данные
Сбой на сервере, блокировки, паденияТехнологический журналСобытия EXCP, TLOCK, TDEADLOCK
Неверные цифры без сообщения об ошибкеКонсоль запросов + отладчикГде теряются или дублируются строки

Читаем текст ошибки: что в нём уже есть

Короткое окно с ошибкой почти бесполезно. Нажмите в нём ссылку Подробно или Подробный текст ошибки и скопируйте всё содержимое. Там будет:

  • 📍 Модуль, например {Документ.РеализацияТоваровУслуг.МодульОбъекта(245)} — имя объекта, вид модуля и номер строки в скобках.
  • 🧾 Сама строка кода, на которой произошёл сбой.
  • 📚 Цепочка вызовов: несколько блоков {...} подряд показывают, кто кого вызвал.
  • ⚠️ Текст исключения: Значение не является значением объектного типа, Поле объекта не обнаружено, Деление на 0 и т. п.

Первичная диагностика занимает пару минут:

  1. Посмотрите, что в цепочке — типовой модуль или доработка. Имена с префиксами вроде мс_, Доп, Расш и модули расширений указывают на доработку.
  2. Проверьте, есть ли ошибка у другого пользователя на той же операции. Если нет — дело в правах или в данных конкретного документа.
  3. Повторите действие в копии базы. Если в копии тоже падает, можно спокойно отлаживать там.
  4. Если в тексте написано Ошибка СУБД или есть упоминание блокировок, отладчик мало поможет — переходите к технологическому журналу.

Пустую строку в начале текста ошибки и слова по причине: не пропускайте. Всё, что идёт после по причине:, — исходное исключение, а то, что выше, — лишь обёртка над ним.

Встроенный отладчик 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 — Администрирование → Поддержка и обслуживание → Журнал регистрации;
  • в конфигураторе — Администрирование → Журнал регистрации.

Как отфильтровать без лишнего шума:

  1. Установите период — час-два вокруг времени, которое назвал пользователь.
  2. В отборе по уровню оставьте только Ошибка.
  3. Добавьте отбор по пользователю, если знаете, у кого был сбой.
  4. Откройте запись двойным щелчком. В поле комментария — текст ошибки, в поле данных — ссылка на документ или объект.

Записи без явной ошибки тоже полезны. Посмотрите, что пользователь делал за 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 лежат в подкаталогах по процессам и часам. Ищите в них по времени сбоя и по тексту ошибки обычным поиском по файлам или утилитами для разбора ТЖ.

Ошибки в запросах и данных: где теряются строки

Часть ошибок не выглядит как ошибка. Отчёт показывает не ту сумму, документ задваивает строки, проведение пишет движения с пустым складом. Тут отладка идёт через запросы.

Проверяем запрос по шагам

  1. Остановитесь отладчиком на строке Запрос.Выполнить().
  2. Через Shift+F9 вычислите Запрос.Текст и скопируйте его.
  3. Посмотрите параметры: Запрос.Параметры раскрывается в окне вычисления.
  4. Вставьте текст и параметры в консоль запросов и выполните отдельно.
  5. Если запрос пакетный, выполняйте пакеты по одному и смотрите, на каком появляются лишние или пропадают нужные строки.

Частые причины неверного результата

  • 🔗 Соединение «многие ко многим» — строки размножаются, суммы растут в разы.
  • 🕳 Условие на правую таблицу левого соединения в ГДЕ — левое соединение превращается во внутреннее, строки пропадают. Переносите условие в ПО.
  • 📅 Граница периода — &КонецПериода без КОНЕЦПЕРИОДА(..., ДЕНЬ) отрезает последний день.
  • 🧩 Составной тип — поле может быть ссылкой на разные справочники, и обращение через точку даёт NULL.
  • ⛔ NULL в арифметике — сумма с NULL даёт NULL. Оборачивайте поля в ЕСТЬNULL(Поле, 0).

Если подозрение на «битые» данные (ссылки на удалённые объекты, пустые обязательные поля), сначала найдите такие объекты отбором в списке или запросом. Тестирование и исправление информационной базы запускайте только после резервной копии и в монопольном режиме.

Изоляция: как сузить место ошибки

Когда кода много, а ошибка плавает, помогает метод исключения.

  • 🧪 Копия базы. Выгрузите .dt или скопируйте файловую базу и отлаживайте там. В рабочей базе отладчик тормозит пользователей, а эксперименты с данными опасны.
  • 🔌 Отключение расширений. В Администрирование → Печатные формы, отчёты и обработки → Расширения (БП 3.0) снимите флажок активности у расширения и повторите действие. Ушла ошибка — виновато расширение.
  • 📄 Минимальный пример. Скопируйте подозрительный кусок во внешнюю обработку и запустите его на одном документе. Без формы, без лишних вызовов.
  • ✂️ Деление пополам. Закомментируйте половину процедуры. Ошибка осталась — она в оставшейся половине. Повторяйте, пока не останется 3–5 строк.
  • 👤 Проверка под другим пользователем. Создайте тестового пользователя с той же ролью. Ошибка повторилась — это права, а не код.

Где работает код

Половина «непонятных» ошибок — в контексте выполнения. Процедура с директивой &НаСервере не видит переменных формы, &НаКлиенте не может обращаться к базе. Если в стеке вызов идёт с клиента на сервер, смотрите, какие параметры реально туда передаются: ссылки — да, сложные объекты вроде ТаблицаЗначений в клиентском контексте — нет.

Типовые ошибки 1С и с чего начать их разбор

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

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

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

Можно ли отлаживать прямо в рабочей базе?
Технически да, но остановка на точке в серверном коде держит транзакцию и блокировки, и другие пользователи начинают ждать. Отлаживайте в копии, а в рабочей базе ограничьтесь журналом регистрации и ТЖ.
Почему отладчик не останавливается на точке в серверном коде?
Обычно сервер запущен без ключа -debug или протокол отладки в конфигураторе не совпадает с сервером. Ещё одна причина — конфигурация базы данных не обновлена, и выполняется старый код.
Как отладить внешнюю обработку или отчёт?
Откройте файл .epf или .erf в конфигураторе через Файл → Открыть, поставьте точки останова и откройте ту же обработку в подключённом к отладке клиенте. Путь к файлу должен совпадать.
Как отладить код в веб-клиенте?
Запустите веб-клиент с параметром отладки и подключите его через Отладка → Подключение в конфигураторе. Для этого на веб-сервере должна быть разрешена отладка в публикации.
Что делать, если ошибка в типовом модуле без доработок?
Проверьте, что установлен актуальный релиз и обновление прошло полностью. Если ошибка повторяется на чистой копии с типовыми данными, это повод обратиться в поддержку разработчика конфигурации с подробным текстом ошибки.