К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как найти перечисление по наименованию в 1С 8

Как найти значение перечисления по наименованию в 1С 8: метод НайтиПоНаименованию, поиск по синониму, примеры кода, типичные ошибки и способы проверки результата.

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

Для этого у менеджера перечисления есть встроенный метод НайтиПоНаименованию(). Он сравнивает переданную строку с наименованиями (синонимами) значений перечисления и возвращает либо ссылку на найденное значение, либо пустую ссылку. Метод прост, но у него есть нюансы: чувствительность к регистру, поведение при дублях, отличие наименования от имени значения в метаданных.

Ниже разобраны синтаксис метода, рабочие примеры кода, альтернативные способы поиска и типичные ошибки, из-за которых поиск возвращает пустую ссылку даже при «правильной» строке.

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

У каждого значения перечисления в конфигураторе есть два ключевых свойства: имя — идентификатор, по которому значение доступно в коде (например, НаличныйРасчет), и синоним — представление, которое видит пользователь (например, «Наличный расчёт»). Метод НайтиПоНаименованию() работает именно с синонимом, а не с именем.

Это принципиальный момент. Если внешняя система передаёт строку «НаличныйРасчет» (имя из метаданных), а синоним задан как «Наличный расчёт», поиск по наименованию вернёт пустую ссылку. Поэтому перед выбором способа поиска нужно понять, что именно содержится во входной строке: пользовательское представление или программный идентификатор.

Проверить синонимы значений можно в конфигураторе: откройте ветку «Перечисления», выберите нужное перечисление и посмотрите колонки «Имя» и «Синоним» на закладке «Данные». Если синонимы не заполнялись вручную, платформа формирует их автоматически из имён, разбивая по заглавным буквам.

Синтаксис метода НайтиПоНаименованию

Метод вызывается через менеджер конкретного перечисления и принимает один обязательный параметр — строку для поиска:

Результат = Перечисления.ВидыОпераций.НайтиПоНаименованию("Поступление товаров");

Возвращаемое значение — ссылка на значение перечисления. Если совпадение найдено, это заполненная ссылка; если нет — пустая ссылка данного перечисления. Проверка результата выполняется через ЗначениеЗаполнено() или сравнением с пустой ссылкой:

НайденноеЗначение = Перечисления.ВидыОпераций.НайтиПоНаименованию(СтрокаИзФайла);

Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда

Сообщить("Значение перечисления не найдено: " + СтрокаИзФайла);

КонецЕсли;

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

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

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

Поиск при загрузке данных из файла

Типовой сценарий — загрузка из Excel или CSV, где колонка содержит строковое представление статуса. Перед поиском строку стоит очистить от лишних пробелов, потому что «Статус » с пробелом на конце не совпадёт с синонимом:

СтрокаСтатуса = СокрЛП(ДанныеСтроки.Статус);

СтатусДокумента = Перечисления.СтатусыЗаказов.НайтиПоНаименованию(СтрокаСтатуса);

Если Не ЗначениеЗаполнено(СтатусДокумента) Тогда

СтатусДокумента = Перечисления.СтатусыЗаказов.Новый; // значение по умолчанию

КонецЕсли;

Поиск по имени значения из метаданных

Если внешняя система передаёт именно имя значения (как в конфигураторе), надёжнее не НайтиПоНаименованию(), а обращение через коллекцию метаданных или попытка прямого обращения:

МенеджерПеречисления = Перечисления.СпособыДоставки;

Если Метаданные.Перечисления.СпособыДоставки.ЗначенияПеречисления.Найти(ИмяЗначения) <> Неопределено Тогда

Значение = МенеджерПеречисления[ИмяЗначения];

Иначе

Значение = МенеджерПеречисления.ПустаяСсылка();

КонецЕсли;

Такой подход устойчив к переименованию синонимов: если прикладной специалист поменяет представление значения для пользователей, код продолжит работать.

Особенности поведения метода

Метод выполняет сравнение без учёта регистра: строки «поступление товаров» и «Поступление товаров» будут найдены одинаково. Однако лишние пробелы, неразрывные пробелы из выгрузок и различия в букве «ё»/«е» влияют на результат — сравнение идёт посимвольно по очищенной строке.

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

Ещё одна особенность: метод не ищет по частичному совпадению. Строка «Поступление» не найдёт значение с синонимом «Поступление товаров и услуг». Для нечёткого поиска придётся перебирать значения вручную и сравнивать представления через СтрНайти().

Типичные ошибки
01
Поиск по имени значения вместо синонима — метод возвращает пустую ссылку, хотя значение существует
02
Отсутствие СокрЛП() для строк из файлов — невидимые пробелы ломают сравнение
03
Отсутствие проверки результата — пустая ссылка молча записывается в документ и всплывает при проведении
04
Использование НайтиПоНаименованию для перебора в цикле с нечётким сравнением — метод не поддерживает поиск по подстроке

Альтернативные способы получения значения перечисления

