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

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

Функциональная опция в 1С: что это и как с ней работать

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

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

Механизм появился в платформе 8.2 и активно применяется в типовых решениях: «Управление торговлей», «Бухгалтерия предприятия», «ERP». Когда бухгалтер в настройках программы ставит флажок «Ведётся учёт по нескольким складам», на экране появляются новые поля, документы и отчёты — это и есть работа функциональной опции.

Для разработчика и администратора важно понимать три вещи: где хранится значение опции, какие объекты она скрывает и как проверить её состояние в коде. Ниже разобраны устройство механизма, пошаговое создание собственной опции, типовые сценарии и ошибки, из-за которых настройка «не срабатывает».

Что такое функциональная опция и как она устроена

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

У опции есть три ключевых компонента. Первый — хранилище: чаще всего константа типа «Булево», но источником может быть реквизит справочника (например, настройки по организации) или ресурс регистра сведений. Второй — состав: перечень объектов метаданных, реквизитов, табличных частей и команд, которыми опция управляет. Третий — значение по умолчанию, применяемое, пока хранилище не заполнено.

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

Где в типовых конфигурациях находятся эти настройки

В типовых решениях функциональные опции представлены пользователю как обычные флажки в разделе настроек. В «1С:Бухгалтерии» это «Администрирование — Настройки программы — Функциональность», где опции сгруппированы по закладкам: «Основные», «Торговля», «Зарплата и кадры». В «Управлении торговлей» аналогичный раздел — «НСИ и администрирование — Настройка разделов».

Каждый такой флажок на самом деле записывает константу, а константа является хранилищем функциональной опции. Поэтому фраза «включите функциональную опцию "Ордерный склад"» на практике означает «поставьте соответствующий флажок в настройках».

Флажок в настройкахКонстанта-хранилище

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

Пропали документыОпция выключена

Проверьте настройки функциональности — данные, скорее всего, не удалены

Поле видно не всемОпция или роли

Сравните настройки функциональности и права пользователей

Как создать функциональную опцию: пошагово

Создание собственной опции — стандартная задача при доработке конфигурации. Работа ведётся в конфигураторе и занимает несколько минут, если порядок действий понятен.

Порядок создания опции
  1. 1
    Создайте константу типа «Булево» — она будет хранилищем значения опции
  2. 2
    В ветке «Общие — Функциональные опции» добавьте новую опцию и задайте имя
  3. 3
    В свойстве «Хранилище» укажите созданную константу
  4. 4
    На закладке «Состав» отметьте объекты, реквизиты и команды, которыми опция управляет
  5. 5
    Добавьте константу на форму настроек, чтобы пользователь мог её менять
  6. 6
    Обновите конфигурацию базы данных и проверьте поведение при включённом и выключенном значении

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

Если значение опции должно различаться по организациям или складам, хранилищем делают реквизит справочника или ресурс регистра сведений с измерением. Тогда при вызове проверки передаётся параметр — какая именно организация интересует. Это стандартный приём для многофирменного учёта.

Как проверить опцию в коде

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

bsl
Если ПолучитьФункциональнуюОпцию("ВестиУчетПоСкладам") Тогда
	// логика складского учёта
КонецЕсли;

// С параметром (значение зависит от организации):
УчетПоДоговорам = ПолучитьФункциональнуюОпцию("ВестиУчетПоДоговорам",
	Новый Структура("Организация", ШапкаДокумента.Организация));

Функция ПолучитьФункциональнуюОпцию() возвращает значение опции с учётом хранилища и переданных параметров. На клиенте (в тонком и веб-клиенте) прямой вызов серверной функции недоступен — там используют кэшированные механизмы, например обращение к значениям, полученным при открытии формы через серверный вызов.

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

Функциональные опции, роли и расширения: что выбрать

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

Чем управлять доступностью

Функциональная опция

Включает возможность для всей базы или её части (организации). Не заменяет права доступа

Роли и права

Разграничивают доступ между пользователями. Не скрывают лишнюю функциональность для всей базы

Настройки формы/интерфейса

Персональные предпочтения пользователя. Не влияют на логику и других пользователей

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

Типичные ошибки и как их избежать

Типичные ошибки
01
Забыли добавить объект в состав опции — элемент виден всегда, независимо от флажка
02
Проверяют константу напрямую вместо ПолучитьФункциональнуюОпцию() — при смене хранилища код сломается
03
Выключили опцию и решили, что данные удалены — на самом деле они просто скрыты из интерфейса
04
Не добавили константу на форму настроек — пользователю негде переключить опцию
05
Используют опцию вместо ролей — пользователь без прав всё равно не получит доступ, а администратор с полными правами увидит лишнее

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

Ещё одна ловушка — опции, значения которых зависят от параметра (организации). Если в коде забыть передать параметр, функция вернёт значение «по умолчанию», и логика сработает неверно для части организаций. Всегда проверяйте сигнатуру вызова при многофирменном учёте.

Как проверить, что опция работает правильно

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

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

Включение опции
Норма

Связанные разделы, поля и команды появились в интерфейсе

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

Ничего не изменилось — проверьте состав опции и обновите интерфейс

Выключение опции
Норма

Объекты скрыты, но данные доступны через «Все функции» или запросы

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

Данные недоступны даже запросом — проблема не в опции, проверяйте права

Проверка в коде
Норма

ПолучитьФункциональнуюОпцию() возвращает актуальное значение

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

Возвращается устаревшее значение — сбросьте кэш повторно используемых значений

Быстрый способ увидеть скрытые опцией объекты — команда «Все функции» в толстом клиенте или отчёт по структуре метаданных. Если объект существует в конфигурации, но не виден в интерфейсе, первым делом проверьте функциональные опции и права — в большинстве случаев причина именно в них.

Итог

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

Функциональная опция — переключатель возможностей конфигурации, привязанный к константе или иному хранилищу. Она скрывает объекты из интерфейса, но не удаляет данные и не заменяет права доступа. В коде состояние проверяется через ПолучитьФункциональнуюОпцию(), а доработки безопаснее делать через расширение.

Частые вопросы

Чем функциональная опция отличается от константы?

Константа — просто хранилище одного значения. Функциональная опция использует константу (или другой источник) как хранилище, но дополнительно связывает значение с объектами конфигурации: платформа сама скрывает и показывает их в интерфейсе. Одна константа может быть хранилищем нескольких опций.

Куда делись документы после снятия флажка в настройках?

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

Можно ли сделать опцию разной для разных организаций?

Да. Хранилищем делается реквизит справочника «Организации» или ресурс регистра сведений с измерением «Организация». При проверке в коде параметр с организацией передаётся вторым аргументом функции ПолучитьФункциональнуюОпцию().

Почему после изменения опции интерфейс не обновился?

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

Можно ли добавить свою опцию, не снимая конфигурацию с поддержки?

Да, через расширение конфигурации: в нём создаются константа и функциональная опция, а затем связываются с объектами расширения. Типовая конфигурация при этом не изменяется и обновляется штатно.

Заменяет ли функциональная опция настройку прав доступа?

Нет. Опция определяет, нужна ли возможность в базе в принципе; роли определяют, кому из пользователей она доступна. Для корректной работы оба механизма настраиваются независимо и дополняют друг друга.