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

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

Как работает отбор в СКД 1С

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

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

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

Материал рассчитан на разработчиков и внедренцев 1С, которые настраивают отчеты на СКД и хотят управлять отборами осознанно — как в конфигураторе, так и программно из встроенного языка.

Где в СКД задается отбор и как он применяется

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

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

Важно понимать разницу между отбором в запросе (предложение ГДЕ, написанное вручную) и отбором СКД. Условие в запросе жестко зашито и недоступно пользователю, а отбор СКД — динамический, его можно менять в режиме предприятия. Жесткие условия оставляют в запросе только тогда, когда их нельзя отменить никогда: например, отсечение помеченных на удаление объектов в специфических случаях.

Виды отборов: фиксированные, пользовательские и быстрые

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

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

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

Выбор вида отбора

Фиксированный отбор

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

Быстрый отбор

Выведен на форму отчета, меняется одним действием. Подходит для 2–4 самых частых условий; избыток быстрых отборов загромождает форму.

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

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

Виды сравнения и особенности их работы

Для каждого элемента отбора выбирается вид сравнения. Базовые варианты: «Равно», «Не равно», «Больше», «Меньше» и их варианты с «или равно». Для ссылочных полей критичны иерархические виды: «В группе» (элемент и все вложенные в группу), «В иерархии», «В группе из списка». Частая ошибка — использовать «Равно» для папки номенклатуры и удивляться, что товары из подпапок не попали в отчет.

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

Особые виды — «Заполнено» и «Не заполнено»: они проверяют наличие значения без указания конкретного. Это корректный способ отсечь пустые ссылки, вместо сравнения с пустой ссылкой через «Равно», которое для составных типов может вести себя неочевидно.

Типичные ошибки при настройке отборов
01
Использование «Равно» вместо «В группе» для иерархических справочников — из отчета выпадают элементы вложенных папок.
02
Отбор по строковому полю через «Содержит» на большом регистре — отчет формируется минутами, так как индекс не используется.
03
Дублирование условия: одно и то же поле отобрано и в запросе, и в настройках СКД — пользователь отключает видимый отбор, но данные все равно ограничены запросом.
04
Отбор по полю, которого нет в доступных полях схемы — элемент отбора молча игнорируется или выдает ошибку при формировании.
05
Отбор по ресурсу регистра вместо измерения — условие применяется после группировки и дает неожиданные итоги.

Настройка отбора в конструкторе схемы компоновки

Откройте схему компоновки данных отчета, перейдите на закладку «Настройки» и выберите вкладку «Отбор». В левой части находится список доступных полей — они берутся из наборов данных схемы. Перетащите поле в правую часть или добавьте через кнопку, затем задайте вид сравнения и значение. Флажок слева от элемента включает или отключает условие.

Чтобы вывести отбор на форму отчета, выделите элемент и в свойствах установите «Режим отображения» — «Быстрый доступ». Дополнительно можно задать представление — понятное пользователю название вместо технического имени поля, например «Склад отгрузки» вместо «Склад».

Для сложных условий используются группы элементов отбора: «Группа И», «Группа ИЛИ», «Группа НЕ». По умолчанию все элементы объединяются по «И». Если нужен отчет по нескольким складам ИЛИ нескольким контрагентам с независимыми условиями, создайте группу «ИЛИ» и поместите элементы внутрь нее. Вложенность групп не ограничена, но глубокая вложенность затрудняет понимание настроек пользователем.

Как добавить быстрый отбор в отчет
  1. 1
    Откройте схему компоновки данных, закладка «Настройки», вкладка «Отбор».
  2. 2
    Перетащите нужное поле из списка доступных полей в список элементов отбора.
  3. 3
    Установите вид сравнения (для папок — «В группе», для нескольких значений — «В списке»).
  4. 4
    В свойствах элемента задайте режим отображения «Быстрый доступ» и понятное представление.
  5. 5
    Сохраните схему, откройте отчет в режиме предприятия и проверьте, что отбор появился на форме и влияет на результат.