Когда строка содержит имя значения, а не синоним, или нужен более контролируемый поиск, используют другие подходы:

  • Прямое обращение — Перечисления.ВидОперации.ИмяЗначения. Самый быстрый и надёжный способ, но требует, чтобы имя было известно на этапе разработки.
  • Обращение по строковому имени через квадратные скобки — Перечисления.ВидОперации[ИмяСтрокой]. Удобно, когда имя приходит извне; при несуществующем имени вызывает исключение, поэтому оборачивают в Попытка...Исключение или предварительно проверяют через метаданные.
  • Перебор значений — цикл по Метаданные.Перечисления.Имя.ЗначенияПеречисления со сравнением синонима или имени. Подходит для нечёткого поиска и построения таблиц соответствий.
  • Предопределённая таблица соответствий — соответствие «строка из внешней системы → значение перечисления», заполненное в коде. Лучший вариант для интеграций, где строки внешней системы не совпадают ни с синонимами, ни с именами.

Сравнение вариантов

НайтиПоНаименованию

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

Обращение по имени через [Имя]

Подходит, когда известно имя значения из метаданных. Ограничение: при несуществующем имени возникает исключение, нужна защита

Перебор метаданных

Подходит для нечёткого поиска и проверки существования. Ограничение: больше кода, сравнение реализуется вручную

Таблица соответствий

Подходит для интеграций с фиксированным набором внешних строк. Ограничение: требует сопровождения при изменении перечисления

Как проверить результат и отладить поиск

Базовая проверка — сравнение с пустой ссылкой. Для перечислений корректно работают оба варианта: ЗначениеЗаполнено(Результат) и Результат = Перечисления.Имя.ПустаяСсылка(). Первый предпочтительнее, так как читается однозначно.

Для отладки удобно вывести все синонимы перечисления и сравнить их с входной строкой визуально:

Для Каждого ЗначениеМетаданных Из Метаданные.Перечисления.СтатусыЗаказов.ЗначенияПеречисления Цикл

Сообщить(ЗначениеМетаданных.Имя + " | " + ЗначениеМетаданных.Синоним);

КонецЦикла;

Если строка приходит из файла или веб-сервиса, проверьте её длину через СтрДлина() и сравните с длиной синонима — расхождение обычно указывает на неразрывные пробелы или символы-невидимки. Такие символы убирают комбинацией СокрЛП() и замены Символ(160) на обычный пробел.

Контрольные точки

Как проверить результат

Ссылка после поиска
Норма

ЗначениеЗаполнено() возвращает Истина

Тревожный признак

Пустая ссылка при заведомо существующем значении — проверьте синоним и пробелы

Совпадение строки с синонимом
Норма

СокрЛП(строка) посимвольно равна синониму из конфигуратора

Тревожный признак

Различия в ё/е, неразрывные пробелы, лишние символы

Уникальность синонимов
Норма

Каждый синоним встречается в перечислении один раз

Тревожный признак

Дубли синонимов — результат поиска непредсказуем

Ограничения и риски

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

Второй риск — запись пустой ссылки в реквизиты объектов. Если результат поиска не проверяется, документ сохранится с незаполненным перечислением, а ошибка проявится позже: при проведении, в отчётах или при обмене. Обязательно обрабатывайте случай пустой ссылки явно — сообщением пользователю, записью в журнал регистрации или установкой безопасного значения по умолчанию.

Частые вопросы о поиске перечислений в 1С 8

НайтиПоНаименованию возвращает пустую ссылку, хотя значение есть. Почему?

Чаще всего строка не совпадает с синонимом: лишние или неразрывные пробелы, различие «ё»/«е», или вы передаёте имя значения из конфигуратора вместо синонима. Сравните входную строку с синонимом в конфигураторе посимвольно и примените СокрЛП().

Метод чувствителен к регистру букв?

Нет, сравнение выполняется без учёта регистра. Но оно посимвольное: пробелы, знаки препинания и замена «ё» на «е» влияют на результат.

Как найти значение перечисления по имени, а не по синониму?

Используйте обращение через квадратные скобки: Перечисления.ИмяПеречисления[ИмяСтрокой]. Предварительно проверьте существование имени через Метаданные.Перечисления.Имя.ЗначенияПеречисления.Найти(), чтобы избежать исключения.

Что вернёт метод, если у двух значений одинаковый синоним?

Метод вернёт одно из значений — как правило, первое по порядку в метаданных. Полагаться на это нельзя: при дублях синонимов используйте поиск по имени или таблицу соответствий.

Можно ли искать по части наименования?

Нет, НайтиПоНаименованию ищет только полное совпадение. Для поиска по подстроке переберите значения через метаданные и сравнивайте синонимы функцией СтрНайти().

Насколько быстро работает этот метод в цикле?

Значения перечислений кэшируются платформой, поэтому метод работает быстро и подходит для пакетной загрузки. Узким местом обычно становится не поиск, а запись объектов в базу.

Итог

Что важно запомнить

Поиск значения перечисления по строке выполняется методом НайтиПоНаименованию, который сравнивает строку с синонимом значения без учёта регистра. Всегда очищайте входную строку, проверяйте результат на пустую ссылку и помните: для поиска по имени значения из метаданных надёжнее обращение через квадратные скобки с проверкой существования.