Разработка и Конфигурация · 12 мин
Получить функциональную опцию в 1С: что это и как использовать
Что такое функциональная опция в 1С, как получить её значение в коде через ПолучитьФункциональнуюОпцию и в запросе, типичные ошибки и проверка результата.
Функциональная опция в 1С — это объект метаданных, который хранит признак включения или настройки какой-либо возможности конфигурации: например, «Вести учёт по нескольким организациям», «Использовать серии номенклатуры» или «Валютный учёт». Разработчик обращается к её значению в коде, чтобы программа вела себя по-разному в зависимости от настроек конкретной базы. Запрос «получить функциональную опцию 1С» обычно означает практическую задачу: прочитать текущее значение опции программно и использовать его в условии.
Для этого во встроенном языке существует метод ПолучитьФункциональнуюОпцию(). Он возвращает значение опции (чаще всего булево, но возможны и другие типы — ссылка на справочник, число, перечисление) с учётом параметров, если опция параметризована. Понимание того, как устроен механизм, помогает не только писать код, но и проверять, почему в интерфейсе пропал или появился какой-то элемент.
Ниже разобрано, чем функциональная опция отличается от константы, как получить её значение в коде и в запросе, как работают параметризованные опции, какие ошибки встречаются чаще всего и как убедиться, что значение считывается правильно.
Что такое функциональная опция и как она устроена
Функциональная опция сама по себе не хранит значение — она лишь описывает настройку и указывает, где физически лежит значение. Хранилищем может быть константа (для простых опций без параметров), ресурс регистра сведений (для параметризованных опций), реквизит справочника и некоторые другие объекты. Этот момент важен: когда вы «получаете функциональную опцию», платформа фактически читает данные из связанного хранилища.
У опции есть тип значения. Самый распространённый — булево: опция либо включена, либо выключена. Но встречаются опции со ссылочными и числовыми типами, например «Основная организация» или «Основная валюта». Тип определяется в свойствах объекта метаданных и должен совпадать с типом хранилища, иначе при обновлении конфигурации возникнет ошибка проверки.
Кроме хранения значения, опция управляет составом интерфейса. В свойствах опции перечислен «состав» — объекты метаданных (справочники, документы, реквизиты, команды, роли), которые видны пользователю только когда опция включена. Поэтому отключение опции «прячет» целые разделы учёта без удаления данных.
Чем функциональная опция отличается от константы
Константа — это просто ячейка для хранения одного значения в базе. Функциональная опция — надстройка над хранилищем, которая добавляет смысл и поведение: влияние на интерфейс, права, командный интерфейс подсистем. Один и тот же признак можно хранить и в константе, и через опцию, но в типовых конфигурациях настройки оформляются именно опциями.
Практическое отличие для разработчика: к константе обращаются напрямую (Константы.ИмяКонстанты.Получить()), а к опции — через ПолучитьФункциональнуюОпцию(). Если настройка оформлена как опция, читать её нужно именно через механизм опций: это гарантирует корректную работу с параметрами и кэширование значений платформой.
Сравнение вариантов
Подходит для простого хранения значения без влияния на интерфейс; обращение напрямую через Константы.Имя.Получить()
Подходит, когда настройка должна управлять видимостью объектов и поведением системы; читается через ПолучитьФункциональнуюОпцию()
Подходит, когда настройка задаётся отдельно для каждой организации, склада или другого объекта; требует передачи параметров при чтении
Как получить значение опции в коде
Базовый синтаксис выглядит так:
Если ПолучитьФункциональнуюОпцию("ВестиУчетПоНесколькимОрганизациям") Тогда
// логика для многофирменного учёта
КонецЕсли;
Метод доступен и на сервере, и на толстом клиенте. В тонком клиенте и веб-клиенте прямой вызов серверного метода недоступен, поэтому в клиентском коде используют обращение через серверную процедуру либо готовые функции общих модулей типовой конфигурации (например, в БСП есть обёртки для чтения опций).
Для параметризованных опций вторым аргументом передаётся структура параметров. Имя ключа должно совпадать с именем параметра, указанным в свойствах опции:
ПараметрыОпции = Новый Структура("Организация", ТекущаяОрганизация);
ИспользоватьСерии = ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатуры", ПараметрыОпции);
Если опция не параметризована, а параметры переданы — или наоборот, параметры нужны, но не переданы — платформа выдаст ошибку либо вернёт значение по умолчанию (для булевых опций — Ложь). Это одна из самых частых причин «неправильно работающего» условия.
- 1Откройте в конфигураторе нужную функциональную опцию и посмотрите её тип и хранилище значения
- 2Проверьте, есть ли у опции параметры (закладка с параметрами в свойствах объекта)
- 3В коде вызовите ПолучитьФункциональнуюОпцию с именем опции в точном написании
- 4Для параметризованной опции сформируйте структуру с ключом, совпадающим с именем параметра
- 5Проверьте возвращаемое значение в отладчике и сопоставьте с фактической настройкой в базе
Как получить значение опции в запросе
Метод ПолучитьФункциональнуюОпцию() внутри текста запроса недоступен — запрос работает с физическими таблицами. Поэтому в запросе обращаются напрямую к хранилищу значения: к таблице константы или к регистру сведений, в ресурсе которого хранится значение опции.
Для опции, значение которой хранится в константе, запрос выглядит так:
ВЫБРАТЬ
Константы.ИспользоватьВалютныйУчет КАК ВалютныйУчет
ИЗ
Константы КАК Константы
Для параметризованной опции обращаются к регистру сведений с отбором по измерению, соответствующему параметру. Важно помнить о соединениях: если для конкретного объекта (например, организации) запись в регистре отсутствует, левое соединение вернёт NULL, и это нужно обработать через ЕСТЬNULL со значением по умолчанию.
Где посмотреть и изменить значение опции без кода
В пользовательском режиме значения функциональных опций обычно меняются через формы настроек: «Администрирование», «Настройка параметров учёта», разделы настройки подсистем — в зависимости от конфигурации. Флажки в этих формах напрямую связаны с опциями, поэтому изменение настройки сразу влияет на интерфейс и поведение программы.
В конфигураторе фактическое значение можно проверить через хранилище: открыть константу (меню «Операции» → «Константы» в режиме предприятия или таблицу констант) или регистр сведений. Также значение опции легко проверить через консоль кода или отладчик, выполнив вызов ПолучитьФункциональнуюОпцию() с нужными параметрами.
При разработке собственной подсистемы опцию создают в ветке «Общие» → «Функциональные опции», задают тип, хранилище, при необходимости параметры и заполняют состав объектов, которые должны скрываться при выключенной опции.
Как проверить результат
Совпадает с настройкой, видимой в форме параметров учёта
Возвращается Ложь при включённой настройке — проверьте параметры опции
Строка совпадает с именем объекта метаданных символ в символ
Ошибка «Функциональная опция не найдена» при выполнении
Ключи структуры совпадают с именами параметров в свойствах опции
Возвращается значение по умолчанию независимо от настройки
При включении опции появляются связанные элементы и команды
Интерфейс не меняется — проверьте состав опции и обновите интерфейс
Типичные ошибки и ограничения механизма
Первая группа ошибок связана с именами и параметрами. Имя опции передаётся строкой, и платформа не проверяет его на этапе компиляции модуля — опечатка обнаружится только в момент выполнения. Поэтому имя лучше копировать из дерева метаданных, а не набирать вручную.
Вторая группа — неправильная работа с параметризованными опциями. Если параметр не передан, для булевой опции вернётся Ложь, и условие молча пойдёт по ветке «выключено». Такая ошибка не вызывает исключения и может долго оставаться незамеченной, искажая логику учёта.
Третий момент — контекст выполнения. В клиентских модулях тонкого и веб-клиента прямой вызов недоступен; типовые конфигурации решают это через серверные вызовы или кэшированные значения в модулях повторного использования. Также стоит помнить, что значения опций кэшируются сеансом: после изменения настройки в другом сеансе текущий сеанс может некоторое время видеть старое значение.
Практические рекомендации по использованию
При разработке собственных механизмов заводите настройку как функциональную опцию, если она должна влиять на интерфейс или включать целый блок функциональности. Для технических значений, невидимых пользователю, достаточно константы — опция добавит лишний слой без пользы.
Именуйте опции по смыслу настройки, а не по имени хранилища: «ИспользоватьСерииНоменклатуры» читается лучше, чем «СерииНоменклатуры». В коде, где опция читается многократно в цикле, вынесите вызов за пределы цикла — хотя платформа кэширует значения, лишние обращения усложняют отладку.
При доработке типовых конфигураций предпочитайте чтение существующих опций через их программный интерфейс, а не через прямой запрос к константам: это сохранит совместимость при обновлениях, если поставщик изменит хранилище значения.
Быстрый способ понять, почему условие «не срабатывает»: выполните в консоли кода вызов ПолучитьФункциональнуюОпцию с теми же параметрами, что в модуле, и сравните результат с флажком в форме настроек. Расхождение почти всегда означает ошибку в имени опции или в параметрах.
Что важно запомнить
Функциональная опция — настройка конфигурации, значение которой хранится в константе или регистре сведений. В коде её читают через ПолучитьФункциональнуюОпцию с точным именем и параметрами, в запросе — через обращение к хранилищу. Большинство проблем связано с опечатками в имени и пропущенными параметрами.
Частые вопросы
Чем ПолучитьФункциональнуюОпцию отличается от ПолучитьФункциональнуюОпциюИнтерфейса?
Первый метод возвращает значение опции для прикладной логики с учётом параметров. Второй предназначен для управления интерфейсом и возвращает значение с учётом настроек, влияющих на отображение. Для проверки условий в бизнес-логике используют ПолучитьФункциональнуюОпцию.
Почему опция включена в настройках, а код возвращает Ложь?
Чаще всего опция параметризована, а параметры при вызове не переданы или переданы с неверным именем ключа. Также проверьте имя опции на опечатки и убедитесь, что сеанс не работает с устаревшим кэшем — перезапуск сеанса помогает это исключить.
Можно ли использовать ПолучитьФункциональнуюОпцию в запросе?
Нет, в тексте запроса метод недоступен. В запросе обращаются к физическому хранилищу значения: таблице констант или регистру сведений, указанному в свойствах опции как хранилище.
Где хранится значение функциональной опции?
Место хранения задаётся в свойствах объекта метаданных: чаще всего это константа (для обычных опций) или ресурс регистра сведений (для параметризованных). Точное хранилище видно в конфигураторе в свойствах конкретной опции.
Что произойдёт с данными, если отключить функциональную опцию?
Данные не удаляются — скрываются связанные объекты интерфейса: справочники, документы, реквизиты, команды. При повторном включении опции всё становится доступно снова. Однако прикладной код, проверяющий опцию, перестанет выполнять соответствующие ветки логики.
Можно ли обратиться к опции из тонкого клиента?
Прямой вызов метода в тонком и веб-клиенте недоступен. Значение получают через серверную процедуру общего модуля или используют готовые механизмы типовой конфигурации, например модули повторного использования с кэшированием настроек.