Где прячутся ошибки в коде 1С и чем их ловить до пользователей

· 9 мин

Содержание

Быстрее всего проверить код 1С на ошибки прямо в конфигураторе: Ctrl+F7 в открытом модуле запускает синтаксический контроль, а меню Конфигурация → Проверка конфигурации... прогоняет все модули сразу и в нескольких режимах (тонкий клиент, сервер, веб-клиент). Это ловит опечатки, необъявленные переменные и вызовы, недоступные в нужном контексте.

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

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

Начните с того, что есть в любой поставке платформы. Эти проверки бесплатны и занимают минуты.

Синтаксический контроль модуля

  1. Откройте модуль формы, объекта или общий модуль.
  2. Нажмите Ctrl+F7 или кнопку синтаксического контроля на панели модуля.
  3. Ошибки появятся в окне сообщений. Двойной щелчок по строке переносит к месту ошибки.

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

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

Меню Конфигурация → Проверка конфигурации... открывает окно с набором флажков. Полезные режимы:

  • 🔍 Логическая целостность конфигурации — битые ссылки на объекты метаданных, пустые обязательные свойства.
  • 🔍 Поиск некорректных ссылок — ссылки на удалённые или переименованные объекты.
  • 🔍 Синтаксический контроль модулей с выбором контекстов: тонкий клиент, веб-клиент, сервер, внешнее соединение. Код, который компилируется на сервере, может не скомпилироваться на тонком клиенте.
  • 🔍 Поиск неиспользуемых процедур и функций — мёртвый код, который никто не вызывает.
  • 🔍 Расширенная проверка — недоступные в контексте методы, обращения к серверу из клиентского кода без директивы.

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

Проверка из командной строки

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

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /N "Admin" /P "" ^
  /CheckModules -ThinClient -WebClient -Server -ExternalConnection ^
  /Out "D:\Logs\check_modules.txt" /DisableStartupDialogs

Ключ /CheckModules проверяет модули в указанных контекстах, /CheckConfig — конфигурацию целиком (например, с -ConfigLogIntegrity -IncorrectReferences -UnreferenceProcedures). Результат пишется в файл из /Out. Номер версии в пути подставьте свой.

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

Статический анализ: SonarQube, BSL Language Server и АПК

Встроенная проверка смотрит на компиляцию. Статический анализатор смотрит на качество: запрос в цикле, пустой блок Исключение, слишком длинную процедуру, нарушение стандартов разработки.

Какие инструменты есть

ИнструментЧто делаетКогда брать
BSL Language ServerОткрытый сервер диагностик для языка 1С, работает в VS Code и как консольная утилитаОдин разработчик, быстрые проверки на своей машине
SonarQube + плагин для BSLСервер качества кода: история замечаний, технический долг, отчёты по веткамКоманда, общий репозиторий, контроль перед слиянием
1С:EDTСреда разработки с проверками «на лету»; набор правил стандартов подключается дополнительноРазработка в EDT, а не в конфигураторе
АПК (Автоматизированная проверка конфигураций)Конфигурация от 1С, проверяет код и метаданные по стандартам разработкиПроверка доработок перед сертификацией или сдачей заказчику

Как подключить SonarQube

  1. Выгрузите конфигурацию в файлы: Конфигурация → Выгрузить конфигурацию в файлы... (или работайте с проектом EDT).
  2. Поднимите сервер SonarQube и установите плагин для языка 1С (BSL).
  3. Положите в корень проекта файл sonar-project.properties с путём к исходникам.
  4. Запустите сканер sonar-scanner. Замечания появятся в веб-интерфейсе SonarQube.
sonar.projectKey=buh-dorabotki
sonar.sources=src
sonar.sourceEncoding=UTF-8
sonar.inclusions=**/*.bsl,**/*.os

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

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

Типовые ошибки в коде 1С и как их найти

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

  • ⚠️ Поле объекта не обнаружено (Контрагент) — обращение к реквизиту, которого нет у объекта, или опечатка в имени. Ловит расширенная проверка и анализатор, если тип известен; при составном типе — только отладчик.
  • ⚠️ Значение не является значением объектного типа — обращение через точку к Неопределено или пустому значению. Добавьте проверку ЗначениеЗаполнено() перед обращением.
  • ⚠️ Переменная не определена — опечатка в имени переменной. Синтаксический контроль ловит сразу.
  • ⚠️ Метод объекта не обнаружен — вызов метода, которого нет у объекта, или вызов серверной функции из клиента без директивы &НаСервере.
  • ⚠️ Использование модальных окон в данном режиме запрещено. — вызов Вопрос() или Предупреждение() при отключённом модальном режиме. Замените на асинхронные аналоги.
  • ⚠️ Деление на 0 — нет проверки знаменателя.
  • ⚠️ Пустой Исключение КонецПопытки — ошибка проглатывается, пользователь видит неверный результат без сообщения. Такое находит только статический анализ.

Правильный шаблон обработки исключения — с записью подробностей:

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

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

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

Отладчик и журнал регистрации: проверка кода во время работы

Статика не покажет, какое значение пришло в переменную в момент падения. Для этого нужен отладчик.

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

  1. В конфигураторе запустите Отладка → Начать отладку и выберите клиент (тонкий клиент или веб-клиент).
  2. Поставьте точку останова: F9 на нужной строке.
  3. Включите Отладка → Остановка по ошибке — отладчик сам встанет на строку, где возникло исключение. Это самый быстрый способ найти место падения.
  4. Ходите по коду: F10 — шаг с обходом, F11 — шаг с заходом в процедуру, Shift+F11 — выход из процедуры.
  5. Смотрите значения в табло или через Shift+F9 — вычисление выражения.

