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

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

Как работать с функциональными опциями в 1С

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

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

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

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

Что такое функциональная опция и когда её применять

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

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

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

Как создать функциональную опцию и выбрать хранилище значения

Создание выполняется в конфигураторе. Откройте ветку «Общие → Функциональные опции», добавьте новый объект и задайте имя, например ВестиУчетПоСкладам. Далее нужно определить два ключевых свойства: тип значения и хранение.

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

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

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

Как связать объекты конфигурации с опцией

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

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

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

Как проверить значение опции в коде

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

Типичный сценарий — условная логика в модуле объекта или формы:

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

// заполняем склад, проверяем остатки

Иначе

// упрощённый сценарий без складского учёта

КонецЕсли;

Если значение опции хранится по измерениям (например, в регистре сведений с измерением «Организация»), при вызове передаётся структура параметров: ПолучитьФункциональнуюОпцию("ВестиУчетПоСкладам", Новый Структура("Организация", ТекущаяОрганизация)). Имена ключей структуры должны совпадать с именами объектов-параметров, заданными в свойстве «Параметры» опции.

Функциональные опции в запросах и СКД

В запросах значение опции обычно получают заранее и передают как параметр, а затем используют в условии или в конструкции ВЫБОР КОГДА. Например, если складской учёт отключён, запрос по остаткам можно не выполнять вовсе — это дешевле, чем фильтровать результат.

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

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

Где проверять опцию

В коде до запроса

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

В СКД через связь полей

Подходит для отчётов: поля автоматически исключаются из запроса. Ограничение — работает только внутри схемы компоновки

Параметром в запрос

Универсальный вариант для условий ГДЕ и ВЫБОР КОГДА. Запрос выполняется всегда, даже когда ветка не нужна

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

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

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

Типичные ошибки
01
Связать с опцией только команду интерфейса, но не добавить проверку в код — данные записываются даже при выключенной опции
02
Использовать опцию вместо ролей для разграничения прав — пользователи получают либо лишний доступ, либо теряют нужный
03
Изменить тип значения опции после внедрения — старые проверки в коде начинают вести себя неожиданно
04
Читать опцию в цикле по строкам документа — резкое падение производительности в клиент-серверном режиме
05
Забыть, что отключение опции не удаляет данные: скрытые документы остаются в базе и участвуют в итогах регистров

Проверка результата и ограничения механизма

После настройки опции проверьте её в двух состояниях. Установите константу в «Истина», перезапустите сеанс (или обновите интерфейс) и убедитесь, что объекты видны и работают. Затем установите «Ложь» и проверьте: объекты исчезли из панели разделов и командного интерфейса, стандартные команды создания недоступны, отчёты не показывают связанные поля.

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

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

Видимость объекта при включённой опции
Норма

Объект есть в командном интерфейсе и открывается

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

Объекта нет — проверьте состав опции, подсистемы и права

Поведение при выключенной опции
Норма

Объект скрыт из интерфейса, отчёты без лишних полей

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

Объект доступен — значит, он не связан с опцией или есть обходной путь в коде

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

Код корректно пропускает ветку логики

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

Проводки формируются по отключённой функциональности — нет проверки в модуле

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

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

Итог

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

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

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

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

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

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

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

Почему объект не скрылся после отключения опции?

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

Удалятся ли данные, если выключить функциональную опцию?

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

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

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

Как проверить опцию в запросе динамического списка?

Получите значение опции в коде формы и передайте его как параметр запроса динамического списка, затем используйте параметр в условии. Читать опцию прямо в тексте запроса нельзя — язык запросов не имеет такой функции, в отличие от выражений СКД.