Как программно использовать отбор из ХранилищаНастроекКомпоновкиДанных для фильтрации данных?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке конфигураций на 1С часто возникает задача хранения пользовательских или предопределенных настроек отбора в ХранилищеНастроекКомпоновкиДанных. Когда нам нужно не просто вывести отчет, а использовать эти настройки для фильтрации данных в запросе, мы сталкиваемся с необходимостью десериализации и анализа структуры отбора. Давайте разберем, как подступиться к этой задаче.

Понимание структуры хранилища настроек

Данные, сохраненные в ХранилищеНастроекКомпоновкиДанных, представляют собой сериализованный объект НастройкиКомпоновкиДанных. При вызове метода Получить() платформа возвращает нам готовый объект, из которого мы можем извлечь настройки отбора. Важно помнить, что отбор в СКД — это коллекция элементов, которая может быть как простым списком, так и сложной иерархией групп с условиями «И», «ИЛИ».

Реализация через ручной обход коллекции (простой вариант)

Если задача подразумевает простые отборы (например, по номенклатуре или ее реквизитам), мы можем перебрать коллекцию Элементы отбора. Рассмотрим, как это реализовать на практике:


КоллекцияЭлементовОтбора = Выборка.Ссылка.ХранилищеНастроекКомпоновкиДанных.Получить().Отбор.Элементы;
Для каждого ЭлементОтбора из КоллекцияЭлементовОтбора Цикл
    // Проверяем, является ли элемент простым отбором
    Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
        ЛевоеЗначение = ЭлементОтбора.ЛевоеЗначение;
        ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
        // Здесь мы можем использовать полученные значения для установки параметров запроса
    КонецЕсли;
КонецЦикла;

Этот способ позволяет извлечь параметры и передать их в запрос, например, в секцию ГДЕ. Однако будьте осторожны: если пользователь установил сложное условие (например, «В списке»), ПравоеЗначение будет содержать массив, что потребует использования оператора В в языке запросов 1С.

Правильный подход: использование процессора компоновки

Ручной разбор отбора — это путь, полный ограничений. Если вы хотите сделать решение универсальным, рекомендуем использовать механизмы Системы Компоновки Данных полностью:

  1. Создание схемы СКД: Создайте объект СхемаКомпоновкиДанных программно или используйте макет, содержащий набор данных — запрос к нужной номенклатуре.
  2. Загрузка настроек: Поместите настройки, полученные из хранилища, в КомпоновщикНастроек вашей схемы.
  3. Процессор компоновки: Используйте ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.

Этот метод позволяет платформе самостоятельно обработать любые условия отбора, включая сложные группировки, связи полей и типы сравнения. На выходе вы получите готовую таблицу значений, к которой уже применены все фильтры, заданные пользователем.

Анализ параметров запроса при фильтрации

В процессе работы мы часто видим необходимость отбора по реквизитам, например, по Номенклатура.Марка. Чтобы правильно передать такие данные в запрос, проанализируем текущую ситуацию:


ЗапросНом = Новый Запрос;
ЗапросНом.Текст = "ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка 
    |ИЗ Справочник.Номенклатура КАК Номенклатура 
    |ГДЕ Номенклатура.Марка = &ПравоеЗначение";
ЗапросНом.УстановитьПараметр("ПравоеЗначение", ПравоеЗначение);

Важные замечания по реализации:

Подводя итог, если ваша задача — просто получить номенклатуру по набору правил, не изобретайте велосипед с ручным парсингом ГДЕ. Программный вывод через ПроцессорКомпоновкиДанных является стандартом индустрии для подобных задач, так как он гарантирует корректную работу при любых изменениях в настройках отбора.

← На главную