В процессе разработки и отладки внешних обработок (.epf) программисты 1С иногда сталкиваются с аномальным поведением: выражение в табло отладчика вычисляется как Истина, однако пошаговый отладчик проскакивает блок Если ... КонецЕсли и не выполняет вложенные инструкции. Разберем причины возникновения этой проблемы и рассмотрим способы её устранения.
Проанализируем основные факторы, из-за которых отладчик визуально ведет себя некорректно:
"68.03.Н") символы могут визуально совпадать, но иметь разные коды (кириллическая буква «Н» и латинская «H»). В таком случае метод НайтиПоКоду возвращает пустую ссылку.НайтиПоКоду на каждой итерации цикла снижает производительность и может давать непредсказуемый результат при отсутствии уникальности кодов.Рассмотрим пошагово, какие действия необходимо предпринимать при возникновении рассинхронизации отладчика и кода.
Файл - Открыть.%USERPROFILE%\AppData\Local\1C\1Cv8
%USERPROFILE%\AppData\Roaming\1C\1Cv8
/ClearCache.Разберем исходный фрагмент кода, в котором выполняется проверка счета в цикле:
Для каждого Запись из НаборЗаписейХозрасчетный Цикл
Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.03.Н") Тогда
НомераСтрок.Добавить(Запись.НомерСтроки-1);
Сообщить("Отработало");
КонецЕсли;
КонецЦикла;
В приведенном коде метод НайтиПоКоду вызывается на каждой итерации цикла. Это приводит к лишним обращениям к базе данных. Выясним, как написать этот код правильно и безопасно.
Вариант 1. Использование предопределенного счета (рекомендуемый)
Если счет является предопределенным в конфигурации, следует обращаться к нему напрямую через имя элемента, избегая обращения по строковому коду:
ИскомыйСчет = ПланыСчетов.Хозрасчетный.НДС_ПриобретениеОС; // Имя предопределенного счета
Для каждого Запись из НаборЗаписейХозрасчетный Цикл
Если Запись.СчетКт = ИскомыйСчет Тогда
НомераСтрок.Добавить(Запись.НомерСтроки - 1);
КонецЕсли;
КонецЦикла;
Вариант 2. Вынос поиска счета за пределы цикла
Если счет ищется динамически по коду, необходимо выполнить поиск один раз до входа в цикл и убедиться, что счет действительно найден:
ИскомыйСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.03.Н");
Если ЗначениеЗаполнено(ИскомыйСчет) Тогда
Для каждого Запись из НаборЗаписейХозрасчетный Цикл
Если Запись.СчетКт = ИскомыйСчет Тогда
НомераСтрок.Добавить(Запись.НомерСтроки - 1);
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Счет с указанным кодом не найден в плане счетов!");
КонецЕсли;
Соблюдение этих правил позволяет избежать проблем с производительностью, исключает ошибки ввода символов в разных раскладках и гарантирует корректное выполнение условий в коде.