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