Для кода, который выполняется на сервере 1С:Предприятия, нужна серверная отладка. На сервере она включается запуском службы с параметром -debug. В конфигураторе метод отладки (TCP или HTTP) задаётся в Сервис → Параметры → Отладка.

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

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

Когда ошибка возникла у пользователя вчера и не воспроизводится, отладчик бесполезен. Тут помогает журнал регистрации:

  • в пользовательском режиме БП 3.0, ЗУП 3.1, УТ 11 — Администрирование → Обслуживание → Журнал регистрации;
  • в конфигураторе — Администрирование → Журнал регистрации.

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

Для тяжёлых случаев — зависаний, взаимоблокировок, медленных запросов — подключают технологический журнал. Он настраивается файлом logcfg.xml в каталоге conf платформы и пишет события вроде EXCP (исключения), DBMSSQL (запросы к СУБД), TLOCK (управляемые блокировки).

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

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

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

Инструменты

  • 🛠 Конструктор запроса — открывается из контекстного меню в тексте запроса. Если конструктор не может разобрать текст, в запросе ошибка.
  • 🛠 Консоль запросов — внешняя обработка, позволяет выполнить запрос с параметрами на реальных данных и посмотреть результат.
  • 🛠 Замер производительности — Отладка → Замер производительности в режиме отладки показывает, сколько времени заняла каждая строка кода и сколько раз она выполнялась.

Что искать в запросах

ПроблемаПризнакИсправление
Запрос в циклеЗапрос.Выполнить() внутри Для КаждогоОдин запрос с отбором по списку через В (&Список)
Обращение к реквизиту через точку в циклеСтрока.Номенклатура.Артикул в цикле по 10 000 строкПолучить реквизиты одним запросом заранее
Отбор виртуальной таблицы в ГДЕУсловие на остатки вынесено в ГДЕПеренести условие в параметры виртуальной таблицы
Составной тип без ВЫРАЗИТЬСоединение с несколькими таблицамиВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты)
Соединение с подзапросомМедленно на больших объёмахВременная таблица с индексом

Пример исправления запроса в цикле:

// Было: 1000 строк — 1000 обращений к базе
// Стало: одно обращение
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка,
|    Номенклатура.Артикул КАК Артикул
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Ссылка В (&СписокНоменклатуры)";
Запрос.УстановитьПараметр("СписокНоменклатуры",
    Товары.ВыгрузитьКолонку("Номенклатура"));
Артикулы = Запрос.Выполнить().Выгрузить();
Артикулы.Индексы.Добавить("Ссылка");

Дальше артикул ищется в таблице Артикулы методом Найти() по индексированной колонке, без обращений к базе.

Автоматическое тестирование: Vanessa Automation и юнит-тесты

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

Vanessa Automation

Vanessa Automation — открытая обработка для сценарного тестирования. Сценарии пишутся на русском языке в формате Gherkin:

Функционал: Проведение реализации

Сценарий: Документ проводится без ошибок
    Когда я открываю основную форму списка документа "РеализацияТоваровУслуг"
    И я нажимаю на кнопку с именем "ФормаСоздать"
    ...

Как это работает:

  1. Обработка запускается в режиме менеджера тестирования (ключ /TESTMANAGER).
  2. Тестируемая база запускается как клиент тестирования (ключ /TESTCLIENT).
  3. Менеджер нажимает кнопки, заполняет поля и проверяет результат, как живой пользователь.

Сценарии не обязательно писать вручную: в Vanessa Automation есть запись действий пользователя с генерацией шагов.

Юнит-тесты

Для проверки отдельных функций без интерфейса используют YAxUnit — тесты оформляются расширением конфигурации и запускаются из командной строки. Это удобно для общих модулей с расчётами: подали на вход 10 000 и 13%, проверили, что вернулось 1 300.

Встраивание в конвейер

Связка выглядит так:

  1. Разработчик помещает изменения в хранилище или Git.
  2. Сервер сборки (Jenkins, GitLab CI) собирает тестовую базу.
  3. Запускаются /CheckModules, статический анализ и автотесты.
  4. Если что-то упало — обновление дальше не идёт.
Перед выкладкой доработки
Выполнено: 0 / 5

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

Можно ли проверить код внешней обработки без загрузки в базу?
Да. Откройте файл .epf в конфигураторе через Файл → Открыть, откройте модуль и нажмите Ctrl+F7. Для полной проверки контекстов обработку удобнее выгрузить в файлы и прогнать через BSL Language Server.
Нужна ли лицензия, чтобы запускать проверку из командной строки?
Запуск конфигуратора в пакетном режиме использует лицензию так же, как обычный запуск. На сервере сборки должна быть доступна клиентская лицензия.
Проверяет ли синтаксический контроль код расширений?
Да, в конфигураторе есть отдельная проверка для расширения: откройте его дерево и запустите проверку из меню расширения. В командной строке для расширения указывают параметр -Extension с его именем.
Почему код компилируется, а пользователь всё равно получает ошибку?
Компилятор не знает фактических значений. Обращение к пустой ссылке, неверный тип в составном реквизите и нехватка прав видны только во время выполнения — их ловят отладчик и журнал регистрации.
Чем BSL Language Server отличается от SonarQube?
BSL LS — движок диагностик, он работает в редакторе и в консоли. SonarQube — сервер, который хранит историю замечаний и показывает динамику по проекту. Плагин для 1С в SonarQube использует диагностики BSL LS.