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

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

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

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

Задача «найти перечисление по имени» в 1С возникает в двух разных ситуациях. Первая — разработчик или администратор ищет объект метаданных в конфигураторе: например, нужно понять, где описано перечисление «СтавкиНДС» или как называется объект, хранящий виды операций. Вторая — в коде на встроенном языке требуется получить конкретное значение перечисления по строковому имени, когда имя приходит из файла обмена, внешней системы или пользовательских настроек.

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

Поиск перечисления в конфигураторе

Самый быстрый способ найти объект перечисления в дереве конфигурации — глобальный поиск. Нажмите Ctrl+Shift+F, введите имя или часть имени перечисления и в настройках поиска ограничьте область веткой «Перечисления» или оставьте поиск по всей конфигурации. Результат покажет как сам объект метаданных, так и все модули, где встречается это имя.

Если поиск по всей конфигурации занимает много времени, используйте окно «Все функции» (Главное меню → Сервис → Все функции, либо Ctrl+Shift+A в режиме предприятия при включённой отладке). Раскройте ветку «Перечисления» — все объекты отсортированы по имени, и нужное находится прокруткой или вводом первых букв. Двойной клик откроет список значений перечисления.

Третий вариант — встроенный поиск в дереве конфигурации: установите курсор в дерево объектов и начните вводить имя. Платформа позиционируется на первый подходящий узел. Это удобно, когда примерное имя известно, а точное написание — нет.

Порядок поиска в конфигураторе
  1. 1
    Откройте конфигуратор и разверните дерево конфигурации
  2. 2
    Нажмите Ctrl+Shift+F и введите имя или часть имени перечисления
  3. 3
    При необходимости ограничьте область поиска веткой «Перечисления»
  4. 4
    Откройте найденный объект двойным кликом и проверьте список значений
  5. 5
    Для быстрого просмотра значений используйте «Все функции» → «Перечисления»

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

Имя перечисления для программного обращения — это не синоним, который видит пользователь, а идентификатор, заданный в свойствах объекта метаданных. Откройте перечисление в конфигураторе и посмотрите поле «Имя»: именно оно используется в конструкции Перечисления.ИмяПеречисления. Синоним может отличаться и содержать пробелы, русские слова с регистром — обращаться по синониму нельзя.

Точно так же имена значений перечисления берутся из поля «Имя» каждого значения, а не из колонки «Синоним». Например, значение с синонимом «Без НДС» может иметь имя «БезНДС». Ошибка в одном символе приведёт к исключению при обращении.

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

Получение значения перечисления по имени в коде

Когда имя значения известно заранее, используется прямое обращение: Перечисления.СтавкиНДС.НДС20. Но если имя приходит в виде строки — из файла обмена, HTTP-запроса или настройки — нужен индексированный доступ через квадратные скобки:

ЗначениеСтавки = Перечисления.СтавкиНДС[ИмяЗначенияСтрокой];

Если имя самого перечисления тоже строковое, сначала получают менеджер перечисления через Перечисления[ИмяПеречисления], а затем значение — через индексированное обращение к менеджеру:

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

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

Оба варианта вызовут исключение «Недопустимое значение», если строка не совпадает ни с одним именем. Поэтому в обменных механизмах всегда предваряют обращение проверкой существования — об этом следующий раздел.

bsl
Менеджер = Перечисления[ИмяПеречисления];
Значение = Менеджер[ИмяЗначения]; // исключение, если имени нет

Безопасный поиск значения: проверка существования

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

МетаЗначение = Метаданные.Перечисления[ИмяПеречисления]

.ЗначенияПеречисления.Найти(ИмяЗначения);

Если МетаЗначение = Неопределено Тогда

// значения с таким именем нет — обрабатываем ситуацию

Иначе

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

КонецЕсли;

Аналогично проверяется существование самого перечисления: Метаданные.Перечисления.Найти(ИмяПеречисления) вернёт Неопределено, если объекта нет в конфигурации. Это важно в универсальных обработках, которые должны работать с разными конфигурациями, где состав перечислений отличается.

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

Маршрут решения

Как выбрать способ

