Где сломался код 1С: ищем модуль и номер строки по шагам

· 10 мин

Содержание

Чтобы найти строку с ошибкой в 1С, раскройте подробный текст ошибки: в фигурных скобках там указан модуль, а в круглых — номер строки, например {Документ.РеализацияТоваровУслуг.МодульОбъекта(245)}. Дальше откройте этот модуль в Конфигураторе и нажмите Ctrl+G — «Перейти к строке». Это самый быстрый способ, он работает в большинстве случаев.

Типичная ситуация: бухгалтер проводит реализацию, а 1С отвечает Деление на 0 и больше ничего не говорит. Или ночной обмен падает, и к утру от ошибки остаётся одна запись. Ниже семь способов — от того, что доступно любому пользователю, до инструментов программиста. Способы подходят для платформы 8.3 и любых типовых конфигураций: БП 3.0, ЗУП 3.1, УТ 11, ERP.

Как прочитать адрес ошибки в её тексте

Платформа 8.3 почти всегда пишет, где именно произошёл сбой. Просто короткое окно этого не показывает.

  1. В окне ошибки раскройте подробное описание (ссылка или кнопка «Подробно» в нижней части окна).
  2. Если открылась форма «Отчёт об ошибке», разверните блок с информацией для технических специалистов.
  3. Скопируйте текст целиком: Ctrl+A, затем Ctrl+C.

Строка с адресом выглядит так:

{ОбщийМодуль.ПроведениеСервер.Модуль(1873)}: Ошибка при вызове метода контекста (Записать)
{Документ.РеализацияТоваровУслуг.МодульОбъекта(245)}: Деление на 0

Разбор адреса:

ЧастьЧто означаетПример
Тип объектаВетка дерева конфигурацииДокумент, Справочник, ОбщийМодуль
Имя объектаОбъект метаданныхРеализацияТоваровУслуг
МодульКакой модуль объектаМодульОбъекта, МодульМенеджера, Форма.ФормаДокумента.Форма
Число в скобкахНомер строки245
Текст после двоеточияЧто случилосьДеление на 0

Если строк с адресами несколько, это стек: цепочка вызовов, которая привела к сбою. О том, какую из них открывать, — в разделе про стек ниже.

Пользователю без доступа к Конфигуратору достаточно скопировать этот текст и отправить программисту. По адресу он найдёт место за минуту, а скриншот короткого окна почти бесполезен.

Чтобы перейти к строке:

  1. Откройте базу в Конфигураторе.
  2. Найдите объект в дереве конфигурации. Быстрее всего — поиском по имени: встаньте в дерево и начните набирать имя.
  3. Откройте нужный модуль из контекстного меню объекта.
  4. Нажмите Ctrl+G и введите номер строки.

Номер текущей строки и колонки виден в строке состояния внизу окна Конфигуратора.

Журнал регистрации: где искать строку с ошибкой задним числом

Окно ошибки закрыли, текст не сохранили. Или ошибка случилась в фоновом задании, где окна нет вовсе. Тогда идите в журнал регистрации.

Где он находится:

  • 📂 в режиме 1С:Предприятие в БП 3.0, ЗУП 3.1, УТ 11 — Администрирование → Обслуживание → Журнал регистрации;
  • 🛠 в Конфигураторе — Администрирование → Журнал регистрации.

Как отфильтровать нужное:

  1. Откройте отбор журнала.
  2. Задайте интервал: час-два вокруг момента сбоя.
  3. В уровнях оставьте только «Ошибка».
  4. При необходимости ограничьте пользователя или компьютер.
  5. Откройте запись двойным щелчком и прочитайте поле комментария.

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

Журнал хранит то, что разрешено в настройке. Если в Конфигураторе в Администрирование → Настройка журнала регистрации выбрано «Не регистрировать» или включено удаление старых записей, искать будет нечего. Проверьте настройку до того, как ошибка повторится.

Когда в журнале только краткий текст без строки, значит, код перехватил исключение и записал лишь КраткоеПредставлениеОшибки. Для своих доработок пишите в журнал подробное представление и пробрасывайте ошибку дальше:

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

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

Отладчик Конфигуратора: остановка прямо на ошибочной строке

Адрес найден, но непонятно, почему строка падает. На строке Цена = Сумма / Количество причина очевидна только тогда, когда видно, что Количество равно нулю. Это показывает отладчик.

Запуск отладки

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

Платформа остановится на строке, где возникло исключение, и подсветит её в модуле.

Что делать в точке остановки

  • 🔍 Наведите курсор на переменную — увидите её значение.
  • 🧮 Shift+F9 — «Вычислить выражение»: проверьте любое выражение, например Объект.Товары.Количество().
  • 📌 F9 — поставить или снять точку останова на текущей строке.
  • ▶️ F10 — шаг через вызов, F11 — шаг внутрь процедуры, Shift+F11 — выйти из процедуры.
  • 📋 Табло — окно для переменных, за которыми следите постоянно.

Если ошибка возникает не всегда, поставьте точку останова с условием. В контекстном меню точки останова задайте выражение, например Количество = 0. Отладчик остановится только тогда, когда условие истинно.

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

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

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

