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

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

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

Как программно добавить отбор в СКД 1С: работа с настройками компоновщика, пользовательскими настройками, параметрами. Примеры кода, ошибки и FAQ.

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

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

Ниже разобраны рабочие способы: добавление отбора через компоновщик настроек, через пользовательские настройки, установка параметров, а также типичные ошибки, из-за которых отбор «молча» не срабатывает.

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

Отборы в СКД существуют на нескольких уровнях. На уровне схемы компоновки отбор может быть задан в варианте настроек — он станет «жёстким» по умолчанию. На уровне компоновщика настроек отбор доступен пользователю на вкладке «Отбор» формы отчёта. Наконец, пользовательские настройки — это быстрые элементы, выведенные прямо в шапку формы.

Программно чаще всего работают с объектом КомпоновщикНастроек, доступным в форме отчёта через Отчет.КомпоновщикНастроек. Его свойство Настройки содержит коллекцию Отбор.Элементы, куда и добавляются новые элементы. Важно: если отчёт уже сформирован, изменение настроек само по себе отчёт не перестроит — нужно вызвать перекомпоновку или сформировать отчёт заново.

Добавление отбора через компоновщик настроек

Базовый сценарий — добавить элемент отбора в коллекцию Настройки.Отбор.Элементы. Элемент создаётся с типом ЭлементОтбораКомпоновкиДанных, после чего заполняются его свойства.

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

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

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

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

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

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

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

Ключевые свойства элемента: ЛевоеЗначение — поле данных, по которому фильтруем (имя должно точно совпадать с именем поля в наборе данных схемы); ВидСравнения — операция (Равно, ВСписке, Содержит, БольшеИлиРавно и др.); ПравоеЗначение — значение отбора; Использование — включён ли элемент. Если Использование не установить в Истина, отбор появится в списке, но применяться не будет.

Для отбора по списку значений используйте вид сравнения ВСписке и передавайте в ПравоеЗначение объект СписокЗначений. Для периодов удобнее вид сравнения БольшеИлиРавно / Меньше по полю даты либо стандартный параметр периода.

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

Поиск и изменение существующего отбора

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

ИскомоеПоле = Новый ПолеКомпоновкиДанных("Организация");

Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл

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

И Элемент.ЛевоеЗначение = ИскомоеПоле Тогда

Элемент.ПравоеЗначение = НовоеЗначение;

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

КонецЕсли;

КонецЦикла;

Обратите внимание: в коллекции могут встречаться группы отборов (ГруппаЭлементовОтбораКомпоновкиДанных), поэтому при сложной структуре поиск делают рекурсивным. Попытка обратиться к свойству ЛевоеЗначение у группы вызовет ошибку — всегда проверяйте тип элемента.

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

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

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

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

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

И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад") Тогда

Элемент.ПравоеЗначение = ВыбранныйСклад;

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

КонецЕсли;

КонецЦикла;

Такой подход корректен при открытии отчёта с параметрами: пользователь видит установленное значение и может его изменить. Если же вы хотите «зашить» отбор так, чтобы пользователь не мог его снять, добавляйте элемент только в основные настройки и не выводите его в пользовательские — либо ограничивайте доступность поля в настройках варианта.

Установка параметров вместо отбора

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

Параметр = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");

Если Параметр <> Неопределено Тогда

Параметр.Значение = НачалоМесяца(ТекущаяДатаСеанса());

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

КонецЕсли;

Критерий выбора прост: если фильтрация зашита в текст запроса набора данных через параметр — используйте параметр; если поле просто доступно в настройках — используйте отбор. Отбор по полю, которого нет в доступных полях варианта, приведёт к ошибке компоновки.

Сравнение вариантов

Отбор в основных настройках

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

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

Подходит, когда значение задаётся при открытии, но пользователь должен иметь возможность его изменить

Параметр данных

Подходит для периодов и ограничений, зашитых в запрос; работает быстрее, но требует наличия параметра в схеме

Группы отборов и сложные условия

Когда нужно условие вида «(А И Б) ИЛИ В», отдельных элементов недостаточно — создают группу. Группа добавляется с типом ГруппаЭлементовОтбораКомпоновкиДанных, у неё задаётся ТипГруппы (ГруппаИ, ГруппаИли, ГруппаНе), а элементы добавляются уже в коллекцию Элементы этой группы.

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

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

ГруппаИли.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

ГруппаИли.Использование = Истина;

Элемент1 = ГруппаИли.Элементы.Добавить(

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

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

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

Элемент1.ПравоеЗначение = Перечисления.Статусы.Закрыт;

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

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

Проверка результата и отладка

После установки отбора сформируйте отчёт и проверьте, что данные действительно ограничены. Быстрый способ убедиться, что отбор попал в итоговые настройки, — открыть окно настроек отчёта (кнопка «Настройки») и посмотреть вкладку «Отбор»: добавленные элементы должны быть там с установленными флажками.

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

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

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

Элемент в окне настроек отчёта
Норма

Отбор виден на вкладке Отбор с включённым флажком

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

Элемента нет или флажок снят — отбор не применяется

Данные в отчёте
Норма

Строки ограничены заданным условием

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

Данные не изменились — отчёт формировался до установки отбора или имя поля неверно

Повторное открытие отчёта
Норма

Отбор сохраняется или устанавливается заново кодом

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

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

Частые вопросы

Почему отбор добавлен, но отчёт выводит все данные?

Чаще всего не установлено свойство Использование = Истина у элемента отбора, либо отчёт не был переформирован после изменения настроек. Также проверьте, не загружаются ли после вашего кода сохранённые пользовательские настройки, которые отключают элемент.

Как задать отбор по списку значений?

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

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

Вызовите метод Настройки.Отбор.Элементы.Очистить(). Учтите, что это удалит и отборы, заданные в варианте отчёта; если нужно удалить только программно добавленные, запоминайте ссылки на созданные элементы или помечайте их через РежимОтображения.

Чем отбор отличается от параметра в СКД?

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

Как установить отбор при открытии отчёта из другой формы?

Передайте значения через параметры формы отчёта, а в обработчике ПриСозданииНаСервере формы отчёта прочитайте их и установите элементы отбора или параметры данных. Так отчёт сформируется один раз уже с нужными ограничениями.

Почему возникает ошибка «Поле не найдено»?

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

Итог

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

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