Где ломается код 1С и как это вычислить: отладчик, журналы, проверка данных

· 10 мин

Содержание

Чтобы найти ошибку в модуле 1С, начните с окна ошибки: нажмите ссылку «Подробно» и прочитайте строку вида {ОбщийМодуль.ИмяМодуля.Модуль(128)}. Там указаны модуль и номер строки, где платформа остановилась. Дальше откройте этот модуль в Конфигураторе, поставьте точку останова (F9) на несколько строк выше и запустите отладку (F5).

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

С чего начать поиск ошибки: читаем сообщение и воспроизводим сбой

Первые пять минут решают больше, чем час в отладчике. Соберите факты до того, как открывать код.

Что взять из окна ошибки

Окно ошибки в режиме 1С:Предприятие содержит краткий текст. Ссылка «Подробно» раскрывает полный текст и стек. Типичная строка выглядит так:

{Документ.РеализацияТоваровУслуг.МодульОбъекта(412)}: Деление на 0
{ОбщийМодуль.ПроведениеСервер.Модуль(88)}: ...
  • 📍 Верхняя строка — место, где возникло исключение.
  • 🔗 Строки ниже — кто вызвал этот код. По ним видно цепочку вызовов.
  • 🧩 Имя объекта подсказывает слой: МодульОбъекта, МодульМенеджера, МодульФормы, ОбщийМодуль.

Скопируйте полный текст целиком (кнопкой копирования в окне или выделением). Перескажут его словами — потеряете номер строки.

Пять вопросов перед открытием кода

  1. Ошибка у всех пользователей или у одного? У одного — смотрите права и его настройки.
  2. Повторяется ли она на одном документе или на любом? На одном — почти наверняка данные.
  3. Что менялось накануне: обновление конфигурации , новое расширение, новая обработка?
  4. Где выполняется код: на клиенте или на сервере? Это видно по директивам &НаКлиенте / &НаСервере в модуле формы.
  5. Воспроизводится ли ошибка в копии базы? Если да, ищите в копии, а не в рабочей.

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

Отладка кода 1С: от проверки синтаксиса до отладчика на сервере

Инструменты стоит включать по нарастанию сложности. Ниже то, что есть в Конфигураторе платформы 8.3.

ИнструментКогда помогаетКак вызвать
Проверка синтаксиса модуляОпечатки, незакрытые блоки, неизвестные переменныеCtrl+F7 в открытом модуле
Проверка конфигурацииОшибки во всех модулях сразу, недоступные на клиенте методыКонфигурация → Проверка конфигурации
Точки останова и пошаговое выполнениеЛогические ошибки, неверные значенияF9, затем F5
Остановка по ошибкеИсключение «тонет» в Попытка…ИсключениеОтладка → Остановка по ошибке
Замер производительностиКод не падает, а работает минутамиОтладка → Замер производительности

Проверка конфигурации

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

Это ловит ошибки, которые проявятся только у пользователя веб-клиента или только в режиме внешнего соединения.

Пошаговая отладка

  1. Откройте модуль из стека ошибки, перейдите на строку (Ctrl+G — переход к строке).
  2. Поставьте точку останова F9 на 5–10 строк выше места падения.
  3. Запустите Отладка → Начать отладку → Тонкий клиент (или F5).
  4. Повторите действие пользователя. Выполнение остановится на точке.
  5. Шагайте: F11 — с заходом в процедуру, F10 — без захода, Shift+F11 — выйти из процедуры.
  6. Выделите переменную и нажмите Shift+F9 — окно «Вычислить выражение» покажет её значение и тип.

💡 Если точка срабатывает слишком часто (цикл на 5000 строк), поставьте её с условием через контекстное меню строки: например, Стр.НомерСтроки = 317. Останов будет только на нужной итерации.

Когда ошибку «съедает» Попытка

Код вида Попытка … Исключение … КонецПопытки гасит исключение и выдаёт пользователю общее «Не удалось выполнить операцию». Включите Отладка → Остановка по ошибке и отметьте остановку для всех ошибок. Отладчик встанет ровно на строке, где исключение возникло, ещё до перехода в блок Исключение.

Отладка серверного кода в клиент-серверной базе

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

Перезапуск службы агента обрывает сеансы всех пользователей кластера. Делайте это на тестовом сервере или в нерабочее время после предупреждения коллег.