Имя значения известно на этапе разработкиИспользуйте прямое обращение Перечисления.Имя.Значение — это быстрее и контролируется синтакс-проверкой
Имя приходит строкой из обмена или настроекПроверьте через Метаданные...ЗначенияПеречисления.Найти(), затем обращайтесь по индексу
Нужно найти сам объект перечисления в конфигурацииИспользуйте глобальный поиск Ctrl+Shift+F или Метаданные.Перечисления.Найти() в коде

Обратная задача: получить имя по значению перечисления

Часто требуется обратное действие — по ссылке на значение перечисления узнать его строковое имя, например для выгрузки в XML или JSON. Для этого используется функция XMLСтрока(): она возвращает имя значения перечисления как строку. Обратное преобразование выполняет XMLЗначение(Тип, Строка), где тип получают через Тип("ПеречислениеСсылка.Имя").

Второй способ — через метаданные: у значения перечисления нет прямого свойства «Имя», поэтому находят индекс значения через Перечисления.Имя.Индекс(Значение) и по индексу берут объект из Метаданные.Перечисления.Имя.ЗначенияПеречисления, у которого читают свойство Имя.

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

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

Проверка результата и ограничения

После получения значения по строке проверьте, что оно не пустое: сравнение с Перечисления.Имя.ПустаяСсылка() покажет, удалось ли реально подобрать значение. В отладчике (F5, точка останова) значение перечисления отображается вместе с именем — это быстрый способ убедиться, что подобрано именно то, что ожидалось.

Учтите ограничение: перечисления — это предопределённые на уровне конфигурации списки, их нельзя пополнять из пользовательского режима. Если поиск по имени часто не находит значение из-за того, что данные приходят «со стороны», возможно, вместо перечисления нужен справочник — он допускает добавление элементов пользователем.

Ещё одна граница: метод Найти() у коллекции значений перечисления ищет строго по имени. Частичное совпадение и поиск по синониму придётся реализовывать перебором коллекции в цикле со сравнением строк.

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

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

Значение после подбора по строке
Норма

Не равно пустой ссылке, в отладчике видно ожидаемое имя

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

Пустая ссылка или исключение «Недопустимое значение»

Существование перечисления
Норма

Метаданные.Перечисления.Найти() вернул объект

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

Возвращено Неопределено — имя объекта неверно

Имя в свойствах конфигуратора
Норма

Поле «Имя» совпадает со строкой в коде посимвольно

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

В коде использован синоним или есть опечатка

Частые вопросы

Можно ли найти перечисление по синониму, а не по имени?

Штатного метода поиска по синониму нет. Нужно перебрать коллекцию Метаданные.Перечисления в цикле и сравнить свойство «Синоним» каждого объекта с искомой строкой. Для значений перечисления — аналогичный перебор коллекции ЗначенияПеречисления.

Почему обращение Перечисления.Имя[Строка] вызывает ошибку?

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

Как получить список всех значений перечисления в коде?

Переберите коллекцию Метаданные.Перечисления[Имя].ЗначенияПеречисления — у каждого элемента есть свойства Имя и Синоним. Значение-ссылку получают по имени через Перечисления[Имя][Элемент.Имя].

Работает ли поиск по имени в тонком клиенте и на сервере?

Да, обращение к менеджеру перечислений и к объекту Метаданные доступно на сервере, толстом и тонком клиенте. Ограничение касается только внешнего соединения и веб-клиента в отдельных старых сценариях — там проверяйте доступность в конкретной версии платформы.

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

Значения перечисления фиксированы в конфигурации и ищутся по имени через метаданные. Элементы справочника хранятся в базе данных и ищутся методом НайтиПоНаименованию() или запросом — это данные, а не метаданные.

Как найти, где в коде используется конкретное перечисление?

В конфигураторе выделите объект перечисления, откройте контекстное меню и выберите «Поиск ссылок на объект» — платформа покажет все модули и объекты, где встречается обращение к этому перечислению.

Итог

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

В конфигураторе перечисление ищут через Ctrl+Shift+F или «Все функции», обращение в коде идёт строго по имени, а не по синониму. При получении значения по строке всегда проверяйте существование через Метаданные...ЗначенияПеречисления.Найти(), чтобы избежать исключений при обмене данными.