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