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

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

Где ошибка в коде 1С: практическое руководство по поиску и исправлению

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

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

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

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

Как читать сообщение об ошибке платформы

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

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

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

Ошибка при сохранении модуляСинтаксическая ошибка

Запустить синтаксический контроль модуля и исправить указанные строки

Ошибка при выполнении операцииОшибка времени выполнения

Смотреть номер строки и стек вызовов в сообщении

Ошибка только у части пользователейЗависимость от данных или прав

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

Ошибок нет, но результат неверныйЛогическая ошибка

Проверять отладчиком значения на каждом шаге расчёта

Отладчик: основной инструмент поиска

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

Ключевые приёмы работы в отладчике:

  • Шаг через (F10) — выполнить текущую строку, не заходя в вызываемые процедуры;
  • Шаг в (F11) — войти внутрь вызываемой процедуры или функции;
  • Шаг из (Shift+F11) — выйти из текущей процедуры к месту вызова;
  • Вычислить выражение (Shift+F9) — проверить значение любой переменной или произвольного выражения;
  • Стек вызовов — посмотреть, откуда была вызвана текущая процедура, и перейти к любому уровню.

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

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

Журнал регистрации для серверных и фоновых ошибок

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

В журнале настраивают отбор по уровню «Ошибка», по пользователю и по периоду. Важно смотреть не только саму ошибку, но и события непосредственно перед ней — часто там видно, какая операция запустилась и на каком объекте данных она упала. Для фоновых заданий в списке заданий (раздел администрирования) доступен текст ошибки конкретного сеанса выполнения.

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

Типичные ошибки времени выполнения и их причины

Большинство ошибок в коде 1С относится к ограниченному набору типов. Знание этих паттернов сокращает поиск с часов до минут.

«Поле объекта не обнаружено» — обращение к несуществующему свойству или реквизиту. Причины: опечатка в имени, обращение к реквизиту, которого нет у данного вида документа, либо переменная содержит значение другого типа, чем ожидалось (например, Неопределено вместо объекта). Проверяется через «Вычислить выражение»: смотрят тип переменной и состав её свойств.

«Значение не является значением объектного типа» — попытка обратиться через точку к примитивному значению или к Неопределено. Классический сценарий: метод НайтиПоНомеру или запрос вернул пустую ссылку/Неопределено, а код без проверки обратился к реквизиту. Лечится проверкой Если ЗначениеЗаполнено(Ссылка) Тогда или проверкой на Неопределено перед обращением.

«Ошибка при вызове метода контекста» — метод вызван с неверными параметрами или у объекта в недопустимом состоянии, например запись проведённого документа без изменения режима. «Деление на ноль» и ошибки преобразования типов — результат отсутствия проверок входных данных. Все эти ошибки объединяет одна причина: код предполагает данные в определённом состоянии, а реальные данные этому состоянию не соответствуют.

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

Ошибки в запросах и работе с данными

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

Частая причина «невидимых» проблем — запрос выполняется без ошибок, но возвращает не те данные. Тогда проверяют: условия отбора (не отсекают ли они нужные записи), типы соединений таблиц (ЛЕВОЕ вместо ВНУТРЕННЕГО меняет результат), параметры виртуальных таблиц (период для остатков и оборотов). Полезный приём — вывести результат запроса во временную таблицу и посмотреть её содержимое в отладчике через Выгрузить().

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

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

Как выбрать инструмент диагностики

Модуль не сохраняется, платформа подчёркивает строкиСинтаксический контроль модуля — ошибка в синтаксисе языка
Ошибка появляется при конкретном действии пользователяОтладчик с остановкой по ошибке и воспроизведение сценария
Сбой в фоновом или регламентном заданииЖурнал регистрации с отбором по ошибкам, затем отладка фонового сеанса
Код работает, но результат неверныйПошаговая отладка с контролем значений переменных и результатов запросов
Ошибка только на сервере, локально не воспроизводитсяТехнологический журнал и сравнение окружений (версии платформы, данные)

Логические ошибки: когда кода «нет», а результат неверный

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

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

Для сложных расчётов полезно временно добавить вывод промежуточных данных через Сообщить() или запись в журнал регистрации — это позволяет проверить логику без многократных проходов отладчиком, особенно в циклах с сотнями итераций.

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

Как проверить, что ошибка устранена

Повторение исходного сценария
Норма

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

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

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

Результат операции
Норма

Суммы, строки и движения документа совпадают с эталонным расчётом

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

Ошибки нет, но данные отличаются от ожидаемых

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

Похожие операции с другими данными тоже работают корректно

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

Исправление помогло в одном случае и сломало другой

Журнал регистрации
Норма

Нет новых ошибок за период после исправления

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

Ошибки продолжают фиксироваться в фоновых заданиях

Безопасные правила исправления и типичные риски

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

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

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

Итог

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

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

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

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

Проверьте три направления: права доступа пользователя к объектам, участвующим в операции; данные, с которыми он работает (конкретный документ может содержать нестандартные значения); настройки его сеанса, включая версию платформы на рабочем месте. Воспроизведение сценария под его учётной записью на тестовой копии обычно быстро локализует причину.

Как найти ошибку в модуле, который нельзя открыть из-за синтаксической ошибки?

Модуль с синтаксической ошибкой открывается в конфигураторе без проблем — не сохраняется. Запустите синтаксический контроль (меню «Текст» → «Синтаксический контроль модуля»), и платформа перечислит все ошибки с номерами строк. Исправляйте их сверху вниз: первая ошибка часто порождает каскад последующих.

Ошибка возникает в фоновом задании, отладчик её не ловит. Что делать?

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

Чем отличается «Поле объекта не обнаружено» от «Значение не является значением объектного типа»?

Первая ошибка означает, что объект существует, но указанного свойства у него нет — ищите опечатку в имени или неверный тип объекта. Вторая означает, что переменная вообще не объект: она содержит Неопределено, число, строку или пустую ссылку. Во втором случае проверяйте, откуда пришло значение и почему оно не заполнено.

Можно ли искать ошибки без отладчика?

Да, в простых случаях достаточно текста сообщения и журнала регистрации. Для диагностики без отладчика добавляют временные вызовы Сообщить() с выводом значений переменных в ключевых точках кода. Этот способ медленнее и требует последующей чистки кода, но работает там, где отладка недоступна, например на сервере без прав разработчика.

Ошибка появилась после обновления конфигурации, хотя код не меняли. Почему?

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