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