Как правильно сравнивать значения перечислений в коде 1С:Предприятие 8

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

При разработке в среде 1С:Предприятие 8 начинающие программисты часто сталкиваются с ситуацией, когда логическое условие не срабатывает, хотя визуально данные кажутся верными. Одной из самых распространенных ошибок является попытка сравнения значения типа ПеречислениеСсылка с обычной текстовой строкой. Разберем детально, почему так происходит, и как правильно писать программный код для работы с перечислениями.

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

Рассмотрим ситуацию: у нас есть объект Контрагент, у которого присутствует реквизит ЮрФизЛицо. В конфигураторе этому реквизиту назначен тип ПеречислениеСсылка.ЮрФизЛицо. Новичок часто пытается написать код следующим образом:


Если Контрагент.ЮрФизЛицо = "Физ. лицо" Тогда 
    // Действие
КонецЕсли;

Проанализируем этот фрагмент. В левой части условия находится ссылка на объект метаданных (специальный идентификатор в базе данных), а в правой — строковый литерал. В системе 1С это принципиально разные типы данных. Такое условие всегда будет возвращать Ложь, даже если на экране пользователь видит текст "Физ. лицо".

Правильный синтаксис сравнения в программном коде

Для того чтобы проверить значение перечисления, необходимо обращаться к нему через глобальный контекст и менеджер соответствующего перечисления. Выясним, как это выглядит на практике. Обращение к конкретному значению строится по структуре: Перечисления.[ИмяПеречисления].[ИмяЗначения].

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


Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
    ОбластьМакета.Параметры.ОГРНПокупателя = "ОГРНИП" + Контрагент.ОГРН;
ИначеЕсли Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
    ОбластьМакета.Параметры.ОГРНПокупателя = "ОГРН" + Контрагент.ОГРН;
КонецЕсли;

В данном случае мы сравниваем ссылку со ссылкой, что является корректным с точки зрения типизации 1С и обеспечивает высокую скорость выполнения операции.

Различие между Именем и Синонимом

Важно понимать внутреннее устройство перечисления в конфигураторе. У каждого значения есть два ключевых параметра:

  1. Имя — используется непосредственно в коде (например, ФизЛицо). Оно не должно содержать пробелов и спецсимволов.
  2. Синоним — то, что отображается пользователю в интерфейсе (например, "Физическое лицо" или "Физ. лицо").

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

Работа с перечислениями в запросах

Часто задача требует фильтрации данных не только во встроенном языке, но и в запросах. Рассмотрим, как работать с перечислениями в языке запросов 1С. Здесь нельзя просто написать имя перечисления, нужно использовать конструкцию ЗНАЧЕНИЕ().

Пример использования в тексте запроса:


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.Представление
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)

Также хорошей практикой считается передача значения перечисления в запрос через параметры. Это делает код более гибким:


Запрос = Новый Запрос;
Запрос.Текст = "ГДЕ Контрагенты.ЮрФизЛицо = &ТипЛица";
Запрос.УстановитьПараметр("ТипЛица", Перечисления.ЮрФизЛицо.ФизЛицо);

Проверка на пустое значение и надежность кода

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

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

  1. Использование метода Пустая(): Если Контрагент.ЮрФизЛицо.Пустая() Тогда...
  2. Сравнение с пустой ссылкой менеджера: Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ПустаяСсылка() Тогда...

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

Как получить строковое представление для вывода

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

Рассмотрим пример:


ТекстДляЛога = "Тип контрагента определен как: " + Строка(Контрагент.ЮрФизЛицо);
Сообщить(ТекстДляЛога);

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

Рекомендации для обучения начинающих разработчиков

Для того чтобы глубоко освоить работу с объектами метаданных и типами данных в 1С, профессиональное сообщество рекомендует изучить следующие материалы:

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

← На главную