Как правильно сравнить переменную со строкой в 1С и почему возникает несовпадение

Программист 1С v8.3 (Обычные формы)
← На главную

В процессе разработки на платформе 1С:Предприятие начинающие специалисты часто сталкиваются с ситуацией, когда визуально одинаковые значения при сравнении в коде выдают результат Ложь. Типичный пример: в переменной мы видим текст "21%", сравниваем его со строкой "21%", но условие не срабатывает. В данной статье мы подробно разберем, почему так происходит, изучим разницу между типами данных и научимся правильно писать условия сравнения.

Анализ проблемы: почему переменная не равна строке

Рассмотрим ситуацию, описанную автором темы. При попытке выполнить код:


Если Строка.СтавкаНДС <> "21%" Тогда
    // Какое-то действие
КонецЕсли;

программа всегда считает, что значения не равны. Причина кроется в том, что в 1С переменные могут содержать не только простые значения (строки, числа, даты), но и ссылочные типы данных. В большинстве типовых конфигураций поле СтавкаНДС является ссылкой на объект метаданных Перечисление (ПеречислениеСсылка.СтавкиНДС).

Когда мы смотрим в отладчике или на форму, 1С показывает нам Представление объекта — то есть удобный для человека текст. Однако для системы ссылка на элемент перечисления и текстовая строка — это абсолютно разные сущности, хранящиеся в памяти по-разному. Сравнение ссылки со строкой всегда будет давать отрицательный результат, так как типы не совпадают.

Решение №1: Сравнение с объектом метаданных (Правильный способ)

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

Для реализации этого метода используем обращение к коллекции Перечисления:


// Сравнение значения в строке табличной части с конкретным значением перечисления
Если Строка.СтавкаНДС <> Перечисления.СтавкиНДС.НДС21 Тогда
    Сообщить("Ставка не равна 21%");
КонецЕсли;

Разберем, почему этот способ лучше:

  1. Независимость от представления: Если завтра бухгалтер решит переименовать "21%" в "НДС 21 (осн.)", ваш код продолжит работать, так как внутренняя ссылка НДС21 останется прежней.
  2. Производительность: Сравнение двух ссылок происходит на уровне идентификаторов в базе данных, что работает быстрее, чем строковое сравнение.
  3. Контроль ошибок: Если вы ошибетесь в написании имени перечисления (например, напишете СтавкиНДС.НДС_21), система выдаст ошибку еще на этапе сохранения кода, тогда как ошибку в строке "21%" придется искать долго в режиме исполнения.

Решение №2: Приведение значения к строке

Рассмотрим альтернативный вариант, который часто используют для быстрой отладки или в случаях, когда тип данных в переменной заранее неизвестен. Мы можем принудительно преобразовать значение переменной в строку с помощью функции Строка().

Выясним, как это выглядит в коде:


// Преобразуем ссылку в строку и сравниваем с текстом
Если Строка(Строка.СтавкаНДС) <> "21%" Тогда
    // Условие сработает, если строковое представление не совпадает
КонецЕсли;

Важное замечание: Хотя этот метод кажется простым, он считается "плохим тоном" в профессиональной разработке 1С. Рассмотрим основные риски:

Как не гадать, а точно знать тип переменной

Для того чтобы не заниматься "кодингом угадыванием", разберем инструменты отладки. Если вы не уверены, что именно лежит в переменной СтавкаНДС, выполните следующие шаги:

  1. Установите точку останова на строке кода (клавиша F9).
  2. Запустите программу в режиме отладки (клавиша F5) и дойдите до этого момента.
  3. Нажмите Shift + F9 (Вычислить выражение).
  4. Введите имя вашей переменной и посмотрите в колонку Тип.

Если в колонке "Тип" написано ПеречислениеСсылка.СтавкиНДС, значит, вам нужно использовать Решение №1. Если написано Строка, значит, проблема в лишних пробелах или невидимых символах (например, неразрывных пробелах).

Также полезно использовать встроенную функцию ТипЗнч() непосредственно в коде для проверки логики:


Если ТипЗнч(Строка.СтавкаНДС) = Тип("ПеречислениеСсылка.СтавкиНДС") Тогда
    // Мы точно знаем, что это перечисление, можем сравнивать через точку
КонецЕсли;

Особенности ставок НДС в различных регионах

Проанализируем контекст обсуждения: автор упоминает ставку 21%. Это характерно для Литвы и других стран Балтии. В стандартных российских конфигурациях 1С (таких как БП 3.0 или ERP) по умолчанию в перечислении СтавкиНДС могут отсутствовать такие значения.

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

  1. В конфигураторе в объект Перечисления.СтавкиНДС добавлено соответствующее значение (например, имя НДС21, синоним 21%).
  2. Если ставки хранятся не в перечислении, а в Справочнике, то сравнение будет выглядеть иначе: через поиск по наименованию или коду.

Пример для случая, если ставки НДС — это справочник:


СтавкаОбъект = Справочники.СтавкиНДС.НайтиПоНаименованию("21%");
Если Строка.СтавкаНДС <> СтавкаОбъект Тогда
    // Обработка
КонецЕсли;

Заключение

Мы выяснили, что основная проблема при сравнении переменной со строкой в 1С заключается в различии типов данных. Главное правило: всегда стремитесь сравнивать объекты одного типа. Использование ссылок на метаданные (Перечисления.Имя.Значение) является эталонным подходом, обеспечивающим надежность и быстродействие вашей системы. Помните об отладчике — это ваш лучший инструмент для понимания того, что на самом деле происходит внутри программы.

← На главную