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

В таких случаях разработчики прибегают к программной установке отборов. Это позволяет фильтровать записи на лету, скрывать служебные данные или реализовывать сложные сценарии безопасности. В этой статье мы подробно разберем, как корректно сформировать структуру отбора, добавить нужные элементы и избежать типичных ошибок при работе с объектом Отбор.

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

Архитектура объекта Отбор в СКД

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

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

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

Структура данных позволяет создавать вложенные группы. Это означает, что вы можете объединить несколько условий с помощью логического И или ИЛИ. Такая возможность незаменима, когда требуется реализовать сложную бизнес-логику, например, "Показать товары, у которых остаток больше нуля ИЛИ которые являются новыми, НО только для склада 'Основной'".

⚠️ Внимание: При программном добавлении элементов в коллекцию отборов убедитесь, что вы не дублируете условия, которые уже могут быть заданы пользователем через форму настроек. Это может привести к конфликтам логики и unexpected results.

💡

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

Базовый алгоритм добавления условия

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

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

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

Код ниже демонстрирует классическую последовательность действий. Обратите внимание на использование констант перечисления ИспользованиеОтбора и ВидСравнения. Это гарантирует кроссплатформенную совместимость и читаемость кода.

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

Компоновщик.Load(СхемаКомпоновкиДанных);

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

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

НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДвижения");

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

НовыйЭлемент.ПравоеЗначение = Перечисления.ВидыДвиженияДенежныхСредств.Расход;

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

☑️ Алгоритм создания отбора

Выполнено: 0 / 5

Работа с группами и логическими операторами

Когда простого условия недостаточно, на сцену выходят группы отборов. Они позволяют комбинировать несколько фильтров. В 1С группа отбора — это тоже элемент коллекции, но у него есть вложенная коллекция Отбор. Это создает рекурсивную структуру, глубина которой ограничена лишь здравым смыслом и производительностью.

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

Использование групп особенно актуально при построении отчетов для руководителей, где требуется видеть картину в разрезе нескольких критериев. Например, отбор по периоду И (ответственный = Иванов ИЛИ ответственный = Петров П.). Реализация такой логики требует внимательного подхода к вложенности элементов.

При программном формировании таких структур код может стать громоздким. Рекомендуется выносить логику формирования сложных отборов в отдельные функции или процедуры. Это упростит отладку и сделает код более поддерживаемым в будущем.

Пример кода для группы ИЛИ

Группа = Отбор.Добавить(); Группа.Использование = Истина; Группа.Группировка = ГруппировкаОтбораКомпоновкиДанных.ИЛИ; Элемент1 = Группа.Отбор.Добавить(); Элемент1.ЛевоеЗначение = ...; Элемент2 = Группа.Отбор.Добавить(); Элемент2.ЛевоеЗначение = ...;

Специфика работы с периодами и диапазонами

Одной из самых частых задач является фильтрация по датам. В отличие от простых равенств, здесь часто используются диапазоны значений. В СКД это реализуется через виды сравнения БольшеИлиРавно и МеньшеИлиРавно, либо через специальные типы отборов, если они предусмотрены схемой.

При работе с периодами важно учитывать тип данных поля. Если поле имеет тип Дата, то сравнение будет проводиться с точностью до времени, если не указано иное. Частой ошибкой является ситуация, когда пользователь выбирает дату "01.01.2026", а в базе данные записаны как "01.01.2026 12:30:00". Простое условие "Меньше" может отсечь нужные записи.

Для решения этой проблемы рекомендуется использовать специальные функции работы с датой в выражениях отбора или явно указывать время в правом значении. Например, устанавливать конец периода как "31.01.2026 23:59:59". Это гарантирует попадание всех записей последнего дня в выборку.

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

Вид сравнения Описание логики Тип правого значения Пример использования
Равно Точное совпадение Любой совместимый Контрагент = "ООО Ромашка"
В списке Вхождение в перечень Массив значений Статус в (Новый, В работе)
Больше Строго больше Число, Дата Сумма > 10000
Подобно По маске (LIKE) Строка Наименование подобно "%Альфа%"

⚠️ Внимание: При использовании вида сравнения "В списке" убедитесь, что правое значение передано именно как массив. Передача строки или другого типа вызовет ошибку выполнения при формировании отчета.

📊 С каким типом отборов вы сталкиваетесь чаще всего?
Простые равенства
Диапазоны дат
Сложные группы И/ИЛИ
Отборы по строкам (подобно)
Не использую программные отборы

Обработка ошибок и отладка настроек

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

Для диагностики проблем рекомендуется использовать режим отладки 1С. Точки останова следует ставить перед вызовом метода КомпоноватьНастройки. В этот момент можно.inspectровать коллекцию Отбор и убедиться, что все элементы имеют корректные значения и свойство Использование установлено в Истина.

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

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

💡

Всегда проверяйте соответствие типов данных в левом и правом значении отбора. Неявные приведения типов в СКД работают не во всех сценариях и могут приводить к пустым результатам.

Частые вопросы разработчиков (FAQ)

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

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

Можно ли сделать программный отбор скрытым от пользователя?

Да, это возможно. Для этого у элемента отбора нужно установить свойство ПользовательскаяНастройка в значение Ложь. В этом случае условие будет применяться при формировании, но не будет отображаться на вкладке "Настройки" в интерфейсе отчета.

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

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

Как передать в отбор значение из формы отчета?

Вам нужно получить значение из элемента формы (например, ЭлементыФормы.МойПоле.Значение) и присвоить его свойству ПравоеЗначение элемента отбора. Убедитесь, что тип полученного значения совместим с типом поля, по которому идет фильтрация.