К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как найти ошибку в коде 1С: пошаговая диагностика

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

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

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

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

Чтение сообщения об ошибке: первый и главный шаг

Когда платформа 1С прерывает выполнение кода, она выводит окно с текстом ошибки. Многие пользователи закрывают это окно, не читая, хотя именно там содержится половина решения. В сообщении указано описание ошибки («Поле объекта не обнаружено», «Деление на ноль», «Метод объекта не обнаружен») и место возникновения — имя модуля и номер строки.

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

Типичные формулировки и их смысл: «Поле объекта не обнаружено (Наименование)» — код обращается к реквизиту, которого нет у объекта данного типа; «Значение не является значением объектного типа» — попытка вызвать метод у пустого значения или примитивного типа; «Ошибка при выполнении запроса» — синтаксическая или логическая ошибка в тексте запроса. Запишите точный текст, прежде чем закрывать окно.

Ошибка у всех пользователейПроблема в коде или конфигурации

Проверить модуль и строку из сообщения об ошибке

Ошибка у одного пользователяВероятны права или настройки

Проверить роли, RLS и персональные настройки

Ошибка на конкретном документеПроблема в данных

Проверить заполненность реквизитов этого документа

Ошибка после обновленияНесовместимость кода и данных

Проверить обработчики обновления и переименованные объекты

Отладчик: как остановить код в нужном месте

Отладка — основной инструмент поиска ошибки в коде 1С. В конфигураторе откройте меню «Отладка» → «Начать отладку» (или нажмите F5): платформа запустит клиентское приложение в отладочном режиме. Если база серверная, убедитесь, что отладка на сервере разрешена — сервер 1С должен быть запущен с параметром -debug, иначе серверный код останавливаться не будет.

Точка останова ставится кликом по левому полю редактора модуля или клавишей F9 на нужной строке. Когда выполнение кода доходит до этой строки, управление возвращается в конфигуратор, и вы можете пошагово двигаться по коду: F10 — шаг через вызов процедуры, F11 — шаг с заходом внутрь, Shift+F11 — выход из текущей процедуры.

Если ошибка возникает в неизвестном месте, включите остановку по ошибке: «Отладка» → «Остановка по ошибке». Платформа сама прервёт выполнение в момент исключения, и вы окажетесь ровно на сбойной строке с актуальными значениями всех переменных.

Порядок отладки
  1. 1
    Воспроизведите ошибку и запишите текст сообщения и стек вызовов
  2. 2
    В конфигураторе включите остановку по ошибке или поставьте точку останова в начале подозрительной процедуры
  3. 3
    Запустите отладку (F5) и повторите действия пользователя
  4. 4
    На остановке проверьте значения переменных через табло (Shift+F9) и окно выражений
  5. 5
    Пошагово (F10/F11) найдите строку, где значение становится неверным или возникает исключение
  6. 6
    Исправьте код, повторите сценарий и убедитесь, что ошибка ушла, а результат корректен

Табло и окно выражений

Для проверки значений используйте табло (Shift+F9): введите имя переменной или произвольное выражение, например ТаблицаТоваров.Количество() или ЗначениеЗаполнено(Документ.Контрагент). Окно «Выражения» позволяет держать набор проверяемых значений постоянно на виду и наблюдать, как они меняются при пошаговом выполнении.

Замер производительности

Если проблема не в ошибке, а в том, что код работает медленно или ведёт себя непредсказуемо из-за лишних обращений к базе, включите замер производительности («Отладка» → «Замер производительности»). Он покажет, какие строки и вызовы занимают основное время — часто «ошибкой» оказывается запрос в цикле, который к тому же возвращает не те данные.

Журнал регистрации: поиск ошибок, которые нельзя воспроизвести

Не все ошибки удаётся поймать отладчиком: фоновые задания, регламентные операции, обмены данными выполняются без участия пользователя. Здесь помогает журнал регистрации («Администрирование» → «Журнал регистрации» в режиме предприятия). Отфильтруйте события по уровню «Ошибка», периоду и пользователю — в комментарии события будет текст исключения и контекст выполнения.

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

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

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

Синтаксическая проверка и статический анализ

Часть ошибок находится вообще без запуска кода. В конфигураторе выполните «Конфигурация» → «Проверка конфигурации» и отметьте режимы проверки модулей: тонкий клиент, веб-клиент, сервер. Платформа найдёт необъявленные переменные, обращения к несуществующим методам, несоответствие числа параметров и другие дефекты, которые в рантайме превратились бы в исключения.

Обратите внимание на директивы компиляции: процедура, помеченная &НаКлиенте, не может вызывать серверные методы напрямую, и наоборот. Ошибки вида «Процедура или функция с указанным именем не определена» часто возникают именно из-за неправильного контекста исполнения, а не из-за опечатки.

Типичные ошибки при поиске
01
Исправление кода без воспроизведения ошибки — причина остаётся неизвестной, сбой возвращается на других данных
02
Правка сразу в рабочей базе без копии — риск усугубить проблему и потерять возможность отката
03
Проверка только на «хороших» данных — ошибка на пустых ссылках и незаполненных реквизитах остаётся незамеченной
04
Игнорирование стека вызовов — исправляется общий модуль, а не то место, откуда он вызван с неверными параметрами

Типовые дефекты кода и как их распознать

Обращение к пустым значениям — лидер среди причин сбоев. Перед вызовом метода объекта или обращением к реквизиту проверяйте значение: Если ЗначениеЗаполнено(Ссылка) Тогда ... КонецЕсли;, а для результатов запроса — Если Не Выборка.Следующий() Тогда .... Метод НайтиПоКоду() и похожие методы возвращают пустую ссылку, если объект не найден, а не Неопределено — эту разницу часто путают.

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

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

Ошибки в расширениях и после обновления

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

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

Маршрут решения

Как выбрать действие

Есть текст ошибки с модулем и строкойОткройте модуль на указанной строке и поставьте точку останова чуть выше
Ошибка возникает в фоновом или регламентном заданииСмотрите журнал регистрации и консоль заданий, добавьте запись ошибок в код
Ошибка появилась после обновленияПроверьте обработчики обновления и совместимость расширений
Ошибка только у одного пользователяПроверяйте права, RLS и данные, а не код
Код работает, но результат неверныйИспользуйте отладку с табло и проверяйте промежуточные значения по шагам

Проверка исправления и границы самостоятельной работы

Исправление считается завершённым только после проверки на тех же данных, где ошибка воспроизводилась, и на смежных сценариях: проведите документ, сформируйте отчёт, выполните обмен. Убедитесь, что не появились новые ошибки в журнале регистрации и что результаты операций корректны — сходятся суммы, количества, остатки.

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

Контрольные точки

Как проверить результат

Воспроизведение исходного сценария
Норма

Операция завершается без сообщений об ошибке

Тревожный признак

Ошибка повторяется или появилась новая

Журнал регистрации за период проверки
Норма

Нет новых событий с уровнем «Ошибка»

Тревожный признак

Появились ошибки в смежных операциях

Корректность данных
Норма

Суммы и остатки сходятся с ожидаемыми

Тревожный признак

Результат операции отличается от эталона

Смежные сценарии
Норма

Отчёты, печать, обмен работают как раньше

Тревожный признак

Исправление сломало соседний функционал

Итог

Что важно запомнить

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

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

Что делать, если ошибка возникает редко и не воспроизводится?

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

Почему точка останова не срабатывает на серверной базе?

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

Как найти ошибку в запросе, если код просто возвращает пустой результат?

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

Можно ли искать ошибку без конфигуратора?

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

Ошибка «Поле объекта не обнаружено» — это проблема кода или данных?

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