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