Функциональные опции: как включать и скрывать функции 1С без правки конфигурации

· 9 мин

Содержание

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

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

Ниже — как устроен механизм, где создаётся опция в конфигураторе, как её читать из кода, чем она отличается от прав доступа и какие ошибки встречаются чаще всего.

Как механизм решает, что показать, а что скрыть

Функциональная опция связывает две вещи: значение-переключатель и список объектов, которые от этого переключателя зависят.

Значение чаще всего булево. Если в хранилище лежит Истина — объекты из состава опции доступны, если Ложь — скрыты. Для нечисловых и числовых типов опция считается включённой, когда значение не пустое и не равно нулю.

Что происходит при выключении опции:

  • 🔻 привязанные реквизиты, табличные части и команды пропадают из форм и командного интерфейса;
  • 🔻 подсистемы, целиком завязанные на опцию, исчезают из панели разделов;
  • 🔻 поля и колонки, помеченные опцией на форме, перестают отображаться.

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

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

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

Где лежит значение опции: константа, реквизит, ресурс

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

ХранилищеКогда выбираютОсобенность
КонстантаОпция одна на всю базуСамый частый случай: включено/выключено глобально
Реквизит справочникаЗначение зависит от элементаНапример, своя настройка у каждого вида договора
Ресурс регистра сведенийЗначение зависит от нескольких измеренийОснова для параметризованных опций (см. ниже)

Для простого переключателя «вкл/выкл» берут константу типа Булево. Тип хранилища и тип значения опции должны совпадать — платформа проверит это при создании.

Если опция должна действовать по-разному в зависимости от данных (например, по организациям), константа не подойдёт — нужен регистр сведений и параметр функциональной опции.

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

Создаются функциональные опции в дереве конфигурации в ветке Общие → Функциональные опции. Порядок действий:

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

Разница между составом опции и привязкой на форме простая. Через Состав объект скрывается везде сразу — во всех формах и в командном интерфейсе. Привязка на форме действует точечно: прячет конкретное поле именно на этой форме.

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

Проверьте себя
В константе-хранилище лежит значение Ложь. Что произойдёт с данными в привязанных к опции реквизитах?
Где настраивается список объектов, зависящих от опции?
Какой тип хранилища нужен, чтобы значение опции зависело от организации?

Параметры функциональных опций: значение зависит от данных

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

Схема такая:

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

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

Если параметр не задан, платформа не сможет однозначно вычислить значение и будет считать опцию выключенной. Это частая причина «пропавших» полей в параметризованных опциях.

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

В коде текущее значение опции читается функцией ПолучитьФункциональнуюОпцию:

Если ПолучитьФункциональнуюОпцию("ИспользоватьСкладскойУчёт") Тогда
    // склады включены — показываем выбор склада
КонецЕсли;

Для параметризованной опции вторым аргументом передаётся структура отбора — ключ совпадает с именем параметра:

Отбор = Новый Структура;
Отбор.Вставить("Организация", ТекущаяОрганизация);
Значение = ПолучитьФункциональнуюОпцию("ВедётсяУчётНДС", Отбор);

Если нужно работать со значением, которое платформа применяет к интерфейсу текущего сеанса, параметры задаются один раз на весь сеанс:

Параметры = Новый Структура("Организация", ТекущаяОрганизация);
УстановитьПараметрыФункциональныхОпцийИнтерфейса(Параметры);

После этого командный интерфейс и формы будут строиться с учётом именно этой организации.

Отдельная частая задача — обновить интерфейс после того, как значение опции поменяли программно. Автоматически открытые формы и панель разделов не перестраиваются. На клиенте это делает глобальная процедура:

ОбновитьИнтерфейс();

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

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

Функциональные опции и права доступа: в чём разница

Это ключевой момент, на котором ошибаются. Функциональная опция — это не механизм безопасности. Она управляет составом видимой функциональности, а не правами.

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

Чем отличаются два механизма:

  • 🔒 Роли ограничивают доступ на уровне прав: чтение, изменение, добавление. Это защита.
  • 👁 Функциональные опции управляют тем, что видно в интерфейсе. Это удобство и настройка под сценарий.

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

Вывод простой: разграничиваете доступ к секретным данным — используйте роли и ограничение доступа на уровне записей (RLS). Настраиваете внешний вид под задачи клиента — функциональные опции.

Поведение в тонком и веб-клиенте

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

Что стоит учитывать при работе с несколькими пользователями:

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

В веб-клиенте полное обновление страницы браузера тоже перечитывает интерфейс с сервера — это аналог перезахода.

Как функциональные опции выглядят в типовых конфигурациях

Абстрактный механизм становится понятнее на примере типовых решений — там функциональных опций десятки, и пользователь управляет ими, не заходя в конфигуратор.

В 1С:Бухгалтерии 3.0 за это отвечает форма Главное → Функциональность. У неё три режима:

  • Основная — включён минимальный набор опций, интерфейс самый простой;
  • Выборочная — вы сами отмечаете галочками нужные блоки по вкладкам (Банк и касса, Запасы, ОС и НМА, Торговля, Производство);
  • Полная — включены все опции, доступна вся функциональность.

Каждая галочка на этой форме — это значение функциональной опции. Снимете галку «Импортные товары» — из документов и справочников пропадут поля ГТД и страны происхождения. Это тот же самый механизм состава опции, просто с удобной пользовательской формой.

В 1С:Управление торговлей 11 и ERP похожие переключатели собраны в разделе НСИ и администрирование, в группах настроек по подсистемам. Логика та же: галочка меняет значение опции, а платформа перестраивает интерфейс.

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

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

Ошибки здесь обычно не в коде, а в понимании механизма.

Опцией пытаются закрыть доступ. Самая опасная ошибка. Скрыли документ опцией, считают, что пользователь его «не увидит». А он открывает через список ссылок или внешнюю обработку . Для защиты — только роли.

Забыли обновить интерфейс. Поменяли значение константы из кода, а поля не появились. Нужен вызов ОбновитьИнтерфейс() или перезаход — автоматически перестройки не будет.

Параметризованная опция «не включается». Хранилище — ресурс регистра с измерением, а при вызове ПолучитьФункциональнуюОпцию не передали отбор по этому измерению. Без параметра значение считается невычислимым, и опция трактуется как выключенная.

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

Несовпадение типов. Тип хранилища и тип значения опции должны совпадать, иначе конфигурация не сохранится. Для простого переключателя оба — Булево.

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

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