Функциональные опции в платформе 1С:Предприятие 8.3 являются мощным инструментом для гибкой настройки интерфейса и состава объектов конфигурации без изменения программного кода. Однако разработчики часто сталкиваются с вопросом: как ведет себя функциональная опция, если реквизит хранения имеет тип, отличный от Булево (например, число, строка или ссылка на справочник), и можно ли перехватить логику вычисления опции?
Разберем детально механизм работы платформы с небулевыми типами, проанализируем частые ошибки при работе с параметрами функциональных опций и рассмотрим способы решения подобных задач.
Платформа 1С позволяет указывать в качестве реквизита хранения функциональной опции практически любой тип данных. Однако при определении видимости элементов интерфейса (команд, полей форм, колонок таблиц) платформа всегда выполняет автоматическое неявное приведение значения к типу Булево по следующим правилам:
СправочникСсылка.Валюты.ПустаяСсылка()), число 0, пустую строку "", а также системные значения Неопределено или Null.Таким образом, платформа не анализирует смысловое содержание ссылки (например, «Рубли» это или «Доллары»). Встроенных событий или методов для произвольного перехвата значения функциональной опции в метаданных не предусмотрено. Если реквизит заполнен — опция считается активной.
Если видимость реквизитов или команд формы должна зависеть от конкретного значения ссылки (например, отображать реквизит только для валюты «Доллар»), рассмотрим основные способы реализации этой логики.
Способ 1. Использование служебного булева реквизита или регистра сведений
Создадим отдельный реквизит с типом Булево (или ресурс непериодического регистра сведений), который будет выступать источником для функциональной опции. Расчет значения выполняем в подписке на событие ПередЗаписью или ПриЗаписи соответствующего объекта:
Процедура ОбработкаПередЗаписью(Источник, Отказ) Экспорт
// Проверяем условие и устанавливаем значение булева флага
Если Источник.Валюта = Справочники.Валюты.НайтиПоКоду("840") Тогда
Источник.ИспользоватьВалютныйУчет = Истина;
Иначе
Источник.ИспользоватьВалютныйУчет = Ложь;
КонецЕсли;
КонецПроцедуры
Способ 2. Программное управление свойствами элементов формы
Когда требуется динамически скрывать или отображать реквизиты в зависимости от действий пользователя непосредственно на форме, оптимальным подходом является управление свойствами элементов в контексте управляемой формы:
&НаКлиенте
Процедура ВалютаПриИзменении(Элемент)
УстановитьВидимостьЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВидимостьЭлементов()
// Управляем видимостью поля в зависимости от выбранного значения
Элементы.СуммаВВалюте.Видимость = (Объект.Валюта = ПредопределенноеЗначение("Справочник.Валюты.ДолларСША"));
КонецПроцедуры
Если функциональная опция хранится в ресурсе регистра сведений, имеющего измерения, эти измерения выступают в качестве Параметров функциональных опций. В этом случае поведение платформы имеет важный нюанс:
Если для формы или сеанса не установлены параметры функциональных опций (отбор по измерениям регистра), платформа считывает записи регистра без отбора. При наличии хотя бы одной записи со значением Истина функциональная опция вернет Истина для всей формы.
Чтобы опция рассчитывалась корректно для конкретного объекта, необходимо передавать параметры опции:
УстановитьПараметрыФункциональныхОпций(СтруктураПараметров).ПриСозданииНаСервере вызываем метод формы УстановитьПараметрыФункциональныхОпцийФормы(СтруктураПараметров) или заполняем свойство формы ПараметрыФункциональныхОпций:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПараметрыФО = Новый Структура;
ПараметрыФО.Вставить("Организация", Объект.Организация);
// Устанавливаем параметры для текущей формы
УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФО);
КонецПроцедуры
Для программного чтения значения опции с учетом контекста используем функцию ПолучитьФункциональнуюОпцию(ИмяОпции, СтруктураПараметров).
Важное ограничение: функциональные опции управляют видимостью колонок динамических списков и таблиц целиком для всей формы. Они не предназначены для построчного скрытия колонок в строках с разными значениями. Для построчной визуализации следует применять условное оформление динамического списка или таблицы формы.