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

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Суть проблемы и постановка задачи

Представим ситуацию: у нас есть константа ИспользоватьХарактеристики (тип Булево). Нам необходимо, чтобы при ее значении Ложь из интерфейса исчезали:

  1. Справочник ХарактеристикиНоменклатуры.
  2. Отчет ОстаткиНаСкладахСХарактеристиками.
  3. Реквизиты Характеристика в табличных частях документов.
  4. Гиперссылки на панели навигации форм (например, переход из карточки Номенклатуры к ее характеристикам).

Рассмотрим по шагам, как реализовать этот механизм и какие подводные камни могут встретиться на пути.

Шаг 1: Создание и настройка функциональной опции

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

  1. Создадим константу ИспользоватьХарактеристики с типом Булево.
  2. Создадим объект метаданных Функциональная опция и назовем ее ИспользоватьХарактеристики.
  3. В поле Хранилище выберем нашу константу.
  4. Перейдем на закладку Состав. Здесь мы должны отметить галочками все объекты, которые будут видны только тогда, когда константа установлена в значение Истина.

Важный момент: если мы включим в состав ФО целый справочник, система автоматически скроет не только его в разделах интерфейса, но и все ссылки на него, команды открытия и даже стандартные кнопки выбора в полях ввода. Проанализируем ситуацию с гиперссылками: если в регистре сведений ХарактеристикиНоменклатуры измерение Номенклатура помечено как Ведущее, то в форме справочника автоматически появляется переход. Если регистр включен в «выключенную» ФО, эта гиперссылка исчезнет сама собой без написания кода ЭтаФорма.Элементы.ГруппаПерейти.Видимость = Ложь.

Шаг 2: Реализация инверсной видимости

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

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


&НаСервере
Процедура ИспользоватьХарактеристикиПриИзмененииНаСервере()
    // При переключении основной константы, записываем обратное значение во вторую
    ЗначениеФлага = Константы.ИспользоватьХарактеристики.Получить();
    
    МенеджерЗначения = Константы.ВыключитьХарактеристики.СоздатьМенеджерЗначения();
    МенеджерЗначения.Значение = НЕ ЗначениеФлага;
    МенеджерЗначения.Записать();
    
    // Важный вызов для немедленного обновления интерфейса
    ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры

Теперь мы создаем вторую функциональную опцию СкрыватьПриИспользованииХарактеристик, привязываем ее к константе ВыключитьХарактеристики и включаем в ее состав те объекты, которые нужны только в «простом» режиме работы базы.

Шаг 3: Обновление интерфейса и кэширование

Проанализируем распространенную ошибку начинающих разработчиков. Часто после изменения значения константы программно интерфейс пользователя не меняется мгновенно. Это происходит из-за агрессивного кэширования функциональных опций платформой 1С.

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


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

Шаг 4: Работа с параметрическими функциональными опциями

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

Разберем алгоритм настройки:

  1. Создаем Параметр функциональных опций (например, Склад).
  2. В самой Функциональной опции в качестве источника указываем не константу, а, например, реквизит справочника Склады (тип Булево).
  3. Теперь в форме документа, чтобы интерфейс перестроился под конкретный склад, мы должны вызвать установку параметра:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем привязку параметров ФО к данным формы
    СтруктураПараметров = Новый Структура("Склад", Объект.Склад);
    УстановитьПараметрыФункциональныхОпцийФормы(СтруктураПараметров);
КонецПроцедуры

Это позволит динамически скрывать или показывать колонки Характеристика в табличной части в зависимости от того, выбран ли склад с поддержкой характеристик или нет.

Влияние функциональных опций на запросы и СКД

Важно понимать, что функциональные опции — это не только «визуальный сахар». Они глубоко интегрированы в систему компоновки данных (СКД).

Рассмотрим преимущества для отчетов:

Предупреждение: Функциональные опции управляют видимостью, но не правами доступа. Если объект скрыт опцией, но у пользователя есть на него роль «Чтение», он все равно сможет получить данные через прямой запрос или обработку «Консоль запросов». Для разграничения прав используйте механизм RLS (Row Level Security).

Итоги и рекомендации

Мы выяснили, что для эффективного управления видимостью объектов в 1С следует придерживаться следующих правил:

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

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

← На главную