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