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

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

При разработке на платформе 1С:Предприятие 8 начинающие программисты часто сталкиваются с вопросом выбора способа проверки значений перечислений. На первый взгляд может показаться, что сравнение строкового представления объекта и сравнение прямой ссылки работают одинаково, однако это глубокое заблуждение. В этой статье мы подробно разберем, почему один метод считается каноническим, а другой — грубой ошибкой, и проанализируем влияние этих подходов на стабильность и производительность системы.

Варианты сравнения: прямой доступ и строковое представление

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

Вариант 1 (Сравнение по ссылке):


Если ДанныеПечати.Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент Тогда
    ПечатьКодТНВЭД = 1;
КонецЕсли;

Вариант 2 (Сравнение по представлению):


Если СокрЛП(ДанныеПечати.Контрагент.ЮрФизЛицо) = "Юр. лицо, за пределами РФ" Тогда
    ПечатьКодТНВЭД = 1;
КонецЕсли;

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

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

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

  1. Зависимость от синонимов: Представление перечисления — это его "Синоним" в конфигураторе. Любой администратор или разработчик может изменить синоним (например, исправить опечатку или изменить формулировку на "Юр. лицо (нерезидент)"), и ваш код мгновенно перестанет работать. Программа не выдаст ошибку, она просто перестанет заходить внутрь условия Если.
  2. Проблема локализации: Если ваша база данных будет использоваться пользователями с разными языками интерфейса (например, русским и английским), строковое представление изменится в зависимости от настроек языка. Условие, завязанное на жесткую русскую строку, никогда не выполнится для англоязычного пользователя.
  3. Отсутствие контроля при рефакторинге: Платформа 1С имеет встроенные инструменты поиска ссылок. Если вы используете первый вариант, то при попытке удалить или переименовать значение перечисления конфигуратор предупредит вас о наличии ссылок в коде. Строковые константы внутри кавычек платформа "не видит", что приводит к появлению скрытых ошибок после обновлений.
  4. Производительность: Сравнение ссылок на уровне СУБД — это сравнение идентификаторов (GUID или числовых индексов), что происходит практически мгновенно. Посимвольное сравнение строк требует значительно больше ресурсов процессора, особенно если проверка выполняется в цикле по тысячам строк.

Использование функции ПредопределенноеЗначение

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

Разберем пример:


Если ДанныеПечати.ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮрФизЛицо.ЮрЛицоНеРезидент") Тогда
    ПечатьКодТНВЭД = 1;
КонецЕсли;

Этот подход имеет ряд преимуществ:

Оптимизация обращений "через точку"

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

Когда вы обращаетесь к ДанныеПечати.Контрагент, платформа может неявно считать из базы данных весь объект Контрагент со всеми его многочисленными реквизитами и табличными частями. Если таких обращений много, это может существенно замедлить работу системы и увеличить потребление оперативной памяти.

Рассмотрим, как правильно оптимизировать этот момент через запрос:


// Вместо обращения через точку в коде, лучше подготовить данные заранее
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПечатьДанные.Контрагент.ЮрФизЛицо КАК ЮрФизЛицо
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК ПечатьДанные
    |ГДЕ
    |	ПечатьДанные.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    Если Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент Тогда
        // Обработка данных
    КонецЕсли;
КонецЕсли;

Такой подход позволяет СУБД выбрать только одно нужное поле, не перегружая память сервера лишними данными. Однако, стоит помнить о здравом смысле: если код выполняется один раз при открытии формы, небольшая неоптимальность допустима ради читаемости. Если же код работает в цикле обработки сотен документов — использование запроса становится обязательным.

Типизация и надежность

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

Заключение

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

  1. Никогда не используйте строковые представления (синонимы) для логических проверок.
  2. Всегда сравнивайте ссылки, используя объект Перечисления или функцию ПредопределенноеЗначение().
  3. Помните о контексте исполнения: на сервере используйте прямые ссылки, на клиенте — ПредопределенноеЗначение().
  4. Следите за количеством обращений "через точку" в высоконагруженных участках кода и заменяйте их на предварительную выборку данных запросом.

Соблюдение этих простых принципов позволит вам создавать программный код, который легко сопровождать, переводить на другие языки и обновлять без риска внезапных поломок бизнес-логики.

← На главную