В процессе разработки на платформе 1С:Предприятие начинающие специалисты часто сталкиваются с ситуацией, когда визуально одинаковые значения при сравнении в коде выдают результат Ложь. Типичный пример: в переменной мы видим текст "21%", сравниваем его со строкой "21%", но условие не срабатывает. В данной статье мы подробно разберем, почему так происходит, изучим разницу между типами данных и научимся правильно писать условия сравнения.
Рассмотрим ситуацию, описанную автором темы. При попытке выполнить код:
Если Строка.СтавкаНДС <> "21%" Тогда
// Какое-то действие
КонецЕсли;
программа всегда считает, что значения не равны. Причина кроется в том, что в 1С переменные могут содержать не только простые значения (строки, числа, даты), но и ссылочные типы данных. В большинстве типовых конфигураций поле СтавкаНДС является ссылкой на объект метаданных Перечисление (ПеречислениеСсылка.СтавкиНДС).
Когда мы смотрим в отладчике или на форму, 1С показывает нам Представление объекта — то есть удобный для человека текст. Однако для системы ссылка на элемент перечисления и текстовая строка — это абсолютно разные сущности, хранящиеся в памяти по-разному. Сравнение ссылки со строкой всегда будет давать отрицательный результат, так как типы не совпадают.
Проанализируем самый надежный и профессиональный метод решения задачи. Вместо того чтобы пытаться угадать текстовое значение, которое видит пользователь, мы должны обратиться непосредственно к значению перечисления, заданному в конфигураторе. Это гарантирует стабильность кода даже при смене языка интерфейса или изменении синонимов.
Для реализации этого метода используем обращение к коллекции Перечисления:
// Сравнение значения в строке табличной части с конкретным значением перечисления
Если Строка.СтавкаНДС <> Перечисления.СтавкиНДС.НДС21 Тогда
Сообщить("Ставка не равна 21%");
КонецЕсли;
Разберем, почему этот способ лучше:
НДС21 останется прежней.СтавкиНДС.НДС_21), система выдаст ошибку еще на этапе сохранения кода, тогда как ошибку в строке "21%" придется искать долго в режиме исполнения.Рассмотрим альтернативный вариант, который часто используют для быстрой отладки или в случаях, когда тип данных в переменной заранее неизвестен. Мы можем принудительно преобразовать значение переменной в строку с помощью функции Строка().
Выясним, как это выглядит в коде:
// Преобразуем ссылку в строку и сравниваем с текстом
Если Строка(Строка.СтавкаНДС) <> "21%" Тогда
// Условие сработает, если строковое представление не совпадает
КонецЕсли;
Важное замечание: Хотя этот метод кажется простым, он считается "плохим тоном" в профессиональной разработке 1С. Рассмотрим основные риски:
Строка() вернет значение на языке текущего пользователя. Код, написанный под русскую локализацию, "сломается" у пользователя с английским интерфейсом.Для того чтобы не заниматься "кодингом угадыванием", разберем инструменты отладки. Если вы не уверены, что именно лежит в переменной СтавкаНДС, выполните следующие шаги:
Если в колонке "Тип" написано ПеречислениеСсылка.СтавкиНДС, значит, вам нужно использовать Решение №1. Если написано Строка, значит, проблема в лишних пробелах или невидимых символах (например, неразрывных пробелах).
Также полезно использовать встроенную функцию ТипЗнч() непосредственно в коде для проверки логики:
Если ТипЗнч(Строка.СтавкаНДС) = Тип("ПеречислениеСсылка.СтавкиНДС") Тогда
// Мы точно знаем, что это перечисление, можем сравнивать через точку
КонецЕсли;
Проанализируем контекст обсуждения: автор упоминает ставку 21%. Это характерно для Литвы и других стран Балтии. В стандартных российских конфигурациях 1С (таких как БП 3.0 или ERP) по умолчанию в перечислении СтавкиНДС могут отсутствовать такие значения.
Если вы адаптируете программу под законодательство другой страны, убедитесь, что:
Перечисления.СтавкиНДС добавлено соответствующее значение (например, имя НДС21, синоним 21%).Пример для случая, если ставки НДС — это справочник:
СтавкаОбъект = Справочники.СтавкиНДС.НайтиПоНаименованию("21%");
Если Строка.СтавкаНДС <> СтавкаОбъект Тогда
// Обработка
КонецЕсли;
Мы выяснили, что основная проблема при сравнении переменной со строкой в 1С заключается в различии типов данных. Главное правило: всегда стремитесь сравнивать объекты одного типа. Использование ссылок на метаданные (Перечисления.Имя.Значение) является эталонным подходом, обеспечивающим надежность и быстродействие вашей системы. Помните об отладчике — это ваш лучший инструмент для понимания того, что на самом деле происходит внутри программы.