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