Что такое функциональные опции и как они работают?

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

Что же такое функциональные опции?

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

Для чего это может быть необходимо?

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

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

На что влияют ФО ?

ФО могут оказывать влияние:

  • На пользовательский интерфейс – при выключении каких либо ФО система скрывает в польззовательском интерфейсе все элементы которые к ней относятся, затрагивая следующие элементы интерфейса:
    • Глобальный командный интерфейс
    • Реквизиты формы (в т.ч. колонки реквизита формы типа ТаблицаЗначений или ДеревоЗначений);
    • Команды формы
    • Отчеты реализованные с помощью системы СКД.
  • На алгоритмы написанные на встроенном языке – имеется возможность програмно получать значения ФО и использовать их в различных условиях, например для уменьшения объема вычислений.

ВНИМАНИЕ!

   ФО не влияют на состав базы данных. Все таблицы и поля присутствуют в базе данных не зависимо от состояния  значений ФО.

Как управлять функциональной опцией?

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

Значение Истина – включенный объект в состав ФО отображается в интерфейсе программы.  Ложь – включенный объект в состав ФО НЕ отображается в интерфейсе программы.   

Какие свойства имеются у объекта функциональная опция?

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

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

Что такое  и для чего нужны ПФО ?

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

У объекта ПФО есть только одно интересующее нас свойство:

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

На словах не совсем понятно, поэтому рассмотрим примеры работы  с хранением значения ФО во всех доступных объектах.

Для экспериментов создадим ФО ВалютныйУчет и добавим в состав ФО справочник Валюты для организации возможности выбирать валюту в договорах с клиентами.

Значение ФО хранится в константе

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

Для использования значения хранящегося в константе не нужно писать никакого кода, достаточно просто создать константу Булевского типа и указать ее в качестве значения хранения.

Значение ФО хранится в константе

Пример использования константы:

Значение константы Ложь
Значение константы Истина

Значение ФО хранится в реквизите справочника

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

Значение ФО хранится в реквизите справочника
Значение ФО установлено в состояние Истина, и элемент на форме видимостью которого управляет ФО – отображается.
У другого элемента справочника значение ФО установлено в режим Ложь, но элемент диалога отображается на форме точно так же.

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

Используя объект конфигурации ПФО,  мы  указываем ФО  из какого именно элемента справочника нужно взять значение ФО.

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

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

&НаСервере
Процедура УстановитьПараметрыФО()

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЗначенияНастройкиФО .Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.ЗначенияНастройкиФО  КАК ЗначенияНастройкиФО 
		|ГДЕ
		|	ЗначенияНастройкиФО .ВключитьВалютныйУчет = &ВключитьВалютныйУчет";
	
	Запрос.УстановитьПараметр("ВключитьВалютныйУчет", Объект.ВключитьВалютныйУчет);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда 
		Значение = ВыборкаДетальныеЗаписи.Ссылка;
	Иначе
		НовыйЭлемент = Справочники.ЗначенияНастройкиФО .СоздатьЭлемент();
		НовыйЭлемент.ВключитьВалютныйУчет = Объект.ВключитьВалютныйУчет;
		НовыйЭлемент.Записать();
		Значение = НовыйЭлемент.Ссылка;
	КонецЕсли;
	
	УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("Договор", Значение));	
	

КонецПроцедуры	

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  УстановитьПараметрыФО();
КонецПроцедуры

&НаКлиенте
Процедура ВключитьВалютныйУчетПриИзменении(Элемент)
	УстановитьПараметрыФО();
ОбновитьИнтерфейс();
КонецПроцедуры 

Значение ФО хранится в ресурсе Регистра сведений

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

Для примера рассмотрим такую ситуацию:

— Валютный учет действует только для определенной организации и определенного склада в соответствии с этим видимость элемента «Валюта» в документе «Продажа», должна появляться только для соответствующей  организации и соответствующего склада. 

Для решения этой задачи изменим свойство хранение ФО «Валютный учет» с реквизита справочника, на измерение регистра сведений.

Для начала создадим регистр сведений в котором будем хранить значение в разрезе измерений.

Изменим значение хранение ФО на ресурс регистра сведений.

Создадим два объекта ПФО «Организация» и «Склад» и укажем, откуда брать значения для параметров.

В документе продажа будем вызывать процедуру «УстановкаПараметровФО()» для установки значения ПФО в обработчиках событий : «ПриСозданииНаСервере» и «ПриИзменении» при изменении значений элементов формы «Организация» и «Склад».

Проверяем что получилось…

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

Добавляем документ и выбираем организацию и склад..

Меняем склад на другой.

Как предполагалось –элемент формы «Валюта» просто исчез с формы.

В этой статье мы познакомились с механизмом ФО и рассмотрели базовые приемы работы с объектами конфигурации ФО и ПФО.

Благодарю за внимание.