Где прячутся ошибки в коде 1С и чем их ловить до пользователей
Содержание
Быстрее всего проверить код 1С на ошибки прямо в конфигураторе: Ctrl+F7 в открытом модуле запускает синтаксический контроль, а меню Конфигурация → Проверка конфигурации... прогоняет все модули сразу и в нескольких режимах (тонкий клиент, сервер, веб-клиент). Это ловит опечатки, необъявленные переменные и вызовы, недоступные в нужном контексте.
Но синтаксис — только первый слой. Ошибки логики, медленные запросы и падения на реальных данных находят другие инструменты: статический анализатор, отладчик, журнал регистрации и автотесты. Ниже — как собрать из них рабочую цепочку проверки для платформы 8.3.
Проверка кода встроенными средствами конфигуратора
Начните с того, что есть в любой поставке платформы. Эти проверки бесплатны и занимают минуты.
Синтаксический контроль модуля
- Откройте модуль формы, объекта или общий модуль.
- Нажмите
Ctrl+F7или кнопку синтаксического контроля на панели модуля. - Ошибки появятся в окне сообщений. Двойной щелчок по строке переносит к месту ошибки.
Синтаксический контроль проверяет только открытый модуль. Если вы поменяли сигнатуру общей функции, вызовы в других модулях он не увидит.
Проверка всей конфигурации
Меню Конфигурация → Проверка конфигурации... открывает окно с набором флажков. Полезные режимы:
- 🔍 Логическая целостность конфигурации — битые ссылки на объекты метаданных, пустые обязательные свойства.
- 🔍 Поиск некорректных ссылок — ссылки на удалённые или переименованные объекты.
- 🔍 Синтаксический контроль модулей с выбором контекстов: тонкий клиент, веб-клиент, сервер, внешнее соединение. Код, который компилируется на сервере, может не скомпилироваться на тонком клиенте.
- 🔍 Поиск неиспользуемых процедур и функций — мёртвый код, который никто не вызывает.
- 🔍 Расширенная проверка — недоступные в контексте методы, обращения к серверу из клиентского кода без директивы.
Ставьте флажки всех режимов, в которых реально работают пользователи. Типовая ловушка: разработчик тестирует в толстом клиенте, а бухгалтеры сидят в веб-клиенте через браузер.
Проверка из командной строки
Ту же проверку можно запустить без интерфейса, например перед выкладкой обновления:
"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
- Выгрузите конфигурацию в файлы:
Конфигурация → Выгрузить конфигурацию в файлы...(или работайте с проектом EDT). - Поднимите сервер SonarQube и установите плагин для языка 1С (BSL).
- Положите в корень проекта файл
sonar-project.propertiesс путём к исходникам. - Запустите сканер
sonar-scanner. Замечания появятся в веб-интерфейсе SonarQube.
sonar.projectKey=buh-dorabotki
sonar.sources=src
sonar.sourceEncoding=UTF-8
sonar.inclusions=**/*.bsl,**/*.os
Начинайте разбор с замечаний уровня «Блокер» и «Критичное»: это запросы в цикле, проглоченные исключения, ошибки в условиях. Замечания про оформление и длину строк подождут. Для каждого нового коммита смотрите только новые замечания, чтобы долг не рос.
Не включайте анализ сразу на всю типовую конфигурацию: получите десятки тысяч замечаний к коду фирмы 1С. Ограничьте sonar.sources своими доработками или расширением.
Типовые ошибки в коде 1С и как их найти
Часть ошибок компилятор пропускает: код корректен синтаксически, но падает на данных. Вот что встречается чаще всего и чем это ловится.
- ⚠️
Поле объекта не обнаружено (Контрагент)— обращение к реквизиту, которого нет у объекта, или опечатка в имени. Ловит расширенная проверка и анализатор, если тип известен; при составном типе — только отладчик. - ⚠️
Значение не является значением объектного типа— обращение через точку кНеопределеноили пустому значению. Добавьте проверкуЗначениеЗаполнено()перед обращением. - ⚠️
Переменная не определена— опечатка в имени переменной. Синтаксический контроль ловит сразу. - ⚠️
Метод объекта не обнаружен— вызов метода, которого нет у объекта, или вызов серверной функции из клиента без директивы&НаСервере. - ⚠️
Использование модальных окон в данном режиме запрещено.— вызовВопрос()илиПредупреждение()при отключённом модальном режиме. Замените на асинхронные аналоги. - ⚠️
Деление на 0— нет проверки знаменателя. - ⚠️ Пустой
Исключение КонецПопытки— ошибка проглатывается, пользователь видит неверный результат без сообщения. Такое находит только статический анализ.
Правильный шаблон обработки исключения — с записью подробностей:
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Загрузка.ПроведениеДокумента",
УровеньЖурналаРегистрации.Ошибка, , ДокументОбъект.Ссылка, ТекстОшибки);
ВызватьИсключение;
КонецПопытки;
ВызватьИсключение без параметров пробрасывает исходную ошибку дальше. Без него транзакция может продолжиться с половиной данных.
Отладчик и журнал регистрации: проверка кода во время работы
Статика не покажет, какое значение пришло в переменную в момент падения. Для этого нужен отладчик.
Пошаговая отладка
- В конфигураторе запустите
Отладка → Начать отладкуи выберите клиент (тонкий клиент или веб-клиент). - Поставьте точку останова:
F9на нужной строке. - Включите
Отладка → Остановка по ошибке— отладчик сам встанет на строку, где возникло исключение. Это самый быстрый способ найти место падения. - Ходите по коду:
F10— шаг с обходом,F11— шаг с заходом в процедуру,Shift+F11— выход из процедуры. - Смотрите значения в табло или через
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:
Функционал: Проведение реализации
Сценарий: Документ проводится без ошибок
Когда я открываю основную форму списка документа "РеализацияТоваровУслуг"
И я нажимаю на кнопку с именем "ФормаСоздать"
...
Как это работает:
- Обработка запускается в режиме менеджера тестирования (ключ
/TESTMANAGER). - Тестируемая база запускается как клиент тестирования (ключ
/TESTCLIENT). - Менеджер нажимает кнопки, заполняет поля и проверяет результат, как живой пользователь.
Сценарии не обязательно писать вручную: в Vanessa Automation есть запись действий пользователя с генерацией шагов.
Юнит-тесты
Для проверки отдельных функций без интерфейса используют YAxUnit — тесты оформляются расширением конфигурации и запускаются из командной строки. Это удобно для общих модулей с расчётами: подали на вход 10 000 и 13%, проверили, что вернулось 1 300.
Встраивание в конвейер
Связка выглядит так:
- Разработчик помещает изменения в хранилище или Git.
- Сервер сборки (Jenkins, GitLab CI) собирает тестовую базу.
- Запускаются
/CheckModules, статический анализ и автотесты. - Если что-то упало — обновление дальше не идёт.
Частые вопросы
Можно ли проверить код внешней обработки без загрузки в базу?
Файл → Открыть, откройте модуль и нажмите Ctrl+F7. Для полной проверки контекстов обработку удобнее выгрузить в файлы и прогнать через BSL Language Server.Нужна ли лицензия, чтобы запускать проверку из командной строки?
Проверяет ли синтаксический контроль код расширений?
-Extension с его именем.