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