1С функциональные опции

Функциональные опции и параметры функциональных опций

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

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

Рассмотрим на примере:

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

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

Далее перейдем на вкладку «Состав» и выберем объекты и реквизиты объектов которые будут управляться функциональной опцией:

Обновляемся, запускаем 1С Предприятие. Установим значение константы = Истина:

В результате имеем:

При установке константы = Ложь, получим:

У вас есть вопрос, нужна помощь консультанта?

Итак, мы с вами создали функциональную опцию, которая управляет полями имеющих тип СправочникСсылка.Склад

Давайте теперь рассмотрим пример использования параметров функциональных опций.
Добавим новую функциональную опцию «Валютный учет»
Хранение: Справочник.Организация.Реквизит.ВалютныйУчет

Добавим в состав реквизит документа «Установка цен номенклатуры»- «Валюта»

В форме Документа в процедурах «ПриСозданииНаСервере» и » ОрганизацияПриИзменении»
Добавим следующий код:

Обновляем конфигурацию и запускаем ее.
Создаем две Организации и для одной из них установим галочку «Валютный учет»

Что же мы получаем в итоге? В результате использования параметров функциональной опции мы с вами получили параметрическое управление полем «Валюта» в документе «Установка цен номенклатуры». Т.е. для организации «Альфа» будет отображаться поле «Валюта», а для организации «Бета» — поле «Валюта» отображаться не будет.
Давайте в этом убедимся. Открываем документ и попытаемся изменить поле «Организация»
При установке Организации = «Альфа», валюта отображается; меняем на «Бета» — валюта убирается

С выходом платформы «1С:Предприятие 8.2» в дереве конфигурациипоявился новый объект – «Функциональные опции». Он активно применяется во всех типовых конфигурациях, основанных на управляемых формах, и служит для упрощения процесса отображения отдельных реквизитов, объектов в интерфейсе. Например, в вашей конфигурации есть модуль для обмена с внешним веб-сервисов. Это модуль задействует ряд реквизитов в документах, регистрах и отдельные компоненты в подсистемах. Модуль является опциональным и необходим не каждой компании. Логично, раз модуль нужен не всем, то и отображать вся связанные с ним элементы/поля тоже нужно не всегда.

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

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

Функциональные опции призваны решить эту и многие другие сложности, связанные с отображением элементов интерфейса/состава доступных объектов в пользовательском интерфейсе. В этой заметке я не буду рассматривать примеры использования основного назначения функциональных опций, а обращу внимание на применение их не совсем стандартным образом. Возможно, он знаком многим продвинутым разработчикам, но я к такому способу пришел совершенно случайно. Точней он был навеян практикой программирования на JavaScript.

Кейс №1: функциональная опция как обертка над другими объектами

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

Функциональная опция может решить эту проблему более элегантно. Идея в следующем: создаем константу (например, «ВозможностьСохраненияДанных»). Права на нее не назначаем. Создаем одноименную функциональную опцию и указываем в свойстве «Хранение» указываем константу «ВозможностьСохраненияДанных». Также устанавливаем флаг «Привилегированный режим при получении».

Все, теперь в любом месте кода, где требуется обратиться к константе пишем так:

ПолучитьФункциональнуюОпцию(«ВозможностьСохраненияДанных»);

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

Кейс №2. Дополнительный уровень абстракции

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

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

Константы.ВозможностьСохраненияДанных.Получить();

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

ПолучитьФункциональнуюОпцию(«ВозможностьСохраненияДанных»);

Функциональные опции

Книга: Пример быстрой разработки приложений на платформе 1С:ПРЕДПРИЯТИЕ 8 Назад: Улучшаем интерфейс Дальше: Кроссплатформенность

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

Использовать функциональные опции удобно при внедрении программ. Например, в нашей программе предусмотрено три «учетных» раздела – работа со знакомыми, событиями и финансовый учет. Если мы решим подарить нашу разработку друзьям или доработать ее функционально и продавать, всегда можно поинтересоваться, а все ли нужно потенциальным пользователям из того, что мы предлагаем. Например, далеко не все готовы набирать и отслеживать все события, которые происходят в их жизни. При этом вести список друзей и знакомых полезно практически всем, как и считать свои деньги:-).

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

Причем все эти изменения платформа выполнит самостоятельно, так что специалисту нет необходимости как-либо изменять конфигурацию (что-либо программировать). Он просто в пользовательском режиме 1С:Предприятие задает нужное значение функциональной опции – и все!

Мы рассмотрим самый простой пример – когда значение функциональной опции хранится в константе, имеющей тип Булево. Если там значение Истина – значит, функциональная опция включена. Если значение Ложь – функциональная опция выключена.

Т. к. мы создаем первую пользовательскую настройку нашей программы, логично будет создать для нее подсистему Настройки и назначить отдельную картинку «ПодсистемаНастройки.png».

Рис. 9-1. Новая подсистема Настройки

Сразу расположим нашу новую «настроечную» подсистему в конце «обычных» подсистем. Для этого в свойствах конфигурации нажмем на ссылку Командный интерфейс.

Рис. 9-2. Командный интерфейс

И переместим подсистему Настройки в самый низ.

Рис. 9-3. Командный интерфейс

После этого создадим константу, назовем ее ИспользоватьСобытия и скажем, что она имеет тип Булево. Сразу привяжем константу к подсистеме Настройки (меню Дополнительно Alt+Shift+Enter).

Рис. 9-4. Создание константы

Рис. 9-5. Создание константы ИспользоватьСобытия

Рис. 9-6. Дополнительные свойства объекта

Рис. 9-7. Привязка константы ИспользоватьСобытия к подсистеме Настройки

Затем мы создадим функциональную опцию ИспользоватьСобытия и укажем, что ее значение будет храниться в константе ИспользоватьСобытия.

Рис. 9-8. Создание функциональной опции ИспользоватьСобытия

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

Теперь нам нужно привязать объекты конфигурации и реквизиты объектов к этой функциональной опции. Что в нашей системе обеспечивает функциональность работы с событиями? Прежде всего, это подсистема События; далее справочник События и связанный с ним справочник СтатусыСобытий; затем – реквизиты табличных частей документов Событие; и, наконец, измерение Событие регистра накопления.

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

Рис. 9-9. Привязка объектов к функциональной опции

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

Рис. 9-10. Включение функциональной опции

Рис. 9-11. Включение функциональной опции

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

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

Рис. 9-12. Отключение функциональной опции

Внимательно смотрим на наше приложение.

Во-первых, «пропал» раздел События и упоминания объектов, связанных с событиями на рабочем столе.

Рис. 9-13. Отсутствие событий

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

Рис. 9-14. Отсутствие событий

Мы получили то, что хотели – использование учета событий в нашей CRM-системе стало опциональным и зависит только от желания конкретного пользователя этой системы.