Разработка и Конфигурация · 11 мин
Как найти ошибку в коде 1С: пошаговая диагностика
Как найти ошибку в коде 1С: отладчик, журнал регистрации, типовые причины сбоев, пошаговая диагностика и проверка результата без риска для данных.
Ошибка в коде 1С почти всегда проявляется одним из трёх способов: платформа показывает окно с текстом ошибки и стеком вызовов, операция молча завершается с неверным результатом, либо сеанс пользователя аварийно закрывается. Каждый сценарий требует своего подхода к поиску причины, и главный инструмент здесь — не перебор кода «на глаз», а системная диагностика: воспроизведение ошибки, чтение сообщения платформы и точечная отладка.
Наиболее частые причины сбоев в коде 1С — обращение к несуществующему реквизиту или методу, работа с пустой ссылкой или значением Неопределено, деление на ноль, ошибки в запросах и обращения к данным, которых нет в базе. Значительная часть таких ошибок возникает не в момент написания кода, а при изменении конфигурации: переименовали реквизит — и все старые обращения к нему начинают падать.
Перед началом поиска зафиксируйте условия воспроизведения: какой пользователь, какая операция, какие данные в документе или отчёте. Ошибка, которая возникает только у одного пользователя или только с конкретным документом, почти всегда связана с данными или правами, а не с самим кодом — и это сразу сужает зону поиска.
Чтение сообщения об ошибке: первый и главный шаг
Когда платформа 1С прерывает выполнение кода, она выводит окно с текстом ошибки. Многие пользователи закрывают это окно, не читая, хотя именно там содержится половина решения. В сообщении указано описание ошибки («Поле объекта не обнаружено», «Деление на ноль», «Метод объекта не обнаружен») и место возникновения — имя модуля и номер строки.
Кнопка «Подробно» раскрывает стек вызовов — цепочку процедур и функций, которая привела к ошибке. Это важно, когда сбойная строка находится в общем модуле, вызываемом из десятков мест: по стеку видно, какая именно операция пользователя привела к падению, и какие параметры передавались по цепочке.
Типичные формулировки и их смысл: «Поле объекта не обнаружено (Наименование)» — код обращается к реквизиту, которого нет у объекта данного типа; «Значение не является значением объектного типа» — попытка вызвать метод у пустого значения или примитивного типа; «Ошибка при выполнении запроса» — синтаксическая или логическая ошибка в тексте запроса. Запишите точный текст, прежде чем закрывать окно.
Проверить модуль и строку из сообщения об ошибке
Проверить роли, RLS и персональные настройки
Проверить заполненность реквизитов этого документа
Проверить обработчики обновления и переименованные объекты
Отладчик: как остановить код в нужном месте
Отладка — основной инструмент поиска ошибки в коде 1С. В конфигураторе откройте меню «Отладка» → «Начать отладку» (или нажмите F5): платформа запустит клиентское приложение в отладочном режиме. Если база серверная, убедитесь, что отладка на сервере разрешена — сервер 1С должен быть запущен с параметром -debug, иначе серверный код останавливаться не будет.
Точка останова ставится кликом по левому полю редактора модуля или клавишей F9 на нужной строке. Когда выполнение кода доходит до этой строки, управление возвращается в конфигуратор, и вы можете пошагово двигаться по коду: F10 — шаг через вызов процедуры, F11 — шаг с заходом внутрь, Shift+F11 — выход из текущей процедуры.
Если ошибка возникает в неизвестном месте, включите остановку по ошибке: «Отладка» → «Остановка по ошибке». Платформа сама прервёт выполнение в момент исключения, и вы окажетесь ровно на сбойной строке с актуальными значениями всех переменных.
- 1Воспроизведите ошибку и запишите текст сообщения и стек вызовов
- 2В конфигураторе включите остановку по ошибке или поставьте точку останова в начале подозрительной процедуры
- 3Запустите отладку (F5) и повторите действия пользователя
- 4На остановке проверьте значения переменных через табло (Shift+F9) и окно выражений
- 5Пошагово (F10/F11) найдите строку, где значение становится неверным или возникает исключение
- 6Исправьте код, повторите сценарий и убедитесь, что ошибка ушла, а результат корректен
Табло и окно выражений
Для проверки значений используйте табло (Shift+F9): введите имя переменной или произвольное выражение, например ТаблицаТоваров.Количество() или ЗначениеЗаполнено(Документ.Контрагент). Окно «Выражения» позволяет держать набор проверяемых значений постоянно на виду и наблюдать, как они меняются при пошаговом выполнении.
Замер производительности
Если проблема не в ошибке, а в том, что код работает медленно или ведёт себя непредсказуемо из-за лишних обращений к базе, включите замер производительности («Отладка» → «Замер производительности»). Он покажет, какие строки и вызовы занимают основное время — часто «ошибкой» оказывается запрос в цикле, который к тому же возвращает не те данные.
Журнал регистрации: поиск ошибок, которые нельзя воспроизвести
Не все ошибки удаётся поймать отладчиком: фоновые задания, регламентные операции, обмены данными выполняются без участия пользователя. Здесь помогает журнал регистрации («Администрирование» → «Журнал регистрации» в режиме предприятия). Отфильтруйте события по уровню «Ошибка», периоду и пользователю — в комментарии события будет текст исключения и контекст выполнения.
Для фоновых заданий полезен одноимённый раздел в консоли заданий: там видно состояние каждого задания, текст ошибки и время выполнения. Если обмен данными завершается с ошибкой, журнал регистрации обычно содержит и сообщение узла обмена, и причину отказа — например, нарушение уникальности при записи объекта.
Чтобы собственный код оставлял следы для диагностики, добавляйте записи в журнал регистрации в местах, где ошибка возможна, но не критична:
Попытка
ВыполнитьОбмен(Параметры);
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
КонецПопытки;Синтаксическая проверка и статический анализ
Часть ошибок находится вообще без запуска кода. В конфигураторе выполните «Конфигурация» → «Проверка конфигурации» и отметьте режимы проверки модулей: тонкий клиент, веб-клиент, сервер. Платформа найдёт необъявленные переменные, обращения к несуществующим методам, несоответствие числа параметров и другие дефекты, которые в рантайме превратились бы в исключения.
Обратите внимание на директивы компиляции: процедура, помеченная &НаКлиенте, не может вызывать серверные методы напрямую, и наоборот. Ошибки вида «Процедура или функция с указанным именем не определена» часто возникают именно из-за неправильного контекста исполнения, а не из-за опечатки.
Типовые дефекты кода и как их распознать
Обращение к пустым значениям — лидер среди причин сбоев. Перед вызовом метода объекта или обращением к реквизиту проверяйте значение: Если ЗначениеЗаполнено(Ссылка) Тогда ... КонецЕсли;, а для результатов запроса — Если Не Выборка.Следующий() Тогда .... Метод НайтиПоКоду() и похожие методы возвращают пустую ссылку, если объект не найден, а не Неопределено — эту разницу часто путают.
Ошибки в запросах диагностируйте через консоль запросов: вынесите текст запроса, подставьте реальные параметры и проверьте результат отдельно от кода. Типичные проблемы — соединение таблиц, дающее дубли строк, отбор по неиндексированному полю и обращение к реквизиту через точку от поля, которое может быть пустой ссылкой.
Ошибки преобразования типов возникают при передаче параметров между процедурами: строка вместо даты, Неопределено вместо массива. Проверяйте типы в отладчике через ТипЗнч(Переменная) и не полагайтесь на неявные преобразования — они работают не всегда так, как ожидается.
Ошибки в расширениях и после обновления
Если конфигурация доработана расширениями, сбой может находиться не в основной конфигурации, а в расширении. В сообщении об ошибке платформа указывает модуль с пометкой расширения. Проверьте совместимость: после обновления конфигурации заимствованные методы и реквизиты могли измениться, и расширение начинает обращаться к тому, чего больше нет.
После обновления типовой конфигурации ошибки нередко связаны с незавершёнными обработчиками обновления: код рассчитывает на новые данные, а отложенное обновление ещё не выполнено. Проверьте статус обновления в разделе «Обновление версии программы» и дождитесь завершения всех обработчиков, прежде чем искать ошибку в коде.
Как выбрать действие
Проверка исправления и границы самостоятельной работы
Исправление считается завершённым только после проверки на тех же данных, где ошибка воспроизводилась, и на смежных сценариях: проведите документ, сформируйте отчёт, выполните обмен. Убедитесь, что не появились новые ошибки в журнале регистрации и что результаты операций корректны — сходятся суммы, количества, остатки.
Самостоятельно разумно исправлять локальные дефекты: добавить проверку заполненности, исправить условие, скорректировать текст запроса. К специалисту стоит обращаться, когда ошибка затрагивает механизмы проведения и итогов, обмены с другими системами, криптографию и печать регламентированных форм — цена неверного исправления там выше стоимости диагностики.
Как проверить результат
Операция завершается без сообщений об ошибке
Ошибка повторяется или появилась новая
Нет новых событий с уровнем «Ошибка»
Появились ошибки в смежных операциях
Суммы и остатки сходятся с ожидаемыми
Результат операции отличается от эталона
Отчёты, печать, обмен работают как раньше
Исправление сломало соседний функционал
Что важно запомнить
Начинайте с точного текста ошибки и стека вызовов, используйте отладчик с остановкой по ошибке и табло значений, для фоновых процессов — журнал регистрации. Исправления проверяйте на копии базы и подтверждайте результат на исходном и смежных сценариях.
Частые вопросы
Что делать, если ошибка возникает редко и не воспроизводится?
Добавьте в подозрительный код запись в журнал регистрации с ключевыми значениями переменных в момент сбоя, обернув участок в Попытка/Исключение. Через несколько дней журнал покажет, при каких данных возникает ошибка, и её можно будет воспроизвести целенаправленно.
Почему точка останова не срабатывает на серверной базе?
Скорее всего, сервер 1С запущен без ключа отладки. Серверный код отлаживается только если служба агента сервера запущена с параметром -debug. Либо процедура выполняется в другом сеансе — тогда включите подключение к фоновым сеансам в настройках отладки.
Как найти ошибку в запросе, если код просто возвращает пустой результат?
Скопируйте текст запроса в консоль запросов, подставьте реальные параметры и выполните по частям: сначала без соединений и группировок, затем добавляя условия по одному. Так видно, на каком этапе данные отсекаются.
Можно ли искать ошибку без конфигуратора?
Частично: журнал регистрации, консоль заданий и текст сообщения об ошибке доступны в режиме предприятия и часто указывают причину. Но для пошагового анализа значений переменных и исправления кода конфигуратор необходим.
Ошибка «Поле объекта не обнаружено» — это проблема кода или данных?
Чаще всего кода: программа обращается к реквизиту, которого нет у объекта данного типа, например запрашивает реквизит справочника у документа. Но если ошибка возникает только на отдельных записях, проверьте, не хранится ли в реквизите ссылка на объект другого типа, чем ожидалось.