Для фоновых заданий и серверных вызовов откройте Отладка → Подключение и настройте автоматическое подключение к нужным предметам отладки. Иначе ошибка в регламентном задании пройдёт мимо отладчика.

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

Стек вызовов: какую строку открывать первой

Типичная ловушка: адрес указывает в общий модуль БСП, например в процедуру записи движений. Исправлять типовой общий модуль почти никогда не нужно. Ошибка пришла снизу — из кода, который туда передал неверные данные.

Правило чтения стека в тексте ошибки:

  1. Строки идут от места возникновения ошибки к месту, откуда началась цепочка.
  2. Первая строка — где исключение выброшено.
  3. Ищите в цепочке первую строку из вашего кода: доработанного модуля, расширения, внешней обработки.

В отладчике стек открывается командой Отладка → Стек вызовов (Ctrl+Alt+C). Двойной щелчок по строке стека переносит в модуль на эту строку. Значения переменных в табло тогда показываются для выбранного уровня. Так можно подняться на два-три вызова выше и увидеть, откуда пришёл пустой параметр.

Пример из практики. Ошибка Значение не является значением объектного типа (Контрагент) указывает в общий модуль печати. Поднимаемся по стеку и видим процедуру формирования печатной формы во внешней обработке. Там берут Документ.Контрагент.ИНН, а в документе контрагент не заполнен. Исправляется проверкой во внешней обработке, а не правкой типового кода.

Адрес вида {ВнешняяОбработка.ИмяОбработки.Форма.Форма.Форма(57)} указывает на внешний файл .epf. Откройте его в Конфигураторе через Файл → Открыть и переходите к строке так же через Ctrl+G.

Поиск по модулям и синтаксический контроль

Бывает, что адреса нет вовсе. Например, программист выводит своё сообщение через ВызватьИсключение "Не заполнен склад", а стек утерян. Тогда ищите по тексту.

Глобальный поиск по конфигурации

  1. В Конфигураторе нажмите Ctrl+Shift+F — откроется поиск во всех текстах.
  2. Введите фрагмент текста ошибки. Берите 2-3 характерных слова, без подставленных значений вроде номера документа.
  3. Выберите область: вся конфигурация, включая формы и макеты, если сообщение может быть в макете.
  4. Результаты откроются списком. Двойной щелчок ведёт к строке.

Если в базе есть расширения, проверьте и их: расширение открывается в Конфигураторе отдельно, через Конфигурация → Расширения конфигурации. Ошибка в перехваченном методе расширения часто выглядит как ошибка типового модуля.

Синтаксический контроль

Ошибки компиляции (Переменная не определена, Ожидается выражение) лучше ловить до запуска:

  • ✅ Ctrl+F7 в открытом модуле — синтаксический контроль этого модуля;
  • ✅ Конфигурация → Проверка конфигурации — проверка всей конфигурации с выбранными режимами (тонкий клиент, сервер, веб-клиент и другие).

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

Технологический журнал и дампы: если ошибка не оставляет следов

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

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

Техжурнал настраивается файлом logcfg.xml в папке conf установленной платформы, например C:\Program Files\1cv8\conf\. Минимальная настройка для поиска исключений:

<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\1C_techlog" history="24">
    <event>
      <eq property="name" value="EXCP"/>
    </event>
    <property name="all"/>
  </log>
</config>

Событие EXCP — исключительные ситуации. В записях есть описание ошибки и контекст выполнения со строками модулей. Параметр history задаёт, сколько часов хранить логи.

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

Дампы

Чтобы при аварийном завершении сохранялся дамп памяти, добавьте в logcfg.xml элемент:

<dump create="true" location="D:\1C_dumps" type="3"/>

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

Внешние инструменты для поиска ошибок в коде

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

ИнструментКогда помогаетОграничения
Замер производительности (Отладка → Замер производительности в Конфигураторе)Код не падает, а «зависает»: видно строки, на которые ушло времяНужен запуск под отладкой
1С:EDTОшибки подсвечиваются при вводе кода, удобная навигация по вызовам и поиск ссылокОтдельная среда, проект нужно импортировать
1С:АПК (автоматизированная проверка конфигураций)Массовая проверка доработок на типовые ошибки и нарушения стандартовСтавится отдельной базой
Анализаторы техжурналаБыстро сводят тысячи строк EXCP в таблицу по частотеСторонние утилиты, версии разные

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

Типичные ошибки и где их обычно искать

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

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

Удаление строк коллекции в цикле — классика для ошибки индекса. Безопасный вариант — обратный обход:

Для Сч = 1 По Объект.Товары.Количество() Цикл
    Строка = Объект.Товары[Объект.Товары.Количество() - Сч];
    Если Строка.Количество = 0 Тогда
        Объект.Товары.Удалить(Строка);
    КонецЕсли;
КонецЦикла;

Граница цикла вычисляется один раз до начала обхода. После удаления строки индекс Количество() - Сч указывает на следующую строку с конца, поэтому пропусков и выхода за границы нет.

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

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