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

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

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

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

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

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

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

Что такое перечисление и как оно устроено

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

Технически значение перечисления хранится как ссылка на предопределённое значение метаданных. В запросах и коде к нему обращаются напрямую: Перечисления.ВидыОпераций.Поступление. Это даёт важное преимущество — значение гарантированно существует, и разработчик может безопасно писать логику вида «если вид операции равен Возврату, то...», не опасаясь, что кто-то удалит или переименует это значение.

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

Что такое справочник и как он устроен

Справочник — объект метаданных, предназначенный для хранения списков однотипных элементов, которые создаются и изменяются в режиме предприятия. Номенклатура, контрагенты, сотрудники, склады, валюты — всё это справочники. Разработчик определяет только структуру: какие у элемента будут реквизиты, какой длины код и наименование, есть ли иерархия и подчинённые справочники.

Ключевое отличие в возможностях: у элемента справочника может быть сколько угодно дополнительных реквизитов (ИНН контрагента, адрес, ставка налога, единица измерения) и табличных частей (например, список договоров контрагента). Справочник — полноценное хранилище данных, а не просто список ярлыков.

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

Сравнение по ключевым параметрам

ПараметрПеречислениеСправочник
Кто задаёт значенияРазработчик в конфигуратореПользователь в режиме предприятия
Изменение списка значенийТолько через обновление конфигурацииВ любой момент, без обновления
Дополнительные реквизитыНет (только имя и синоним)Да, произвольные реквизиты и табличные части
ИерархияНетДа, группы и элементы
Обращение в кодеНапрямую, значение гарантированоПо ссылке, нужен поиск или предопределённый элемент
Обмен даннымиЗначения идентичны во всех базахТребуется сопоставление по уникальному идентификатору
Типичные примерыВиды операций, статусы, пол, периодичностьКонтрагенты, номенклатура, склады, сотрудники

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

Как выбрать: перечисление или справочник

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

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

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

Как выбрать действие

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

Предопределённые элементы: гибридный вариант

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

Этот механизм используется, когда часть значений системная и участвует в алгоритмах, а часть — пользовательская. Например, справочник «Виды контактной информации» в типовых конфигурациях содержит предопределённые элементы (адрес, телефон, email), но администратор может добавить свои виды. Важное ограничение: предопределённый элемент пользователь может переименовать, но не может удалить, если на него есть ссылки; при этом имя в метаданных и наименование в базе — разные вещи, и код опирается именно на имя.

Что делать, если тип объекта выбран неправильно

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

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

Типичные ошибки при работе с обоими объектами

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

Вторая ошибка — использование перечисления там, где бизнес-практика меняется. Например, список причин отказа клиента: сегодня их пять, через полгода маркетинг попросит десятую. Каждое добавление — релиз конфигурации. Третья ошибка — создание справочника без продумывания прав: если добавлять элементы могут все пользователи, справочник быстро заполняется дублями («ООО Ромашка», «Ромашка ООО», «ООО \"Ромашка\"»).

Типичные ошибки
01
Поиск элемента справочника по наименованию в коде — пользователь переименует элемент, и алгоритм сломается; используйте предопределённые элементы или поиск по коду
02
Перечисление для списка, который расширяется бизнесом — каждое новое значение требует обновления конфигурации на всех рабочих местах
03
Свободное добавление элементов в справочник без контроля дублей — база засоряется повторяющимися значениями, отчёты искажаются
04
Удаление реквизита со старым типом до переноса данных — значения в документах теряются безвозвратно

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

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

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

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

Старые документы после замены типа реквизита
Норма

Реквизиты заполнены, значения соответствуют исходным

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

Пустые реквизиты или значения сброшены — конвертация не выполнена

Код, сравнивающий значения
Норма

Сравнение идёт с предопределёнными элементами или значениями перечисления

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

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

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

Добавление элементов доступно ограниченному кругу лиц

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

Любой пользователь может создавать и удалять элементы

Обмен данными между базами
Норма

Элементы сопоставляются по уникальному идентификатору

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

После обмена появляются дубли элементов

FAQ: частые вопросы о справочниках и перечислениях

Можно ли добавить значение перечисления без конфигуратора?

Нет. Значения перечисления — часть метаданных, они изменяются только в конфигураторе с последующим обновлением конфигурации базы данных. Если нужна возможность добавлять значения пользователем, объект должен быть справочником.

Что быстрее работает — перечисление или справочник?

Разница в производительности в типовых сценариях незначительна и не должна быть критерием выбора. Значение перечисления не требует обращения к таблице данных, но современные СУБД и кэширование 1С нивелируют это преимущество. Выбирайте по смыслу, а не по скорости.

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

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

Почему в типовых конфигурациях ставки НДС — справочник, а не перечисление?

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

Можно ли преобразовать перечисление в справочник без потери данных?

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

Итог

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

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