Клиент можно запустить в режиме отладки и без Конфигуратора — ключом командной строки:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE /S"srv01\buh_test" /DEBUG

Номер версии в пути подставьте свой. После запуска подключитесь к сеансу через Отладка → Подключение.

Где в коде 1С искать типичные ошибки

Тексты ошибок повторяются. По ним быстро понять, что проверять в строке, на которой остановился отладчик.

Диагностика: выберите симптом

Места, где ошибки прячутся чаще всего

  • 🔁 Удаление в цикле. Удаление строк таблицы в прямом цикле пропускает элементы. Правильно — обратный цикл: Для Сч = 1 По ТЗ.Количество() Цикл Стр = ТЗ[ТЗ.Количество() - Сч]; … КонецЦикла.
  • 🧮 Склейка числа со строкой. "Строка " + 1250 даст «1 250» с неразрывным пробелом и сломает сравнение. Используйте Формат(Число, "ЧГ=0").
  • 🖥️ Контекст вызова. На клиенте недоступны запросы и объекты базы. Код с Новый Запрос в процедуре &НаКлиенте упадёт.
  • 📄 Тексты запросов. Ошибка в запросе сообщает строку текста запроса, а не модуля. Скопируйте текст в консоль запросов и выполните отдельно.
  • 🗂️ Обработчики подписок на события. Код подписки выполняется при записи любого подходящего объекта. В стеке он виден как общий модуль, хотя пользователь «просто проводил документ».

Журнал регистрации, технологический журнал и дампы

Если ошибку не удаётся повторить в копии, ищите следы в журналах рабочей базы.

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

В БП 3.0, ЗУП 3.1 и УТ 11 он открывается через Администрирование → Поддержка и обслуживание → Журнал регистрации. В Конфигураторе — Администрирование → Журнал регистрации.

  1. Установите отбор по уровню «Ошибка».
  2. Сузьте период до времени, когда пользователь увидел сбой.
  3. Отберите по пользователю и компьютеру.
  4. Откройте запись: в поле комментария будет полный текст ошибки со стеком.

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

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

ВызватьИсключение без параметров пробрасывает исходную ошибку дальше. Так она и записана, и не проглочена.

Технологический журнал

Он нужен для плавающих ошибок, блокировок и падений процессов. Настраивается файлом logcfg.xml в каталоге conf платформы (например, C:\Program Files\1cv8\conf\). Минимальная настройка для поиска исключений:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\techlog" history="24">
    <event>
      <eq property="name" value="EXCP"/>
    </event>
    <property name="all"/>
  </log>
</config>
  • 📂 Платформа подхватит файл без перезапуска, примерно через минуту.
  • ⏱️ history="24" хранит логи 24 часа — диск не переполнится за выходные.
  • 🧹 После поиска удалите или переименуйте файл: полный журнал на нагруженном сервере пишет гигабайты.

В событиях EXCP есть свойство Context — тот же стек вызовов модулей, что и в окне ошибки.

Дампы памяти

Дамп появляется, когда падает сам процесс: клиент закрывается без сообщения или «вылетает» рабочий процесс сервера. Клиентские дампы лежат в профиле пользователя, в подкаталоге 1C\1cv8\dumps локальных данных приложений. Создание серверных дампов включается элементом <dump> в том же logcfg.xml.

Дамп разбирает не программист конфигурации, а фирма-разработчик платформы. Ваша задача — найти действие, после которого он появляется. Частые причины на стороне кода: бесконечная рекурсия и огромные коллекции в памяти.

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

Типовая конфигурация обычно не падает сама по себе. Чаще ломается доработка поверх неё.

Как проверить расширения

  1. Откройте Администрирование → Печатные формы, отчеты и обработки → Расширения.
  2. Снимите флажок «Активно» у подозрительного расширения в копии базы.
  3. Перезапустите сеанс и повторите действие.

Ошибка ушла — ищите в расширении. Самое частое — расширение собрано под прежний релиз, а после обновления конфигурации поменялось имя процедуры или реквизита. Платформа сообщает об этом при применении расширения. Откройте его в Конфигураторе (Конфигурация → Расширения конфигурации) и проверьте синтаксис.

