Добрый день. Подскажите, как решить такую задачу. Есть документ и есть настройки компоновки данных с некоторыми отборами. Как программно определить, что документ соответствует или не соответствует отборам компоновки?
---
Такая функция претендует на универсальность. Можно также попробовать вместо получения ТЗ работать с запросом, сформированным в макете компоновки.
```1c
    &НаСервере
    Функция ПроверитьСоответствиеСсылкиНастройкам(СсылкаНаОбъект, Настройки)

    МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
    ПолноеИмяМетаданных = МетаданныеОбъекта.ПолноеИмя();

    Схема = Новый СхемаКомпоновкиДанных;

    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "ИсточникДанных1";
    Источник.ТипИсточникаДанных = "Local";

    НовыйНаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НовыйНаборДанных.Имя = "НаборДанных1";
    НовыйНаборДанных.ИсточникДанных = Источник.Имя;
    НовыйНаборДанных.Запрос = "ВЫБРАТЬ * ИЗ " + ПолноеИмяМетаданных + " ГДЕ Ссылка = &Ссылка";

    НовыйПараметр = Настройки.ПараметрыДанных.Элементы.Добавить();
    НовыйПараметр.Параметр = Новый ПараметрКомпоновкиДанных("Ссылка");
    НовыйПараметр.Значение = СсылкаНаОбъект;
    НовыйПараметр.Использование = Истина;

    // выбираем только поле Ссылка
    Настройки.Выбор.Элементы.Очистить();
    ЭлементВыбранныхПолей = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ЭлементВыбранныхПолей.Поле = Новый ПолеКомпоновкиДанных("Ссылка");

    // Добавление группировки "Детальные записи"
    Настройки.Структура.Очистить();
    НоваяСтруктура = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    АвтоВыбранноеПолеКомпоновкиДанных = НоваяСтруктура.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,ТипГенератора);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    Возврат ТЗ.Количество() > 0

    КонецФункции
```
---
Выполнить запрос к документу, в который в условие ГДЕ передать условия док.Ссылка = &МояСсылка И (тут продублировать отборы компоновки данных).
Если запрос вернет данные, значит ваш документ соответствует.
---
Не знаю на входе с каким объектом метаданных буду работать. Понял примерно так.

```1c
    ПолноеИмя = СтрТч.Ссылка.Метаданные().ПолноеИмя();
    ЗначениеНастроек = Выборка.Компоновщик.Настройка.Получить();

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | т.Ссылка КАК Ссылка
    |ИЗ
    | ВставкаОбъекта КАК ОбъектДляОбработки
    |ГДЕ
    | т.Ссылка = &Ссылка";

    Запрос.Текст = СтрЗаменить(Запрос.Текст,"
    | ВставкаОбъекта", ПолноеИмя);

    Запрос.УстановитьПараметр("Ссылка", СтрТч.Ссылка);
    РезультатЗапроса = Запрос.Выполнить();

    Если Не РезультатЗапроса.Пустой() Тогда
    Сообщить("Документ соответствует условиям отбора");
    КонецЕсли;
```

Не пойму как вставить отборы из компоновки
---
Что значит как? Есть компоновщик настроек, у него есть отборы. В чем вопрос то?
---
В цикле обойти элементы отбора компоновки, добавлять в отбор запрос поле, условие и значение как в элементе отбора.
Если там возможны группы условий с И, ИЛИ, НЕ, то можно вынести перенос отборов в условия в отдельную процедуру, и вызывать ее рекурсивно.
---
Нужно получить результат СКД с настройками компоновщика в виде таблицы значений, в которой искать имеющуюся ссылку. Если схемы, на основании которой сформированы настройки, нет, то создать ее программно.
---
Такая функция претендует на универсальность. Можно также попробовать вместо получения ТЗ работать с запросом, сформированным в макете компоновки.
```1c
    &НаСервере
    Функция ПроверитьСоответствиеСсылкиНастройкам(СсылкаНаОбъект, Настройки)

    МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
    ПолноеИмяМетаданных = МетаданныеОбъекта.ПолноеИмя();

    Схема = Новый СхемаКомпоновкиДанных;

    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "ИсточникДанных1";
    Источник.ТипИсточникаДанных = "Local";

    НовыйНаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НовыйНаборДанных.Имя = "НаборДанных1";
    НовыйНаборДанных.ИсточникДанных = Источник.Имя;
    НовыйНаборДанных.Запрос = "ВЫБРАТЬ * ИЗ " + ПолноеИмяМетаданных + " ГДЕ Ссылка = &Ссылка";

    НовыйПараметр = Настройки.ПараметрыДанных.Элементы.Добавить();
    НовыйПараметр.Параметр = Новый ПараметрКомпоновкиДанных("Ссылка");
    НовыйПараметр.Значение = СсылкаНаОбъект;
    НовыйПараметр.Использование = Истина;

    // выбираем только поле Ссылка
    Настройки.Выбор.Элементы.Очистить();
    ЭлементВыбранныхПолей = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ЭлементВыбранныхПолей.Поле = Новый ПолеКомпоновкиДанных("Ссылка");

    // Добавление группировки "Детальные записи"
    Настройки.Структура.Очистить();
    НоваяСтруктура = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    АвтоВыбранноеПолеКомпоновкиДанных = НоваяСтруктура.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,ТипГенератора);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    Возврат ТЗ.Количество() > 0

    КонецФункции
```
---
Супер! Спасибо.