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