В практике разработчика 1С иногда возникает парадоксальная ситуация: вы пишете логическое условие в модуле объекта (например, в процедуре ПередЗаписью или ОбработкаПроведения), отладчик на точке останова подтверждает, что значения идентичны, но программа упорно игнорирует ветку Если и уходит в Иначе (или вообще ничего не делает). Давайте разберем, почему это происходит, и как справиться с «призраками» в коде.
Рассмотрим типичный пример кода, который вызывает затруднения:
Если ЭтотОбъект.Готовность = Перечисления.СостояниеЗаказа.Готов Тогда
// Код, который должен выполниться
Сообщить("Заказ готов!");
Иначе
// Код, который выполняется вопреки логике
Сообщить("Заказ еще в работе");
КонецЕсли;
Проанализируем действия разработчика. При остановке на строке с условием через Shift+F9 (Вычислить выражение) система может показать Истина. Однако при нажатии F8 (Шагнуть) курсор прыгает в ветку Иначе. Выясним причину этого поведения.
Самая частая причина расхождения реальности и текста в конфигураторе — это использование динамического обновления конфигурации базы данных. Когда в базу внесены изменения, а пользователи продолжают в ней работать, платформа пытается «подсунуть» новый код «на лету».
В результате возникает ситуация, когда:
Для решения этой проблемы необходимо выполнить полное обновление. Рассмотрим алгоритм действий: попросите всех пользователей выйти из базы, внесите любое незначительное изменение в модуль (например, добавьте пробел), нажмите F7 для принятия изменений конфигурации и перезапустите сеанс 1С:Предприятие.
У платформы 1С существует сложная система кэширования. Кэш хранится как на стороне клиента (локальный компьютер), так и на стороне сервера. Если кэш «битый», то данные о типах (например, значениях Перечисления) или структуре объектов могут считываться некорректно.
Разберем способы очистки кэша по шагам:
/ClearCache. Это очистит кэш клиентских запросов.%AppData%\1C\1cv8\ и %LocalAppData%\1C\1cv8\. Удалите там все папки с именами в виде GUID (длинные наборы символов). Это самый надежный способ «сбросить» состояние клиентской части.Проанализируем техническую сторону сравнения. В 1С значения перечислений сравниваются по их внутреннему идентификатору (GUID). Визуально в отладчике вы можете видеть два одинаковых названия, например, «Готов», но если эти значения принадлежат разным объектам метаданных или были некорректно перенесены при объединении баз, результат сравнения будет Ложь.
Чтобы проверить это, используйте в табло отладчика следующие выражения:
ТипЗнч(ЭтотОбъект.Готовность) // Проверяем тип реквизита
ТипЗнч(Перечисления.ИмяПеречисления.Значение) // Проверяем тип эталона
Если типы совпадают, но условие не работает, попробуйте переписать обращение. Хотя ЭтотОбъект.Реквизит — это корректный синтаксис, внутри модуля объекта рекомендуется обращаться напрямую по имени реквизита. Это исключает лишние обращения к ссылке текущего объекта.
Если вы не уверены, выполняется ли ваш код вообще, используйте метод Сообщить() в самом начале процедуры. Рассмотрим пример диагностики в процедуре ОбработкаПроведения:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Сообщить("--- Процедура запущена ---");
Сообщить("Значение реквизита: " + ЭтотОбъект.Готовность);
Сообщить("Эталонное значение: " + Перечисления.ИмяПеречисления.Значение);
Если ЭтотОбъект.Готовность = Перечисления.ИмяПеречисления.Значение Тогда
Сообщить("Условие сработало!");
Иначе
Сообщить("Условие НЕ сработало!");
КонецЕсли;
КонецПроцедуры
Если после записи документа в окне сообщений не появилось «Процедура запущена», значит, платформа исполняет старую версию модуля, где этого кода еще нет. В этом случае поможет только полная очистка кэша сервера или перезапуск службы 1C:Enterprise Server.
Чтобы минимизировать появление таких «фантомных» ошибок, придерживайтесь следующих правил:
-debug в строке запуска службы).Подводя итог, можно сказать, что если отладчик показывает Истину, а код идет по ветке Ложь, — это практически всегда признак рассинхронизации компилированного кода и исходного текста. Перезапуск системы, очистка кэша и отказ от динамических обновлений — ваши главные инструменты в этой ситуации.