В процессе разработки на платформе 1С:Предприятие начинающие специалисты часто сталкиваются с искушением использовать привычное строковое сравнение. На первый взгляд, конструкция Номенклатура.ТипНоменклатуры.Наименование = "Серийная" кажется понятной и читаемой. Однако опытные архитекторы и стандарты фирмы 1С категорически запрещают такой подход. В этой статье мы подробно разберем, почему обращение к строковым реквизитам в логических условиях — это путь к нестабильной работе системы, и рассмотрим правильные методы сравнения объектов.
Проанализируем ситуацию: сегодня ваш элемент справочника называется "Серийная", а завтра бизнес-задача изменилась, и бухгалтер переименовал его в "Серийная продукция". Если ваш код завязан на строку, он мгновенно перестанет работать, причем система не выдаст никакой ошибки — условие просто начнет возвращать Ложь.
Рассмотрим, как работает обращение к предопределенному элементу:
Если Номенклатура.ТипНоменклатуры = Справочники.ТипыНоменклатуры.Серийная Тогда
// Код выполнится корректно, даже если Наименование в пользовательском режиме изменится
КонецЕсли;
Использование предопределенных элементов (или значений перечислений) связывает ваш код с внутренним идентификатором объекта. Если вы решите переименовать имя предопределенного элемента в конфигураторе, платформа автоматически предложит обновить все места использования. В случае со строкой "Серийная" вы останетесь один на один с текстовым поиском по всей конфигурации.
Выясним причину, по которой сравнение ссылок работает быстрее. На уровне базы данных (SQL) ссылка — это уникальный 16-байтный идентификатор (GUID). Сравнение двоичных данных в индексированных полях происходит молниеносно. Сравнение строк — операция гораздо более затратная для процессора и памяти сервера.
Разберем еще один критический аспект производительности — обращение через точку. Когда мы пишем Номенклатура.ТипНоменклатуры.Наименование, платформа выполняет следующие действия:
ТипНоменклатуры из объекта Номенклатура.Наименование.Если такой код выполняется внутри цикла (например, при обработке строк большого документа), это приводит к лавинообразному росту запросов к БД (проблема N+1). Использование простого сравнения ссылок Номенклатура.ТипНоменклатуры = Справочники.ТипыНоменклатуры.Серийная позволяет избежать лишнего обращения к данным самого справочника ТипыНоменклатуры, так как ссылка уже известна из данных Номенклатуры.
Проанализируем типичные ошибки, которые невозможно отловить при визуальном осмотре кода, если используется строковое сравнение:
"Серийная " (с пробелом в конце) не равна "Серийная". Пользователь может случайно добавить пробел при редактировании справочника, и логика программы сломается.При использовании Справочники.ТипыНоменклатуры.Серийная такие ошибки исключены: конфигуратор просто не даст вам сохранить код с опечаткой в имени предопределенного элемента.
Если ваша конфигурация предполагает использование на разных языках (например, для международного филиала), наименование объекта будет меняться в зависимости от языка интерфейса пользователя. Строковое сравнение в этом случае становится абсолютно невозможным. Ссылка же всегда остается неизменной, какой бы язык ни выбрал пользователь.
Фирма 1С в своих официальных стандартах (раздел "Работа с объектами метаданных") прямо указывает на недопустимость завязывания логики на строковые представления. Программный код должен зависеть только от метаданных и идентификаторов, но не от данных, которые может изменить пользователь. Это правило является обязательным для прохождения сертификации "1С:Совместимо" и при проверке кода автоматизированными системами (например, 1С:КИП или SonarQube с плагинами для 1С).
Посмотрим на пример правильной реализации проверки, если нам все же нужно сравнивать с элементом, который не является предопределенным (хотя это плохая практика). В таком случае лучше использовать дополнительные реквизиты или свойства, но даже тогда сравнение должно идти по значению, а не по имени.
Использование типизации и подсказок (Intellisense) в конфигураторе — еще один довод "за". Когда вы пишете Справочники., система сама предлагает список доступных справочников, а затем и список предопределенных элементов. Это ускоряет разработку и гарантирует правильность написания.
Платформа 1С обладает мощным механизмом контроля ссылочной целостности. Инструмент "Поиск ссылок" покажет вам все места в коде, где используется конкретный предопределенный элемент. Если же вы используете строку, поиск превращается в гадание: "А не забыл ли я где-то еще написать это слово в кавычках?". Это значительно усложняет поддержку крупных систем и увеличивает риск возникновения багов при обновлении конфигурации.
Резюме: Сравнение по наименованию — это классический признак "хрупкого" кода. Чтобы создавать надежные и производительные решения, всегда используйте сравнение ссылок, предопределенные элементы или значения перечислений. Это обеспечит стабильность вашей программы при любых действиях пользователя и изменениях в бизнес-логике.