Разработка и Конфигурация · 12 мин
Чем отличается справочник от перечисления в 1С
Чем отличается справочник от перечисления в 1С: состав значений, где хранятся данные, как выбрать тип объекта при разработке конфигурации. Примеры и типичные ошибки.
Перечисление — это фиксированный список значений, который программист задаёт один раз на этапе разработки конфигурации, а пользователь изменить его не может. Справочник — это список, который наполняется и редактируется в режиме предприятия самими пользователями: они добавляют контрагентов, номенклатуру, склады и любые другие элементы без участия разработчика. Это главное и принципиальное различие, из которого вытекают все остальные.
На практике путаница возникает потому, что оба объекта выглядят как «список значений» и оба используются для заполнения реквизитов документов. Однако под капотом это разные механизмы: значения перечисления хранятся в метаданных конфигурации, а элементы справочника — в таблицах базы данных. Отсюда различия в скорости обновления, возможностях доработки, поведении при обмене данными и требованиях к архитектуре.
Неправильный выбор между этими объектами — одна из самых дорогих ошибок проектирования в 1С. Если сделать перечислением то, что должно расширяться пользователями, каждое добавление значения потребует обновления конфигурации. Если же сделать справочником то, что должно быть жёстко зафиксировано, пользователи получат возможность «сломать» логику программы, добавив лишний элемент.
Что такое перечисление и как оно устроено
Перечисление — объект метаданных, значения которого задаются в конфигураторе на вкладке «Значения» и навсегда «зашиваются» в структуру конфигурации. Классические примеры: «ВидОперации» (поступление, реализация, возврат), «Пол» (мужской, женский), «СтавкаНДС» в некоторых типовых решениях. Пользователь, работающий в режиме предприятия, видит эти значения в выпадающем списке, но не может ни добавить новое, ни переименовать существующее.
Технически значение перечисления хранится как ссылка на предопределённое значение метаданных. В запросах и коде к нему обращаются напрямую: Перечисления.ВидыОпераций.Поступление. Это даёт важное преимущество — значение гарантированно существует, и разработчик может безопасно писать логику вида «если вид операции равен Возврату, то...», не опасаясь, что кто-то удалит или переименует это значение.
Ограничение перечисления — отсутствие дополнительных реквизитов. У значения перечисления есть только имя и синоним, нельзя добавить к нему, например, комментарий, коэффициент или ссылку на другой объект. Перечисление — это чистый «ярлык», а не хранилище данных.
Что такое справочник и как он устроен
Справочник — объект метаданных, предназначенный для хранения списков однотипных элементов, которые создаются и изменяются в режиме предприятия. Номенклатура, контрагенты, сотрудники, склады, валюты — всё это справочники. Разработчик определяет только структуру: какие у элемента будут реквизиты, какой длины код и наименование, есть ли иерархия и подчинённые справочники.
Ключевое отличие в возможностях: у элемента справочника может быть сколько угодно дополнительных реквизитов (ИНН контрагента, адрес, ставка налога, единица измерения) и табличных частей (например, список договоров контрагента). Справочник — полноценное хранилище данных, а не просто список ярлыков.
Справочники поддерживают иерархию (группы и элементы), подчинённость одного справочника другому, предопределённые элементы и историю изменений через механизмы версионирования. Пользователь с соответствующими правами может добавлять, редактировать, помечать на удаление элементы прямо в рабочей базе без обновления конфигурации.
Сравнение по ключевым параметрам
| Параметр | Перечисление | Справочник |
|---|---|---|
| Кто задаёт значения | Разработчик в конфигураторе | Пользователь в режиме предприятия |
| Изменение списка значений | Только через обновление конфигурации | В любой момент, без обновления |
| Дополнительные реквизиты | Нет (только имя и синоним) | Да, произвольные реквизиты и табличные части |
| Иерархия | Нет | Да, группы и элементы |
| Обращение в коде | Напрямую, значение гарантировано | По ссылке, нужен поиск или предопределённый элемент |
| Обмен данными | Значения идентичны во всех базах | Требуется сопоставление по уникальному идентификатору |
| Типичные примеры | Виды операций, статусы, пол, периодичность | Контрагенты, номенклатура, склады, сотрудники |
Особое внимание стоит обратить на строку про обращение в коде. Значение перечисления существует всегда — компилятор проверит его наличие ещё при сохранении модуля. Элемент справочника может быть удалён или переименован пользователем, поэтому код, завязанный на конкретный элемент, требует защиты: поиска по имени, использования предопределённых элементов или проверки на пустую ссылку.
Как выбрать: перечисление или справочник
Правило выбора формулируется одним вопросом: должен ли пользователь иметь возможность добавлять новые значения без участия разработчика? Если да — нужен справочник. Если список закрыт, определяет логику программы и меняется только вместе с доработкой конфигурации — нужно перечисление.
Второй критерий — наличие дополнительных данных. Если к каждому значению нужно хранить хотя бы один дополнительный атрибут (коэффициент, комментарий, ссылку), перечисление не подойдёт в принципе: у него нет реквизитов. Третий критерий — объём списка. Перечисления рассчитаны на десятки значений; если потенциальных значений сотни и тысячи, однозначно нужен справочник.
Как выбрать действие
Предопределённые элементы: гибридный вариант
Между двумя крайностями есть промежуточное решение — предопределённые элементы справочника. Разработчик создаёт в конфигураторе элементы, которые автоматически появляются в базе при обновлении, и может обращаться к ним в коде так же надёжно, как к значениям перечисления: Справочники.СтавкиНДС.НДС20. При этом пользователи могут дополнять справочник своими элементами.
Этот механизм используется, когда часть значений системная и участвует в алгоритмах, а часть — пользовательская. Например, справочник «Виды контактной информации» в типовых конфигурациях содержит предопределённые элементы (адрес, телефон, email), но администратор может добавить свои виды. Важное ограничение: предопределённый элемент пользователь может переименовать, но не может удалить, если на него есть ссылки; при этом имя в метаданных и наименование в базе — разные вещи, и код опирается именно на имя.
Что делать, если тип объекта выбран неправильно
Ситуация «сделали перечислением, а список растёт» встречается часто. Признаки: пользователи просят добавить очередное значение, и каждый раз приходится обновлять конфигурацию на всех рабочих местах. Решение — создать справочник, перенести в него значения и заменить тип реквизитов во всех объектах, где использовалось перечисление. Это доработка средней сложности: потребуется написать обработку конвертации данных и проверить все места в коде, где идёт сравнение со значениями перечисления.
Обратная ситуация — справочник, который по смыслу должен быть перечислением. Признаки: пользователи добавляют дубли элементов, переименовывают системные значения, и логика отчётов «разваливается». Решение зависит от объёма накопленных данных: если ссылок на элементы много, безопаснее оставить справочник, но ограничить права на добавление и сделать ключевые элементы предопределёнными.
Типичные ошибки при работе с обоими объектами
Самая распространённая ошибка — поиск элемента справочника по наименованию в коде. Наименование пользователь может изменить в любой момент, и код перестанет находить нужный элемент. Правильные варианты: предопределённые элементы, поиск по дополнительному реквизиту-коду или хранение ссылки в константе с настройкой через интерфейс.
Вторая ошибка — использование перечисления там, где бизнес-практика меняется. Например, список причин отказа клиента: сегодня их пять, через полгода маркетинг попросит десятую. Каждое добавление — релиз конфигурации. Третья ошибка — создание справочника без продумывания прав: если добавлять элементы могут все пользователи, справочник быстро заполняется дублями («ООО Ромашка», «Ромашка ООО», «ООО \"Ромашка\"»).
Проверка результата после доработки
После изменения типа объекта или добавления новых значений нужно убедиться, что система работает корректно. Минимальный набор проверок: открыть несколько старых документов и убедиться, что реквизиты заполнены; провести новый документ; сформировать отчёты, где используется изменённый объект; прогнать тестирование и исправление информационной базы в режиме проверки ссылочной целостности.
Как проверить результат
Реквизиты заполнены, значения соответствуют исходным
Пустые реквизиты или значения сброшены — конвертация не выполнена
Сравнение идёт с предопределёнными элементами или значениями перечисления
Сравнение строкой с наименованием элемента справочника
Добавление элементов доступно ограниченному кругу лиц
Любой пользователь может создавать и удалять элементы
Элементы сопоставляются по уникальному идентификатору
После обмена появляются дубли элементов
FAQ: частые вопросы о справочниках и перечислениях
Можно ли добавить значение перечисления без конфигуратора?
Нет. Значения перечисления — часть метаданных, они изменяются только в конфигураторе с последующим обновлением конфигурации базы данных. Если нужна возможность добавлять значения пользователем, объект должен быть справочником.
Что быстрее работает — перечисление или справочник?
Разница в производительности в типовых сценариях незначительна и не должна быть критерием выбора. Значение перечисления не требует обращения к таблице данных, но современные СУБД и кэширование 1С нивелируют это преимущество. Выбирайте по смыслу, а не по скорости.
Как защитить элемент справочника от удаления пользователями?
Используйте предопределённые элементы — их нельзя удалить, пока на них есть ссылки, и они доступны в коде по имени метаданных. Дополнительно настройте права: уберите у обычных пользователей право интерактивного удаления и добавления.
Почему в типовых конфигурациях ставки НДС — справочник, а не перечисление?
Потому что налоговое законодательство меняется: появляются новые ставки и льготные категории. Справочник позволяет добавить новую ставку обновлением данных или вручную, без доработки конфигурации. Это классический пример выбора справочника для потенциально расширяемого списка.
Можно ли преобразовать перечисление в справочник без потери данных?
Да, но только через доработку: создаётся новый справочник, обработкой переносятся значения в элементы, затем меняется тип реквизитов и выполняется конвертация значений в существующих документах. Работа выполняется на копии базы с последующей проверкой ссылочной целостности.
Что важно запомнить
Перечисление — закрытый список значений, заданный разработчиком и защищённый от изменений пользователем; подходит для системных наборов, определяющих логику программы. Справочник — открытый список с произвольными реквизитами, наполняемый пользователями; подходит для данных, которые растут и меняются. Предопределённые элементы справочника сочетают надёжность перечисления с гибкостью справочника. Ошибка в выборе типа исправляется, но требует конвертации данных и обязательной работы на копии базы.