Функциональная опция не найдена 1с 8.3. Функциональные опции. Принцип работы и пример использования. "Логика разрешений" как правило пересечения ролей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Назначение

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

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

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

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

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

Глобальный командный интерфейс

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

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

Форма

В управляемой форме функциональные опции могут влиять на реквизиты формы, команды и (как следствие) на связанные с ними элементы формы.

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

Система компоновки данных

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

Подробнее о влиянии функциональных опций на доступность полей в отчете см. в разделе «Функциональные опции и право на просмотр поля в отчете» главы «Управляемые отчеты».

Общая схема работы

Механизм функциональных опций включает в себя два типа объектов метаданных: Функциональная опция и Параметр функциональных опций.

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

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

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

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

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

  • Организация (соответствующего типа);
  • Подразделение (соответствующего типа).

Ресурсом регистра сведений будет значение функциональной опции количественного учета.

Тогда общая структура конфигурации будет выглядеть следующим образом:

  • регистр сведений КоличественныйУчет:
    • Измерение Организация,
    • Измерение Подразделение,
    • Ресурс КоличественныйУчет, имеющий тип Булево.
  • параметр функциональных опций Организация. Свойство Использование указывает на измерение Организация регистра сведений КоличественныйУчет.
  • параметр функциональных опций Подразделение. Свойство Использование указывает на измерение Подразделение регистра сведений КоличественныйУчет.
  • функциональная опция КоличественныйУчет, свойство Хранение указывает на ресурс КоличественныйУчет регистра сведений КоличественныйУчет.

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

Взаимодействие с другими объектами

Функциональные опции могут быть назначены следующим объектам конфигурации:

  • Подсистемы,
  • Общие команды,
  • Константы,
  • Критерии отбора,
  • Справочник,
  • Документ,
  • Журнал,
  • План счетов,
  • План видов характеристик,
  • План видов расчета,
  • Бизнес-процесс,
  • Задача,
  • Планы обмена,
  • Отчет,
  • Обработка,
  • Регистр накопления,
  • Регистр сведений,
  • Регистр бухгалтерии,
  • Регистр расчета,
  • Команда,
  • Реквизит объекта метаданных,
  • Табличная часть,
  • Реквизит табличной части,
  • Признак учета,
  • Признак учета субконто,
  • Реквизиты адресации,
  • Измерение регистра,
  • Ресурс регистра.

Также функциональные опции могут влиять на видимость элементов формы.

Создание

Создание функциональной опции

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

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

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

  • константы,
  • реквизиты справочников,
  • ресурсы регистров сведений.

Ограничение на тип источника значения опции нет, но для управления интерфейсом пригодны только те функциональные опции, которые хранят свои значения в реквизитах, имеющих тип Булево. Значения функциональных опций с другими типами доступны только для анализа на встроенном языке.

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

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

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

Использование

Назначение объектам метаданных

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

Назначение реквизитам и командам формы

Объекты, принадлежащие форме (Реквизиты и Команды), также можно задействовать в механизме функциональных опций.

Сделать это можно в редакторе формы, установив свойство Функциональные опции для требуемого объекта.

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

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

Использование в механизме ограничения доступа к данным

В условиях механизма ограничения доступа к данным Функциональные опции могут использоваться точно так же, как и Параметры сеанса. Допустимо использовать только независящие от параметров опции, то есть те, которые привязаны к константам.

Определение значения функциональной опции

Значение функциональной опции определяется объектом, который указан в свойстве Хранение. В случае константы используется ее значение. Для опции, связанной с реквизитом справочника или ресурсом регистра сведений, – значения, хранящиеся в этих объектах. Для того чтобы найти конкретный объект, который хранит значение функциональной опции, необходима дополнительная информация – набор значений параметров функциональных опций.

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

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

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

Управление значениями параметров функциональных опций

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

Работа с функциональными опциями во встроенном языке

