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

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

процедура "ДоступноИспользованиеПланаОбмена()" общего модуля "ОбменДаннымиПовтИсп":

```1c
    // Возвращает признак доступности использования плана обмена.
    // Признак вычисляется по составу всех функциональных опций конфигурации.
    // Если план обмена не входит в состав ни одной функциональной опции, то возвращается Истина.
    // Если план обмена входит в состав функциональных опций, то возвращается Истина,если хотя бы одна функциональная опция
    // включена.
    // В противном случае функция возвращает Ложь.
    //
    // Параметры:
    // ИмяПланаОбмена - Строка - имя плана обмена, для которого необходимо вычислить признак использования.
    //
    // Возвращаемое значение:
    // Булево - Истина - доступно использование плана обмена.
    // Ложь - использование не доступно.
    //
    Функция ДоступноИспользованиеПланаОбмена(Знач ИмяПланаОбмена) Экспорт

    ОбъектВходитВСоставФункциональныхОпций = Ложь;

    Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл

    Если ФункциональнаяОпция.Состав.Содержит(Метаданные.ПланыОбмена[ИмяПланаОбмена]) Тогда

    ОбъектВходитВСоставФункциональныхОпций = Истина;

    Если ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя) = Истина Тогда

    Возврат Истина;

    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

    Если Не ОбъектВходитВСоставФункциональныхОпций Тогда

    Возврат Истина;

    КонецЕсли;

    Возврат Ложь;
    КонецФункции
```

Т.е. идет перебор ФО конфигурации и если в составе ФО есть искомый объект (в примере это план обмена), то проверяется значение ФО. В данном конкретном случае идет проверка по типу "Булево", но я думаю этого достаточно для решения моей, и думаю, вашей задачи.
Да, если ФО в конфигурации очень много (привет, ЕРП), то возможно будет работать не так быстро как хотелось, но все же...
---
Тоже интересует этот вопрос. Удалось что-нибудь выяснить?
---
Я не нашел решения. Так что остается только костыль из первого сообщения и, конечно, сценарное тестирование.
---
Не сочтите за некропост. Тоже искал решение аналогичного вопроса, попал сюда. В итоге порылся в БСП (версия 3.1.3.Х, должно быть и в более ранних) и вот что нашел:

процедура "ДоступноИспользованиеПланаОбмена()" общего модуля "ОбменДаннымиПовтИсп":

```1c
    // Возвращает признак доступности использования плана обмена.
    // Признак вычисляется по составу всех функциональных опций конфигурации.
    // Если план обмена не входит в состав ни одной функциональной опции, то возвращается Истина.
    // Если план обмена входит в состав функциональных опций, то возвращается Истина,если хотя бы одна функциональная опция
    // включена.
    // В противном случае функция возвращает Ложь.
    //
    // Параметры:
    // ИмяПланаОбмена - Строка - имя плана обмена, для которого необходимо вычислить признак использования.
    //
    // Возвращаемое значение:
    // Булево - Истина - доступно использование плана обмена.
    // Ложь - использование не доступно.
    //
    Функция ДоступноИспользованиеПланаОбмена(Знач ИмяПланаОбмена) Экспорт

    ОбъектВходитВСоставФункциональныхОпций = Ложь;

    Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл

    Если ФункциональнаяОпция.Состав.Содержит(Метаданные.ПланыОбмена[ИмяПланаОбмена]) Тогда

    ОбъектВходитВСоставФункциональныхОпций = Истина;

    Если ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя) = Истина Тогда

    Возврат Истина;

    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

    Если Не ОбъектВходитВСоставФункциональныхОпций Тогда

    Возврат Истина;

    КонецЕсли;

    Возврат Ложь;
    КонецФункции
```

Т.е. идет перебор ФО конфигурации и если в составе ФО есть искомый объект (в примере это план обмена), то проверяется значение ФО. В данном конкретном случае идет проверка по типу "Булево", но я думаю этого достаточно для решения моей, и думаю, вашей задачи.
Да, если ФО в конфигурации очень много (привет, ЕРП), то возможно будет работать не так быстро как хотелось, но все же...
---
Да, в целом рабочий вариант, как мне кажется. Если объектов и ФО сильно много и пользы и кэш не особенно помогает, можно даже попробовать навернуть регистр сведений с парами объект + ФО и обновлять его при обновлении конфигурации — чтобы не рыться по метаданным, а делать запрос. Не уверен, правда, что это будет быстрее — надо тестировать.
---
ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеОбъекта)