При разработке в среде 1С:Предприятие 8 начинающие программисты часто сталкиваются с ситуацией, когда логическое условие не срабатывает, хотя визуально данные кажутся верными. Одной из самых распространенных ошибок является попытка сравнения значения типа ПеречислениеСсылка с обычной текстовой строкой. Разберем детально, почему так происходит, и как правильно писать программный код для работы с перечислениями.
Рассмотрим ситуацию: у нас есть объект Контрагент, у которого присутствует реквизит ЮрФизЛицо. В конфигураторе этому реквизиту назначен тип ПеречислениеСсылка.ЮрФизЛицо. Новичок часто пытается написать код следующим образом:
Если Контрагент.ЮрФизЛицо = "Физ. лицо" Тогда
// Действие
КонецЕсли;
Проанализируем этот фрагмент. В левой части условия находится ссылка на объект метаданных (специальный идентификатор в базе данных), а в правой — строковый литерал. В системе 1С это принципиально разные типы данных. Такое условие всегда будет возвращать Ложь, даже если на экране пользователь видит текст "Физ. лицо".
Для того чтобы проверить значение перечисления, необходимо обращаться к нему через глобальный контекст и менеджер соответствующего перечисления. Выясним, как это выглядит на практике. Обращение к конкретному значению строится по структуре: Перечисления.[ИмяПеречисления].[ИмяЗначения].
Исходя из условий задачи, правильный программный код будет выглядеть так:
Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
ОбластьМакета.Параметры.ОГРНПокупателя = "ОГРНИП" + Контрагент.ОГРН;
ИначеЕсли Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
ОбластьМакета.Параметры.ОГРНПокупателя = "ОГРН" + Контрагент.ОГРН;
КонецЕсли;
В данном случае мы сравниваем ссылку со ссылкой, что является корректным с точки зрения типизации 1С и обеспечивает высокую скорость выполнения операции.
Важно понимать внутреннее устройство перечисления в конфигураторе. У каждого значения есть два ключевых параметра:
ФизЛицо). Оно не должно содержать пробелов и спецсимволов.Проанализируем ситуацию: если вы измените синоним в конфигураторе, ваш программный код, использующий обращение через Имя, продолжит работать. Если бы вы использовали сравнение со строкой, код бы "сломался" после первого же изменения интерфейсного названия.
Часто задача требует фильтрации данных не только во встроенном языке, но и в запросах. Рассмотрим, как работать с перечислениями в языке запросов 1С. Здесь нельзя просто написать имя перечисления, нужно использовать конструкцию ЗНАЧЕНИЕ().
Пример использования в тексте запроса:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.Представление
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)
Также хорошей практикой считается передача значения перечисления в запрос через параметры. Это делает код более гибким:
Запрос = Новый Запрос;
Запрос.Текст = "ГДЕ Контрагенты.ЮрФизЛицо = &ТипЛица";
Запрос.УстановитьПараметр("ТипЛица", Перечисления.ЮрФизЛицо.ФизЛицо);
Разберем еще один важный нюанс. В базе данных реквизит может быть не заполнен. Если мы используем простую конструкцию Если ... Иначе, то в блок Иначе попадут не только юридические лица, но и пустые значения, что может привести к логическим ошибкам в отчетах или печатных формах.
Посмотрим, как выполнить проверку на пустую ссылку:
Пустая(): Если Контрагент.ЮрФизЛицо.Пустая() Тогда...Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ПустаяСсылка() Тогда...Рекомендация: всегда обрабатывайте вариант, когда значение не выбрано, особенно в критически важных узлах системы.
Если вам все же нужно вывести значение перечисления пользователю (например, в лог или простое текстовое сообщение), используйте функцию Строка(). Она вернет именно Синоним значения.
Рассмотрим пример:
ТекстДляЛога = "Тип контрагента определен как: " + Строка(Контрагент.ЮрФизЛицо);
Сообщить(ТекстДляЛога);
Помните, что результат функции Строка() предназначен только для отображения, но никогда не для логических сравнений в коде.
Для того чтобы глубоко освоить работу с объектами метаданных и типами данных в 1С, профессиональное сообщество рекомендует изучить следующие материалы:
Постепенное изучение этих источников позволит вам избежать ошибок с типизацией и писать чистый, производительный код, соответствующий стандартам разработки 1С.