К статье
Практический материал

Отчеты и Аналитика · 12 мин

Как программно установить отбор в СКД в 1С

Разбираем, как программно установить отбор в СКД в 1С: работа с настройками компоновщика, отбор в отчетах на управляемых формах, типовые ошибки и примеры кода.

Программная установка отбора в системе компоновки данных (СКД) — одна из самых частых задач при разработке отчетов в 1С. Она возникает, когда нужно открыть отчет с уже примененным фильтром, ограничить данные по правам пользователя или сформировать отчет в фоне с заданными условиями. В отличие от ручной настройки через интерфейс, здесь важно понимать структуру настроек компоновщика и порядок их инициализации.

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

Материал применим к типовым и самописным отчетам на СКД в конфигурациях на управляемом приложении (УТ, ERP, БП, ЗУП и других). Синтаксис одинаков, различия — только в способе получения компоновщика настроек.

Где хранится отбор в СКД и какие настройки бывают

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

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

Базовый способ: добавление элемента отбора в компоновщик настроек

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

Настройки = Отчет.КомпоновщикНастроек.Настройки;

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

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Организация;

ЭлементОтбора.Использование = Истина;

Обратите внимание: левое значение — это не строка, а объект ПолеКомпоновкиДанных. Имя поля должно существовать в схеме компоновки и быть доступным для отбора. Если поле в схеме помечено как недоступное для отбора, элемент добавится, но при формировании получите ошибку или отбор будет проигнорирован. Проверить доступность поля можно через Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных("Организация")) — если результат Неопределено, поле использовать нельзя.

Если элемент отбора с таким полем уже существует (например, задан в варианте отчета), добавление второго элемента приведет к дублю и логике «И» между ними. Правильнее сначала найти существующий элемент перебором коллекции и изменить его значение, а добавлять новый только если не нашли.

Порядок действий
  1. 1
    Получите настройки: Отчет.КомпоновщикНастроек.Настройки
  2. 2
    Проверьте, доступно ли поле через ДоступныеПоляОтбора
  3. 3
    Найдите существующий элемент отбора по имени поля или добавьте новый
  4. 4
    Заполните ЛевоеЗначение, ВидСравнения, ПравоеЗначение
  5. 5
    Установите Использование = Истина
  6. 6
    Сформируйте отчет и проверьте результат

Отбор через пользовательские настройки отчета

В типовых конфигурациях на БСП (Библиотека стандартных подсистем) пользователь видит не основные настройки, а пользовательские. Если нужно, чтобы заданный программно отбор отображался в панели быстрых настроек и его можно было снять, работайте с коллекцией КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.

Механика такая: у элементов основных настроек есть свойство ИдентификаторПользовательскойНастройки. По нему в пользовательских настройках находится соответствующий элемент. Типовой прием — перебрать элементы пользовательских настроек, найти нужный по типу ЭлементОтбораКомпоновкиДанных или по связанному полю и установить ему значение и использование.

Для Каждого Элемент Из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда

Продолжить;

КонецЕсли;

// сравнение поля и установка значения

КонецЦикла;

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

Отбор при программной компоновке без формы отчета

Когда отчет формируется в фоне, по регламентному заданию или из другого объекта, формы нет и компоновщик нужно создать вручную. Схема получается методом ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"), затем создается компоновщик, инициализируется и загружает настройки из схемы.

СхемаКД = Отчеты.Продажи.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;

Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));

Компоновщик.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);

ЭлементОтбора = Компоновщик.Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

ЭлементОтбора.ПравоеЗначение = СписокНоменклатуры;

ЭлементОтбора.Использование = Истина;

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

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

Виды сравнения и особенности значений

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

Отдельного внимания заслуживают даты и периоды. Если поле отбора — дата, а нужно ограничить период, надежнее использовать параметры схемы (НачалоПериода, КонецПериода) через Настройки.ПараметрыДанных, а не два элемента отбора «БольшеИлиРавно/МеньшеИлиРавно». Параметры корректно обрабатываются механизмом периодов СКД и не конфликтуют со стандартными периодами в пользовательских настройках.

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

Типичные ошибки
01
Передача строки вместо ссылки в ПравоеЗначение — отбор молча ничего не находит
02
Добавление отбора после формирования отчета без повторного вызова формирования — результат не меняется
03
Использование поля, недоступного для отбора в схеме, — ошибка компоновки или игнорирование условия
04
Дублирование элемента отбора вместо изменения существующего — неожиданная логика И между условиями
05
Забытое свойство Использование = Истина — элемент есть, но не применяется

Как проверить, что отбор применился

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

На форме отчета после программной установки отбора отчет нужно сформировать заново: в типовых решениях это метод СкомпоноватьРезультат() или кнопка «Сформировать». Если отбор установлен в обработчике ПриСозданииНаСервере, убедитесь, что он выполняется после загрузки сохраненных пользовательских настроек, иначе ваши значения могут быть перезаписаны.

Контрольные точки

Как проверить результат

Элемент отбора в настройках
Норма

Элемент есть, Использование = Истина, значение заполнено

Тревожный признак

Элемент отсутствует или Использование = Ложь

Результат отчета
Норма

В табличном документе только записи, удовлетворяющие условию

Тревожный признак

Данные не изменились после установки отбора

Доступность поля
Норма

ДоступныеПоляОтбора.НайтиПоле возвращает поле

Тревожный признак

Возвращает Неопределено — поле нельзя использовать в отборе

Ограничения и когда отбор лучше заменить параметрами

Не всякое ограничение данных стоит делать отбором. Если условие участвует в расчете итогов или виртуальных таблиц запроса (остатки на дату, обороты за период), правильнее использовать параметры данных — они передаются внутрь запроса и ускоряют выполнение. Отбор же применяется к уже полученному набору, что на больших объемах может работать медленнее.

Еще одно ограничение — отборы по вычисляемым полям и полям ресурсов работают не всегда так, как ожидает разработчик: ресурс в отборе детальных записей может не быть доступен. В таких случаях условие переносят в запрос схемы или в выражение вычисляемого поля.

Маршрут решения

Как выбрать способ

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

Часто задаваемые вопросы

Почему программно установленный отбор не виден в настройках отчета у пользователя?

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

Как установить отбор по нескольким значениям одного поля?

Используйте вид сравнения ВСписке (или НеВСписке) и передайте в ПравоеЗначение СписокЗначений или массив с нужными ссылками. Несколько отдельных элементов «Равно» дадут условие И, и результат будет пустым.

Как программно очистить все отборы в СКД?

Вызовите метод Очистить() у коллекции Настройки.Отбор.Элементы. Учтите, что это удалит и отборы, заданные в варианте отчета, поэтому чаще очищают только конкретные элементы, найденные по имени поля.

Можно ли установить отбор до открытия формы отчета?

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

Почему отбор по дате работает неправильно?

Чаще всего дата передается без учета времени: условие «Равно» по дате с временем не совпадает с записями за день. Используйте вид сравнения БольшеИлиРавно/Меньше с границами дня или стандартный период через параметры данных.

Итог

Что важно запомнить

Отбор в СКД устанавливается добавлением или изменением элемента в коллекции Отбор настроек компоновщика: поле, вид сравнения, значение и обязательное Использование = Истина. Выбирайте место установки — основные, пользовательские или фиксированные настройки — в зависимости от того, должен ли пользователь видеть и менять фильтр. Проверяйте доступность поля и тип значения: большинство проблем связано именно с этим.