Программная установка отбора из кода

Программно отбор устанавливается через компоновщик настроек отчета. Типовая задача — при открытии отчета из формы документа показать данные только по этому документу или контрагенту. Для этого в модуле формы или в событии «ПриКомпоновкеРезультата» находят структуру настроек и добавляют элемент отбора.

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

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

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

Отбор по периоду и связь с параметрами

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

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

Если отбор по периоду все же делается как элемент отбора по полю «Период», используйте вид сравнения «Больше или равно» и «Меньше или равно» с двумя элементами, объединенными в группу «И». Но помните: для регистров накопления и бухгалтерии правильный путь — параметры виртуальных таблиц, иначе производительность на больших объемах заметно просядет.

Проверка результата и диагностика проблем

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

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

Для анализа итогового запроса полезно временно вывести текст, который СКД передает в СУБД, через консоль компоновки данных или отладку в «ПриКомпоновкеРезультата». Там видно, в какое условие транслировался каждый элемент отбора и не потерялся ли он.

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

Как проверить, что отбор работает

Изменение значения отбора
Норма

Состав строк отчета меняется в соответствии с условием

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

Результат идентичен при любом значении — отбор не применяется

Количество элементов отбора в настройках
Норма

Один элемент на каждое условие

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

Дубликаты одного поля с разными значениями, объединенные по «И»

Уровень установки отбора
Норма

Отбор на уровне отчета влияет на все группировки

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

Отбор стоит на одной группировке и «не работает» для остальных

Поведение кнопки «Стандартные настройки»
Норма

Пользовательские отборы сбрасываются, фиксированные остаются

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

После сброса отчет показывает лишние данные — ограничение было не фиксированным

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

Где разместить ограничение данных

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

Частые вопросы об отборах в СКД

Почему отбор по полю «Период» делает отчет медленным?

Потому что условие применяется к уже выбранным данным, а не на уровне виртуальной таблицы регистра. Правильное решение — параметры «НачалоПериода» и «КонецПериода» в параметрах виртуальной таблицы запроса: тогда СУБД сразу читает только нужный диапазон, что на больших регистрах дает кратное ускорение.

Как запретить пользователю отключать отбор?

Установите элемент отбора в фиксированных настройках компоновщика (ФиксированныеНастройки.Отбор) или задайте ему режим отображения «Недоступный». Такой элемент не появится в пользовательских настройках и не будет сброшен кнопкой возврата к стандартным настройкам.

Чем «В группе» отличается от «В иерархии»?

«В группе» проверяет принадлежность элемента указанной группе с учетом вложенных подгрупп и применяется к иерархическим справочникам с иерархией групп. «В иерархии» проверяет подчиненность по цепочке родителей и подходит для иерархии элементов. Выбор зависит от вида иерархии конкретного справочника.

Можно ли в одном отчете объединить условия по «ИЛИ»?

Да. Добавьте в отбор «Группу ИЛИ» и поместите в нее нужные элементы — достаточно выполнения любого из условий группы. Группы можно вкладывать друг в друга, комбинируя «И», «ИЛИ» и «НЕ» для построения сложной логики.

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

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

Как отобрать записи, где поле не заполнено?

Используйте вид сравнения «Не заполнено» — он корректно обрабатывает пустые ссылки, пустые строки и значения NULL. Сравнение с пустой ссылкой через «Равно» для составных типов данных может не дать ожидаемого результата.

Итог

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

Отбор СКД задается в настройках компоновки и применяется платформой при формировании отчета. Выбирайте вид отбора по роли условия: фиксированный — для обязательных ограничений, быстрый — для частых пользовательских фильтров. Для иерархии используйте «В группе», для периодов — параметры виртуальных таблиц, а программные отборы добавляйте с проверкой на дубликаты.