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