Разработка и Конфигурация · 11 мин
Как найти перечисление по наименованию в 1С 8
Как найти значение перечисления по наименованию в 1С 8: метод НайтиПоНаименованию, поиск по синониму, примеры кода, типичные ошибки и способы проверки результата.
Перечисления в 1С 8 — это предопределённые наборы значений, заданные в конфигураторе: статусы документов, виды операций, варианты ставок НДС. В коде чаще всего к значению обращаются напрямую через точку, но в ряде задач — обмен данными, загрузка из файлов, интеграция с внешними системами — известно только строковое наименование значения. Тогда возникает задача: по строке найти ссылку на конкретное значение перечисления.
Для этого у менеджера перечисления есть встроенный метод НайтиПоНаименованию(). Он сравнивает переданную строку с наименованиями (синонимами) значений перечисления и возвращает либо ссылку на найденное значение, либо пустую ссылку. Метод прост, но у него есть нюансы: чувствительность к регистру, поведение при дублях, отличие наименования от имени значения в метаданных.
Ниже разобраны синтаксис метода, рабочие примеры кода, альтернативные способы поиска и типичные ошибки, из-за которых поиск возвращает пустую ссылку даже при «правильной» строке.
Что такое наименование значения перечисления и чем оно отличается от имени
У каждого значения перечисления в конфигураторе есть два ключевых свойства: имя — идентификатор, по которому значение доступно в коде (например, НаличныйРасчет), и синоним — представление, которое видит пользователь (например, «Наличный расчёт»). Метод НайтиПоНаименованию() работает именно с синонимом, а не с именем.
Это принципиальный момент. Если внешняя система передаёт строку «НаличныйРасчет» (имя из метаданных), а синоним задан как «Наличный расчёт», поиск по наименованию вернёт пустую ссылку. Поэтому перед выбором способа поиска нужно понять, что именно содержится во входной строке: пользовательское представление или программный идентификатор.
Проверить синонимы значений можно в конфигураторе: откройте ветку «Перечисления», выберите нужное перечисление и посмотрите колонки «Имя» и «Синоним» на закладке «Данные». Если синонимы не заполнялись вручную, платформа формирует их автоматически из имён, разбивая по заглавным буквам.
Синтаксис метода НайтиПоНаименованию
Метод вызывается через менеджер конкретного перечисления и принимает один обязательный параметр — строку для поиска:
Результат = Перечисления.ВидыОпераций.НайтиПоНаименованию("Поступление товаров");
Возвращаемое значение — ссылка на значение перечисления. Если совпадение найдено, это заполненная ссылка; если нет — пустая ссылка данного перечисления. Проверка результата выполняется через ЗначениеЗаполнено() или сравнением с пустой ссылкой:
НайденноеЗначение = Перечисления.ВидыОпераций.НайтиПоНаименованию(СтрокаИзФайла);
Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда
Сообщить("Значение перечисления не найдено: " + СтрокаИзФайла);
КонецЕсли;
Поиск выполняется без обращения к базе данных в классическом смысле: значения перечисления кэшируются, поэтому метод работает быстро и его можно вызывать в цикле при пакетной загрузке данных без опасений за производительность.
- 1Откройте конфигуратор и уточните синонимы значений нужного перечисления
- 2Определите, что содержит входная строка: синоним или имя значения
- 3Вызовите Перечисления.ИмяПеречисления.НайтиПоНаименованию(Строка)
- 4Проверьте результат через ЗначениеЗаполнено()
- 5Обработайте случай пустой ссылки: сообщение, журнал или значение по умолчанию
Практические примеры использования
Поиск при загрузке данных из файла
Типовой сценарий — загрузка из Excel или CSV, где колонка содержит строковое представление статуса. Перед поиском строку стоит очистить от лишних пробелов, потому что «Статус » с пробелом на конце не совпадёт с синонимом:
СтрокаСтатуса = СокрЛП(ДанныеСтроки.Статус);
СтатусДокумента = Перечисления.СтатусыЗаказов.НайтиПоНаименованию(СтрокаСтатуса);
Если Не ЗначениеЗаполнено(СтатусДокумента) Тогда
СтатусДокумента = Перечисления.СтатусыЗаказов.Новый; // значение по умолчанию
КонецЕсли;
Поиск по имени значения из метаданных
Если внешняя система передаёт именно имя значения (как в конфигураторе), надёжнее не НайтиПоНаименованию(), а обращение через коллекцию метаданных или попытка прямого обращения:
МенеджерПеречисления = Перечисления.СпособыДоставки;
Если Метаданные.Перечисления.СпособыДоставки.ЗначенияПеречисления.Найти(ИмяЗначения) <> Неопределено Тогда
Значение = МенеджерПеречисления[ИмяЗначения];
Иначе
Значение = МенеджерПеречисления.ПустаяСсылка();
КонецЕсли;
Такой подход устойчив к переименованию синонимов: если прикладной специалист поменяет представление значения для пользователей, код продолжит работать.
Особенности поведения метода
Метод выполняет сравнение без учёта регистра: строки «поступление товаров» и «Поступление товаров» будут найдены одинаково. Однако лишние пробелы, неразрывные пробелы из выгрузок и различия в букве «ё»/«е» влияют на результат — сравнение идёт посимвольно по очищенной строке.
Если у двух значений перечисления совпадают синонимы (конфигуратор это допускает, хотя и предупреждает), метод вернёт первое найденное значение. Какое именно — зависит от порядка значений в метаданных, поэтому полагаться на такой поиск при дублях синонимов нельзя.
Ещё одна особенность: метод не ищет по частичному совпадению. Строка «Поступление» не найдёт значение с синонимом «Поступление товаров и услуг». Для нечёткого поиска придётся перебирать значения вручную и сравнивать представления через СтрНайти().
Альтернативные способы получения значения перечисления
Когда строка содержит имя значения, а не синоним, или нужен более контролируемый поиск, используют другие подходы:
- Прямое обращение —
Перечисления.ВидОперации.ИмяЗначения. Самый быстрый и надёжный способ, но требует, чтобы имя было известно на этапе разработки. - Обращение по строковому имени через квадратные скобки —
Перечисления.ВидОперации[ИмяСтрокой]. Удобно, когда имя приходит извне; при несуществующем имени вызывает исключение, поэтому оборачивают вПопытка...Исключениеили предварительно проверяют через метаданные. - Перебор значений — цикл по
Метаданные.Перечисления.Имя.ЗначенияПеречислениясо сравнением синонима или имени. Подходит для нечёткого поиска и построения таблиц соответствий. - Предопределённая таблица соответствий — соответствие «строка из внешней системы → значение перечисления», заполненное в коде. Лучший вариант для интеграций, где строки внешней системы не совпадают ни с синонимами, ни с именами.
Сравнение вариантов
Подходит, когда строка совпадает с синонимом значения. Ограничение: дубли синонимов и лишние пробелы дают непредсказуемый или пустой результат
Подходит, когда известно имя значения из метаданных. Ограничение: при несуществующем имени возникает исключение, нужна защита
Подходит для нечёткого поиска и проверки существования. Ограничение: больше кода, сравнение реализуется вручную
Подходит для интеграций с фиксированным набором внешних строк. Ограничение: требует сопровождения при изменении перечисления
Как проверить результат и отладить поиск
Базовая проверка — сравнение с пустой ссылкой. Для перечислений корректно работают оба варианта: ЗначениеЗаполнено(Результат) и Результат = Перечисления.Имя.ПустаяСсылка(). Первый предпочтительнее, так как читается однозначно.
Для отладки удобно вывести все синонимы перечисления и сравнить их с входной строкой визуально:
Для Каждого ЗначениеМетаданных Из Метаданные.Перечисления.СтатусыЗаказов.ЗначенияПеречисления Цикл
Сообщить(ЗначениеМетаданных.Имя + " | " + ЗначениеМетаданных.Синоним);
КонецЦикла;
Если строка приходит из файла или веб-сервиса, проверьте её длину через СтрДлина() и сравните с длиной синонима — расхождение обычно указывает на неразрывные пробелы или символы-невидимки. Такие символы убирают комбинацией СокрЛП() и замены Символ(160) на обычный пробел.
Как проверить результат
ЗначениеЗаполнено() возвращает Истина
Пустая ссылка при заведомо существующем значении — проверьте синоним и пробелы
СокрЛП(строка) посимвольно равна синониму из конфигуратора
Различия в ё/е, неразрывные пробелы, лишние символы
Каждый синоним встречается в перечислении один раз
Дубли синонимов — результат поиска непредсказуем
Ограничения и риски
Главный риск поиска по наименованию — зависимость кода от пользовательских представлений. Синонимы могут меняться при доработке конфигурации или обновлении типового решения, и тогда загрузка данных молча перестанет находить значения. Поэтому в интеграциях, критичных к стабильности, лучше опираться на имена значений или собственные таблицы соответствий.
Второй риск — запись пустой ссылки в реквизиты объектов. Если результат поиска не проверяется, документ сохранится с незаполненным перечислением, а ошибка проявится позже: при проведении, в отчётах или при обмене. Обязательно обрабатывайте случай пустой ссылки явно — сообщением пользователю, записью в журнал регистрации или установкой безопасного значения по умолчанию.
Частые вопросы о поиске перечислений в 1С 8
НайтиПоНаименованию возвращает пустую ссылку, хотя значение есть. Почему?
Чаще всего строка не совпадает с синонимом: лишние или неразрывные пробелы, различие «ё»/«е», или вы передаёте имя значения из конфигуратора вместо синонима. Сравните входную строку с синонимом в конфигураторе посимвольно и примените СокрЛП().
Метод чувствителен к регистру букв?
Нет, сравнение выполняется без учёта регистра. Но оно посимвольное: пробелы, знаки препинания и замена «ё» на «е» влияют на результат.
Как найти значение перечисления по имени, а не по синониму?
Используйте обращение через квадратные скобки: Перечисления.ИмяПеречисления[ИмяСтрокой]. Предварительно проверьте существование имени через Метаданные.Перечисления.Имя.ЗначенияПеречисления.Найти(), чтобы избежать исключения.
Что вернёт метод, если у двух значений одинаковый синоним?
Метод вернёт одно из значений — как правило, первое по порядку в метаданных. Полагаться на это нельзя: при дублях синонимов используйте поиск по имени или таблицу соответствий.
Можно ли искать по части наименования?
Нет, НайтиПоНаименованию ищет только полное совпадение. Для поиска по подстроке переберите значения через метаданные и сравнивайте синонимы функцией СтрНайти().
Насколько быстро работает этот метод в цикле?
Значения перечислений кэшируются платформой, поэтому метод работает быстро и подходит для пакетной загрузки. Узким местом обычно становится не поиск, а запись объектов в базу.
Что важно запомнить
Поиск значения перечисления по строке выполняется методом НайтиПоНаименованию, который сравнивает строку с синонимом значения без учёта регистра. Всегда очищайте входную строку, проверяйте результат на пустую ссылку и помните: для поиска по имени значения из метаданных надёжнее обращение через квадратные скобки с проверкой существования.