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

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

Как программно установить отбор в отчете 1С

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

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

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

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

Как устроен отбор в отчете на СКД

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

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

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

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

Если отчет открыт в форме, настройки доступны через реквизит формы Отчет. Типовой код установки отбора по организации выглядит так:

Процедура УстановитьОтборПоОрганизации(Организация)

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

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

ЭлементОтбора = Неопределено;

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

Если Элемент.ЛевоеЗначение = ПолеОтбора Тогда

ЭлементОтбора = Элемент;

Прервать;

КонецЕсли;

КонецЦикла;

Если ЭлементОтбора = Неопределено Тогда

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

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

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

КонецЕсли;

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

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

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

КонецПроцедуры

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

Если отбор нужно скрыть от пользователя, чтобы он не мог его снять, установите ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный. Это используют, когда отбор определяется правами доступа или контекстом вызова.

Порядок действия в форме отчета
  1. 1
    Получите настройки: Отчет.КомпоновщикНастроек.Настройки
  2. 2
    Найдите элемент отбора по полю или добавьте новый
  3. 3
    Задайте ВидСравнения, ПравоеЗначение и Использование = Истина
  4. 4
    При необходимости ограничьте видимость элемента через РежимОтображения
  5. 5
    Вызовите пересборку отчета и проверьте результат

Установка отбора при формировании без формы

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

Схема = Отчеты.ПродажиПоМенеджерам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));

Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);

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

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

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

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

ЭлементОтбора.ПравоеЗначение = СписокМенеджеров;

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

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

Макет = КомпоновщикМакета.Выполнить(Схема, Компоновщик.ПолучитьНастройки());

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

Процессор.Инициализировать(Макет);

Результат = Новый ТабличныйДокумент;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(Процессор);

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

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

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

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

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

ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("НачалоПериода"));

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

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

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

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

Элемент отбора в настройках

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

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

Работает быстрее для периодов и параметров виртуальных таблиц, но применим только к полям, объявленным параметрами в схеме.

Пользовательские настройки

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

Типичные ошибки и ограничения

Самая распространенная ошибка — установка отбора до загрузки настроек схемы или до инициализации компоновщика. В этом случае добавленный элемент либо теряется при загрузке настроек по умолчанию, либо поле оказывается недоступным. Всегда соблюдайте порядок: инициализация → загрузка настроек → установка отбора → получение настроек → компоновка.

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

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

Типичные ошибки
01
Забыли поставить Использование = Истина — отбор есть, но в запрос не попадает, отчет показывает все данные
02
Установили отбор до загрузки настроек схемы — элемент перезаписан настройками по умолчанию
03
Передали одиночное значение при виде сравнения ВСписке — пустой результат или ошибка компоновки
04
Неверный путь к полю (например, Менеджер вместо Заказ.Менеджер) — отбор не находится и не применяется
05
Отбор по полю, не добавленному в доступные поля отбора схемы — ошибка недоступности поля

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

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

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

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

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

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

Отображение отбора в настройках формы
Норма

Элемент виден, флажок использования включен, значение корректное

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

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

Данные в результате отчета
Норма

Только строки, удовлетворяющие условию

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

Лишние строки или пустой отчет при заведомо существующих данных

Запрос в макете компоновки
Норма

В тексте запроса есть условие по нужному полю

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

Условия нет — отбор потерян на этапе настроек

Особенности для обычных форм и внешних отчетов

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

Для внешних отчетов (.erf) схема получается через ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных") так же, как у встроенных отчетов. Если внешний отчет подключен через механизм дополнительных отчетов и обработок (БСП), программную установку параметров и отборов удобнее выполнять в обработчике ПриКомпоновкеРезультата или через переопределяемые процедуры модуля.

FAQ

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

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

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

Используйте вид сравнения ВСписке или НеВСписке и передайте в ПравоеЗначение список значений или массив. Одиночное значение при таком виде сравнения приводит к пустому результату или ошибке.

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

Да. Установите элементу отбора РежимОтображения = Недоступный. Элемент перестанет отображаться в пользовательских настройках, но продолжит применяться при формировании.

Чем отличается параметр от элемента отбора?

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

Как установить отбор в отчете, который формируется регламентным заданием?

Создайте компоновщик настроек вручную, инициализируйте его источником доступных настроек схемы, загрузите настройки по умолчанию, добавьте элементы отбора, затем передайте Компоновщик.ПолучитьНастройки() в компоновщик макета.

Отбор по полю не устанавливается с ошибкой недоступности поля. Что делать?

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