При разработке и сопровождении конфигураций 1С разработчики нередко сталкиваются с иллюзией «нарушения логики платформы»: отладчик останавливается внутри блока Если ... Тогда, хотя значение проверяемого выражения очевидно ложно, либо маркер текущей строки (желтая стрелка) зависает на строке комментария или пустом месте. Разберем, почему возникает такое поведение, как устроена рассинхронизация байт-кода с исходным текстом и какими способами вернуть отладчик в корректное состояние.
Причины рассинхронизации отладчика и текста модуля
Платформа 1С выполняет скомпилированный байт-код, сопоставляя номера инструкций со строками исходного текста модуля. Если между средой разработки (Конфигуратором) и исполняемым процессом возникает несоответствие, маркер отладки смещается. Выделим ключевые причины этой проблемы:
Динамическое обновление конфигурации базы данных. При частом применении изменений без монопольного перезапуска серверные и клиентские сеансы могут удерживать старую версию скомпилированного модуля, в то время как Конфигуратор показывает уже измененный текст. Из-за этого номера строк в окне редактора не соответствуют выполняемым инструкциям виртуальной машины 1С.
Повреждение локального кэша платформы. Временные файлы метаданных и скомпилированных модулей на стороне клиента и сервера могут рассинхронизироваться с базой данных, вызывая аномалии при пошаговой трассировке.
Некорректные символы перевода строк (CRLF / LF) и невидимые символы. Если модуль редактировался внешними инструментами, переносился через системы контроля версий или содержал неразрывные пробелы (код 160) и символы нулевой ширины, внутренний парсер строк 1С может неправильно определять смещение строк.
Поврежденные точки останова. Устаревшие точки останова, привязанные к удаленным или сдвинутым строкам, способны смещать фокус отладки.
Способ 1. Нормализация текста модуля и монопольное обновление
Проанализируем самый быстрый способ вернуть соответствие карты строк байт-коду без глубокой очистки файлов:
Откроем проблемный модуль в Конфигураторе.
Выделим весь текст модуля с помощью комбинации клавиш Ctrl + A.
Вырежем текст в буфер обмена с помощью Ctrl + X.
Вставим текст обратно с помощью Ctrl + V. Эта операция принудительно нормализует окончания строк в формат CRLF и удаляет артефакты форматирования.
Выполним сохранение и обновление конфигурации базы данных через клавишу F7 в монопольном режиме, избегая динамического обновления.
Способ 2. Очистка кэша платформы 1С
Если простая перезапись модуля не помогла, необходимо очистить кэш на стороне клиента и сервера.
Очистка клиентского кэша:
Завершим все запущенные сеансы «1С:Предприятие» и «Конфигуратор».
Для полной очистки откроем проводник и удалим временные папки с буквенно-цифровыми GUID-именами по следующим путям:
%LOCALAPPDATA%\1C\1cv8 %APPDATA%\1C\1cv8
Также можно удалить информационную базу из списка запуска 1С и добавить ее повторно с тем же путем подключения — это создаст новый GUID локального профиля базы.
Очистка серверного кэша (для клиент-серверного варианта):
Остановим службу сервера 1C:Enterprise Server Agent.
Перейдем в рабочий каталог сервера (по умолчанию каталог srvinfo) и удалим содержимое папки snccntx, а также временные файлы сессий.
Запустим службу сервера 1С заново.
Способ 3. Сброс точек останова и проверка конфигурации
Рассмотрим дополнительные сервисные действия, которые гарантируют корректность работы отладки:
В главном меню Конфигуратора перейдем в пункт Отладка -> Список точек останова и нажмем кнопку Удалить все.
Выполним синтаксический контроль через меню Конфигурация -> Проверка конфигурации, отметив флаги проверки логической целостности и синтаксиса модулей.
При необходимости выполним процедуру Администрирование -> Тестирование и исправление информационной базы с включенной реиндексацией и проверкой логической ссылочной целостности.
Правильная проверка типов и верификация условий
Когда отладчик ведет себя подозрительно, полезно убедиться, какие данные реально передаются в алгоритм, не полагаясь только на визуальный указатель строки.
Посмотрим на пример безопасной проверки составного типа с предварительным контролем заполненности:
Если ЗначениеЗаполнено(ДанныеПечати.Ссылка.ДокументОснование)
И ТипЗнч(ДанныеПечати.Ссылка.ДокументОснование) = Тип("ДокументСсылка.ПередачаТоваровМеждуОрганизациями") Тогда
// Обработка документа передачи
КонецЕсли;
Для гарантированной фиксации фактического типа и значения переменной перед сомнительным условием выведем диагностическую информацию в журнал регистрации с помощью метода ЗаписьЖурналаРегистрации:
Использование явного логирования позволяет точно определить, по какой ветке пошло выполнение программы, исключив влияние рассинхронизированного графического курсора отладчика.