Аннотации &Перед, &После и &ИзменениеИКонтроль перехватывают типовые процедуры. При &ИзменениеИКонтроль расширение не применится, если типовой текст процедуры изменился. Перенесите правку на новый текст.

Как отладить внешнюю обработку или отчёт

  1. Откройте файл .epf или .erf в Конфигураторе через Файл → Открыть.
  2. Поставьте точки останова в модуле обработки.
  3. Запустите отладку и откройте в режиме 1С:Предприятие этот же файл с того же пути.

Если обработка подключена в справочник дополнительных обработок, база хранит её копию. Точки останова в открытом файле сработают, только если вы открываете файл из каталога через Файл → Открыть, а не из списка обработок.

Ошибки, которые сидят в данных, а не в коде

Код может быть верным, а данные — нет. Признак: ошибка возникает на одном документе, а соседние проводятся.

  • 🔗 Битые ссылки. В полях видно <Объект не найден> с идентификатором. Объект удалили напрямую, а ссылки остались.
  • 📉 Пустые обязательные реквизиты. Документ загружен обменом без счёта учёта или ставки НДС.
  • 🔢 Нарушенная последовательность или итоги. Остатки в отчёте не совпадают с движениями.

Как проверять:

  1. Откройте документ и пройдите по реквизитам и табличным частям: пустые поля и <Объект не найден> видны сразу.
  2. Отберите похожие проблемные записи консолью запросов (обработка для отладки запросов есть на диске ИТС и в составе многих конфигураций как внешняя).
  3. Для структурных повреждений запустите в Конфигураторе Администрирование → Тестирование и исправление.

Тестирование и исправление требует монопольного режима и меняет данные. Перед запуском сделайте выгрузку базы в .dt и запускайте сначала только в режиме проверки, без исправления.

Сбои интеграции: веб-сервисы, HTTP, COM и оборудование

Ошибки обмена коварны: код в 1С может быть исправен, а сломана другая сторона.

Веб-сервисы и HTTP-запросы

  • Сохраните код ответа: Ответ.КодСостояния. 401 — неверная авторизация, 404 — не тот адрес, 500 — ошибка на стороне сервера.
  • Тело ответа получите через Ответ.ПолучитьТелоКакСтроку() и запишите в журнал регистрации. Там обычно написана реальная причина.
  • Если 1С сама публикует сервис, проверьте публикацию на веб-сервере и журнал регистрации базы-приёмника: ошибка там, а не в базе-отправителе.

COM-соединение

Ошибки COM возникают на стороне внешней базы, а исключение приходит к вам с кратким текстом. Проверьте:

  • разрядность: 32-битный клиент не создаст 64-битный COM-объект и наоборот;
  • регистрацию компоненты comcntr.dll той версии платформы, что у базы-источника;
  • права пользователя, под которым идёт подключение, в обеих базах.

Для отладки кода, исполняемого через внешнее соединение, удобнее перенести логику в обработку и запустить её отладчиком прямо во внешней базе.

Торговое оборудование

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

Когда стоит передать задачу специалисту

Самостоятельный поиск оправдан, пока вы видите стек и можете повторить ошибку. Есть случаи, когда время лучше отдать тем, у кого есть доступ и опыт.

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

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

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

Почему номер строки в ошибке не совпадает с текстом модуля?
Модуль изменили после того, как пользователь открыл сеанс, или вы смотрите не ту конфигурацию. Сравните конфигурацию базы данных с основной и перезапустите сеанс.
Отладчик не останавливается на точке останова. Что проверить?
Совпадение конфигурации базы данных с открытой в Конфигураторе, подключение сеанса к отладчику и для серверного кода ключ -debug у агента сервера.
Можно ли отлаживать без Конфигуратора?
Да, в 1С:EDT: там свой отладчик и проверка кода на лету. Подключение к серверу то же — через сервер отладки.
Как найти, какой код выполняется при нажатии кнопки?
Откройте форму в Конфигураторе, выделите кнопку, найдите её команду и в свойствах команды — процедуру-обработчик. Двойной щелчок по свойству откроет модуль.
Чем ошибка на клиенте отличается от ошибки на сервере в журнале?
Серверные ошибки попадают в журнал регистрации почти всегда. Клиентские — только если код сам их записал или они прервали серверный вызов.