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