Где сломался код 1С: ищем модуль и номер строки по шагам
Содержание
Чтобы найти строку с ошибкой в 1С, раскройте подробный текст ошибки: в фигурных скобках там указан модуль, а в круглых — номер строки, например {Документ.РеализацияТоваровУслуг.МодульОбъекта(245)}. Дальше откройте этот модуль в Конфигураторе и нажмите Ctrl+G — «Перейти к строке». Это самый быстрый способ, он работает в большинстве случаев.
Типичная ситуация: бухгалтер проводит реализацию, а 1С отвечает Деление на 0 и больше ничего не говорит. Или ночной обмен падает, и к утру от ошибки остаётся одна запись. Ниже семь способов — от того, что доступно любому пользователю, до инструментов программиста. Способы подходят для платформы 8.3 и любых типовых конфигураций: БП 3.0, ЗУП 3.1, УТ 11, ERP.
Как прочитать адрес ошибки в её тексте
Платформа 8.3 почти всегда пишет, где именно произошёл сбой. Просто короткое окно этого не показывает.
- В окне ошибки раскройте подробное описание (ссылка или кнопка «Подробно» в нижней части окна).
- Если открылась форма «Отчёт об ошибке», разверните блок с информацией для технических специалистов.
- Скопируйте текст целиком:
Ctrl+A, затемCtrl+C.
Строка с адресом выглядит так:
{ОбщийМодуль.ПроведениеСервер.Модуль(1873)}: Ошибка при вызове метода контекста (Записать)
{Документ.РеализацияТоваровУслуг.МодульОбъекта(245)}: Деление на 0
Разбор адреса:
| Часть | Что означает | Пример |
|---|---|---|
| Тип объекта | Ветка дерева конфигурации | Документ, Справочник, ОбщийМодуль |
| Имя объекта | Объект метаданных | РеализацияТоваровУслуг |
| Модуль | Какой модуль объекта | МодульОбъекта, МодульМенеджера, Форма.ФормаДокумента.Форма |
| Число в скобках | Номер строки | 245 |
| Текст после двоеточия | Что случилось | Деление на 0 |
Если строк с адресами несколько, это стек: цепочка вызовов, которая привела к сбою. О том, какую из них открывать, — в разделе про стек ниже.
Пользователю без доступа к Конфигуратору достаточно скопировать этот текст и отправить программисту. По адресу он найдёт место за минуту, а скриншот короткого окна почти бесполезен.
Чтобы перейти к строке:
- Откройте базу в Конфигураторе.
- Найдите объект в дереве конфигурации. Быстрее всего — поиском по имени: встаньте в дерево и начните набирать имя.
- Откройте нужный модуль из контекстного меню объекта.
- Нажмите
Ctrl+Gи введите номер строки.
Номер текущей строки и колонки виден в строке состояния внизу окна Конфигуратора.
Журнал регистрации: где искать строку с ошибкой задним числом
Окно ошибки закрыли, текст не сохранили. Или ошибка случилась в фоновом задании, где окна нет вовсе. Тогда идите в журнал регистрации.
Где он находится:
- 📂 в режиме 1С:Предприятие в БП 3.0, ЗУП 3.1, УТ 11 —
Администрирование → Обслуживание → Журнал регистрации; - 🛠 в Конфигураторе —
Администрирование → Журнал регистрации.
Как отфильтровать нужное:
- Откройте отбор журнала.
- Задайте интервал: час-два вокруг момента сбоя.
- В уровнях оставьте только «Ошибка».
- При необходимости ограничьте пользователя или компьютер.
- Откройте запись двойным щелчком и прочитайте поле комментария.
В комментарии типовые конфигурации обычно сохраняют полный текст исключения с тем же адресом в фигурных скобках. Для обменов, регламентных заданий и обновления информационной базы это основной источник.
Журнал хранит то, что разрешено в настройке. Если в Конфигураторе в Администрирование → Настройка журнала регистрации выбрано «Не регистрировать» или включено удаление старых записей, искать будет нечего. Проверьте настройку до того, как ошибка повторится.
Когда в журнале только краткий текст без строки, значит, код перехватил исключение и записал лишь КраткоеПредставлениеОшибки. Для своих доработок пишите в журнал подробное представление и пробрасывайте ошибку дальше:
Попытка
ЗагрузитьДанныеИзФайла(ИмяФайла);
Исключение
ЗаписьЖурналаРегистрации("МояЗагрузка.Ошибка",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
ВызватьИсключение без параметров внутри блока Исключение повторно выбрасывает ту же ошибку. Пользователь её увидит, а в журнале останется адрес строки.
Отладчик Конфигуратора: остановка прямо на ошибочной строке
Адрес найден, но непонятно, почему строка падает. На строке Цена = Сумма / Количество причина очевидна только тогда, когда видно, что Количество равно нулю. Это показывает отладчик.
Запуск отладки
- Откройте базу в Конфигураторе.
- Выберите
Отладка → Начать отладку → 1С:Предприятиеили нажмитеF5. - В меню
Отладкавключите пункт «Остановка по ошибке». - В открывшемся окне 1С:Предприятие повторите действие, которое вызывает ошибку.
Платформа остановится на строке, где возникло исключение, и подсветит её в модуле.
Что делать в точке остановки
- 🔍 Наведите курсор на переменную — увидите её значение.
- 🧮
Shift+F9— «Вычислить выражение»: проверьте любое выражение, напримерОбъект.Товары.Количество(). - 📌
F9— поставить или снять точку останова на текущей строке. - ▶️
F10— шаг через вызов,F11— шаг внутрь процедуры,Shift+F11— выйти из процедуры. - 📋 Табло — окно для переменных, за которыми следите постоянно.
Если ошибка возникает не всегда, поставьте точку останова с условием. В контекстном меню точки останова задайте выражение, например Количество = 0. Отладчик остановится только тогда, когда условие истинно.
Клиент-серверная база
В клиент-серверном варианте серверный код выполняется в рабочем процессе кластера. Чтобы отладчик заходил в него, на сервере 1С должна быть разрешена отладка: служба агента сервера запускается с ключом -debug.
Добавить ключ можно только с перезапуском службы сервера 1С. Перезапуск обрывает сеансы всех пользователей базы — делайте это вне рабочего времени и предупредите людей заранее.
Для фоновых заданий и серверных вызовов откройте Отладка → Подключение и настройте автоматическое подключение к нужным предметам отладки. Иначе ошибка в регламентном задании пройдёт мимо отладчика.
На рабочей базе отладку лучше не вести. Сделайте копию через выгрузку .dt и ищите ошибку там: в точке останова транзакция висит, и другие пользователи могут упереться в блокировки.
Стек вызовов: какую строку открывать первой
Типичная ловушка: адрес указывает в общий модуль БСП, например в процедуру записи движений. Исправлять типовой общий модуль почти никогда не нужно. Ошибка пришла снизу — из кода, который туда передал неверные данные.
Правило чтения стека в тексте ошибки:
- Строки идут от места возникновения ошибки к месту, откуда началась цепочка.
- Первая строка — где исключение выброшено.
- Ищите в цепочке первую строку из вашего кода: доработанного модуля, расширения, внешней обработки.
В отладчике стек открывается командой Отладка → Стек вызовов (Ctrl+Alt+C). Двойной щелчок по строке стека переносит в модуль на эту строку. Значения переменных в табло тогда показываются для выбранного уровня. Так можно подняться на два-три вызова выше и увидеть, откуда пришёл пустой параметр.
Пример из практики. Ошибка Значение не является значением объектного типа (Контрагент) указывает в общий модуль печати. Поднимаемся по стеку и видим процедуру формирования печатной формы во внешней обработке. Там берут Документ.Контрагент.ИНН, а в документе контрагент не заполнен. Исправляется проверкой во внешней обработке, а не правкой типового кода.
Адрес вида {ВнешняяОбработка.ИмяОбработки.Форма.Форма.Форма(57)} указывает на внешний файл .epf. Откройте его в Конфигураторе через Файл → Открыть и переходите к строке так же через Ctrl+G.
Поиск по модулям и синтаксический контроль
Бывает, что адреса нет вовсе. Например, программист выводит своё сообщение через ВызватьИсключение "Не заполнен склад", а стек утерян. Тогда ищите по тексту.
Глобальный поиск по конфигурации
- В Конфигураторе нажмите
Ctrl+Shift+F— откроется поиск во всех текстах. - Введите фрагмент текста ошибки. Берите 2-3 характерных слова, без подставленных значений вроде номера документа.
- Выберите область: вся конфигурация, включая формы и макеты, если сообщение может быть в макете.
- Результаты откроются списком. Двойной щелчок ведёт к строке.
Если в базе есть расширения, проверьте и их: расширение открывается в Конфигураторе отдельно, через Конфигурация → Расширения конфигурации. Ошибка в перехваченном методе расширения часто выглядит как ошибка типового модуля.
Синтаксический контроль
Ошибки компиляции (Переменная не определена, Ожидается выражение) лучше ловить до запуска:
- ✅
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 Тогда
Объект.Товары.Удалить(Строка);
КонецЕсли;
КонецЦикла;
Граница цикла вычисляется один раз до начала обхода. После удаления строки индекс Количество() - Сч указывает на следующую строку с конца, поэтому пропусков и выхода за границы нет.