Методы работы с функциональными опциями можно разделить на две части:

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

Работа со значениями функциональных опций

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

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

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

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

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

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

30.03.2017

Функциональные опции 1С 8.3 (Механизм, использование)

Для начала важно отметить, что механизм функциональных опций НЕ ограничивает доступ к данным, а только лишь управляет видимостью (отображением) данных на форме. Для ограничения доступа к объектам в платформе используется механизм ролей.
Поэтому рассмотрение механизма функциональных опций начнем с описания задачи. В нашей мини-конфигурации имеется один справочник "Склады". Предположим что доступ к этому справочнику есть у всех пользователей.
Еще раз! Механизм функциональных опций управляет отображением данных на форме, а не ограничивает доступ к объекту метаданных (Справочник, документ, записи регистра....) Необходимо сделать настройку "Использовать несколько складов" (Да да... Это же есть в УТ 11.Х, там такое и для организаций сделано) . Если используем несколько складов, то в интерфейсе доступен справочник склады, если нет то команда которая открывает один склад (полагаем что он один и есть в таком случае, и не усложняем задачу).

Объекты метаданных конфигурации

Для реализации поставленной задачи нам потребуется:
  • Две функциональных опции "ИспользоватьНесколькоСкладов" и "НеИспользоватьНесколькоСкладов". Первая отвечает за доступность справочника, а вторая за доступность общей команды для вызова алгоритма "открытия" склада
  • Одноименные константы с типом "Булево" для хранения значений функциональных опций
  • Справочник "Склады"
  • Общая команда "ОткрытьОсновнойСклад". Не забываем указать для нее группу команд, иначе не применить конфигурацию (будет ошибка)
И добавим одну подсистему куда включим все имеющиеся объекты

Настройка функциональных опций

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




Вторая функциональная "НеИспользоватьНесколькоСкладов" установлена когда НЕ установлена первая "ИспользоватьНесколькоСкладов".
Т.е. если мы не используем несколько складов (ИспользоватьНесколькоСкладов = ЛОЖЬ и справочник "Склады" недоступен), то отображается команда "ОткрытьОсновнойСклад" доступность которой управляется опцией "НеИспользоватьНесколькоСкладов" (НеИспользоватьНесколькоСкладов = ИСТИНА)

Проверяем поведение системы

Вариант №1. ИспользоватьНесколькоСкладов = Истина, НеИспользоватьНесколькоСкладов = Ложь. В интерфейсе доступен справочник "Склады"


Вариант №2. ИспользоватьНесколькоСкладов = Ложь, НеИспользоватьНесколькоСкладов = Истина. В интерфейсе НЕ доступен справочник "Склады", вместо этого доступна общая команда "ОткрытьОсновнойСклад"

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

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

Создадим новую константу, назовем ее УчетЗарплаты , тип – Булево . Включим константу в подсистему Администрирование и в форму констант для того, чтобы мы могли редактировать ее. Кроме того, в форме констант зададим обработчик ПослеЗаписи следующего вида:

&НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) ОбновитьИнтерфейс(); КонецПроцедуры

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

Создадим новую функциональную опцию, назовем ее УчетЗарплаты , на закладке Основные , в параметре Хранение укажем только что созданную константу, рис. 7.23 . Включим функциональную опцию в подсистему Администрирование .


Рис. 7.23.

Теперь перейдем на закладку окна настройки функциональной опции Состав и выберем все ( рис. 7.24), что относится к расчету заработной платы. Если какие-либо объекты, например, справочники, относятся к различным частям конфигурации, не будем их отмечать, иначе при выключении функциональной опции они "исчезнут" из интерфейса.


Рис. 7.24.

Выбор подсистемы РасчетЗаработнойПлаты в данном случае не ведет к автоматическому выбору всех объектов, включенных в подсистему. При выборе мы лишь подразумеваем скрытие или отображение раздела командного интерфейса РасчетЗаработнойПлаты .

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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