Почему в 1С не срабатывает условие Если при совпадении значений и как это исправить

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

В процессе разработки и отладки внешних обработок (.epf) программисты 1С иногда сталкиваются с аномальным поведением: выражение в табло отладчика вычисляется как Истина, однако пошаговый отладчик проскакивает блок Если ... КонецЕсли и не выполняет вложенные инструкции. Разберем причины возникновения этой проблемы и рассмотрим способы её устранения.

Основные причины проблемы при отладке

Проанализируем основные факторы, из-за которых отладчик визуально ведет себя некорректно:

  1. Кэширование байт-кода внешней обработки. Платформа 1С сохраняет скомпилированные модули внешних файлов во временных каталогах. Если обработка часто перезаписывается и переоткрывается, платформа может исполнять старую скомпилированную версию из кэша, хотя отладчик показывает строки из актуального файла на диске. В итоге происходят сдвиги точек останова и несовпадение исполняемых строк.
  2. Разница в раскладке клавиатуры. При поиске по строковому коду (например, "68.03.Н") символы могут визуально совпадать, но иметь разные коды (кириллическая буква «Н» и латинская «H»). В таком случае метод НайтиПоКоду возвращает пустую ссылку.
  3. Вызов функции поиска внутри цикла. Вызов метода НайтиПоКоду на каждой итерации цикла снижает производительность и может давать непредсказуемый результат при отсутствии уникальности кодов.

Способы решения и очистка кэша

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

  1. Сброс кэша внешней обработки. Самый быстрый способ заставить платформу скомпилировать модуль заново — сохранить внешнюю обработку под новым именем или в другую папку и открыть её заново через меню Файл - Открыть.
  2. Очистка временных файлов 1С. Завершим работу платформы 1С:Предприятие и Конфигуратора, после чего удалим содержимое папок кэша платформы в каталогах пользователя:

    %USERPROFILE%\AppData\Local\1C\1Cv8

    %USERPROFILE%\AppData\Roaming\1C\1Cv8

    Альтернативно можно запустить информационную базу с ключом командной строки /ClearCache.
  3. Перезапуск Конфигуратора и Предприятия. Полный перезапуск рабочих сеансов очищает контекст исполнения и перезагружает скомпилированные модули.

Оптимизация кода и правильное сравнение счетов

Разберем исходный фрагмент кода, в котором выполняется проверка счета в цикле:


Для каждого Запись из НаборЗаписейХозрасчетный Цикл
    Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.03.Н") Тогда
        НомераСтрок.Добавить(Запись.НомерСтроки-1);
        Сообщить("Отработало");        
    КонецЕсли;    
КонецЦикла;

В приведенном коде метод НайтиПоКоду вызывается на каждой итерации цикла. Это приводит к лишним обращениям к базе данных. Выясним, как написать этот код правильно и безопасно.

Вариант 1. Использование предопределенного счета (рекомендуемый)

Если счет является предопределенным в конфигурации, следует обращаться к нему напрямую через имя элемента, избегая обращения по строковому коду:


ИскомыйСчет = ПланыСчетов.Хозрасчетный.НДС_ПриобретениеОС; // Имя предопределенного счета
Для каждого Запись из НаборЗаписейХозрасчетный Цикл
    Если Запись.СчетКт = ИскомыйСчет Тогда
        НомераСтрок.Добавить(Запись.НомерСтроки - 1);
    КонецЕсли;    
КонецЦикла;

Вариант 2. Вынос поиска счета за пределы цикла

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


ИскомыйСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.03.Н");

Если ЗначениеЗаполнено(ИскомыйСчет) Тогда
    Для каждого Запись из НаборЗаписейХозрасчетный Цикл
        Если Запись.СчетКт = ИскомыйСчет Тогда
            НомераСтрок.Добавить(Запись.НомерСтроки - 1);
        КонецЕсли;    
    КонецЦикла;
Иначе
    Сообщить("Счет с указанным кодом не найден в плане счетов!");
КонецЕсли;

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

← На главную