Почему нельзя сравнивать объекты 1С по наименованию и как делать это правильно?

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

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

1. Надежность при изменении метаданных и рефакторинге

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

Рассмотрим, как работает обращение к предопределенному элементу:


Если Номенклатура.ТипНоменклатуры = Справочники.ТипыНоменклатуры.Серийная Тогда
    // Код выполнится корректно, даже если Наименование в пользовательском режиме изменится
КонецЕсли;

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

2. Производительность на уровне СУБД и "проблема точки"

Выясним причину, по которой сравнение ссылок работает быстрее. На уровне базы данных (SQL) ссылка — это уникальный 16-байтный идентификатор (GUID). Сравнение двоичных данных в индексированных полях происходит молниеносно. Сравнение строк — операция гораздо более затратная для процессора и памяти сервера.

Разберем еще один критический аспект производительности — обращение через точку. Когда мы пишем Номенклатура.ТипНоменклатуры.Наименование, платформа выполняет следующие действия:

  1. Получает ссылку на ТипНоменклатуры из объекта Номенклатура.
  2. Если данных о типе номенклатуры нет в кэше, платформа обращается к базе данных, чтобы считать весь объект (все его реквизиты), только ради того, чтобы вытащить одно строковое поле Наименование.

Если такой код выполняется внутри цикла (например, при обработке строк большого документа), это приводит к лавинообразному росту запросов к БД (проблема N+1). Использование простого сравнения ссылок Номенклатура.ТипНоменклатуры = Справочники.ТипыНоменклатуры.Серийная позволяет избежать лишнего обращения к данным самого справочника ТипыНоменклатуры, так как ссылка уже известна из данных Номенклатуры.

3. Чувствительность к "невидимым" ошибкам

Проанализируем типичные ошибки, которые невозможно отловить при визуальном осмотре кода, если используется строковое сравнение:

При использовании Справочники.ТипыНоменклатуры.Серийная такие ошибки исключены: конфигуратор просто не даст вам сохранить код с опечаткой в имени предопределенного элемента.

4. Локализация и мультиязычность

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

5. Соблюдение стандартов разработки 1С

Фирма 1С в своих официальных стандартах (раздел "Работа с объектами метаданных") прямо указывает на недопустимость завязывания логики на строковые представления. Программный код должен зависеть только от метаданных и идентификаторов, но не от данных, которые может изменить пользователь. Это правило является обязательным для прохождения сертификации "1С:Совместимо" и при проверке кода автоматизированными системами (например, 1С:КИП или SonarQube с плагинами для 1С).

6. Практические примеры и инструменты контроля

Посмотрим на пример правильной реализации проверки, если нам все же нужно сравнивать с элементом, который не является предопределенным (хотя это плохая практика). В таком случае лучше использовать дополнительные реквизиты или свойства, но даже тогда сравнение должно идти по значению, а не по имени.

Использование типизации и подсказок (Intellisense) в конфигураторе — еще один довод "за". Когда вы пишете Справочники., система сама предлагает список доступных справочников, а затем и список предопределенных элементов. Это ускоряет разработку и гарантирует правильность написания.

7. Целостность ссылок и поиск ссылок

Платформа 1С обладает мощным механизмом контроля ссылочной целостности. Инструмент "Поиск ссылок" покажет вам все места в коде, где используется конкретный предопределенный элемент. Если же вы используете строку, поиск превращается в гадание: "А не забыл ли я где-то еще написать это слово в кавычках?". Это значительно усложняет поддержку крупных систем и увеличивает риск возникновения багов при обновлении конфигурации.

Резюме: Сравнение по наименованию — это классический признак "хрупкого" кода. Чтобы создавать надежные и производительные решения, всегда используйте сравнение ссылок, предопределенные элементы или значения перечислений. Это обеспечит стабильность вашей программы при любых действиях пользователя и изменениях в бизнес-логике.

← На главную