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

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

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

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

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

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

Примеры приведены для управляемых форм и тонкого клиента — это актуальный контекст большинства конфигураций. Код работает как в типовых решениях (Бухгалтерия, Управление торговлей, ERP), так и в самописных отчетах на СКД.

Где в СКД хранятся отборы и почему это важно

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

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

Базовый код: добавить простой отбор по значению

Минимальный рабочий пример — установить отбор по организации в отчете, открытом программно или сформированном в фоне. Код выполняется в модуле формы отчета, обработки или общем модуле, где доступен объект отчета.

ОтчетОбъект = Отчеты.ПродажиПоМесяцам.Создать();

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

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

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

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

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

НовыйОтбор.ПравоеЗначение = ОрганизацияСсылка;

НовыйОтбор.Использование = Истина;

НовыйОтбор.РежимОтображения =

РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

Обратите внимание на три обязательных свойства: ЛевоеЗначение всегда создается как объект ПолеКомпоновкиДанных с именем поля из схемы компоновки, ВидСравнения берется из системного перечисления, ПравоеЗначение должно соответствовать типу поля — иначе отбор молча не сработает или отчет вернет пустой результат.

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

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

Как установить отбор по периоду

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

ПараметрыДанных = Настройки.ПараметрыДанных;

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

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

Если ПараметрНачало <> Неопределено Тогда

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

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

КонецЕсли;

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

Типичные ошибки при установке периода
01
Граница конца периода задана началом дня — данные последнего дня теряются
02
Отбор по дате добавлен, когда в отчете уже есть параметры периода — условия конфликтуют или дублируются
03
Параметр не найден по имени, потому что в схеме он называется иначе — код отрабатывает без ошибки, но период не применяется

Отбор по списку значений и сложные условия

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

СписокСкладов = Новый СписокЗначений;

СписокСкладов.Добавить(СкладОсновной);

СписокСкладов.Добавить(СкладРозничный);

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

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

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

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

НовыйОтбор.ПравоеЗначение = СписокСкладов;

НовыйОтбор.Использование = Истина;

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

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

Равно / НеРавно

Точное совпадение с одним значением. Подходит для ссылок, строк, чисел

ВСписке / НеВСписке

Проверка вхождения в СписокЗначений. Не работает с массивом — только со списком значений

ВИерархии

Отбор по группе справочника с учетом всех вложенных элементов. Значение — ссылка на группу

Содержит / НачинаетсяС

Для строковых полей. Поиск подстроки, медленнее точного сравнения на больших объемах

Как сделать отбор видимым для пользователя

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

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

НовыйОтбор.РежимОтображения =

РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;

НовыйОтбор.ИдентификаторПользовательскойНастройки =

Строка(Новый УникальныйИдентификатор);

Если отбор служебный (например, ограничение по правам доступа текущего пользователя), наоборот установите РежимОтображения = Недоступный и не выносите его в пользовательские настройки — тогда пользователь не сможет случайно снять ограничение и увидеть лишние данные.

Типичные ошибки и как их диагностировать

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

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

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

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

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

Элемент добавлен в настройки
Норма

В отладчике Настройки.Отбор.Элементы содержит новый элемент с Использование = Истина

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

Элемент есть, но Использование = Ложь или элемент отсутствует

Поле доступно для отбора
Норма

Поле находится в ДоступныеПоляОтбора с текущим именем

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

Поля нет в списке — имя указано с ошибкой или поле не выведено в схеме

Результат отчета
Норма

Данные соответствуют условию, совпадают с ручной настройкой отбора

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

Отчет пуст или содержит лишние строки

Проверка результата и границы самостоятельной работы

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

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

Итог

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

Отбор добавляется в коллекцию Настройки.Отбор.Элементы компоновщика настроек: создайте ЭлементОтбораКомпоновкиДанных, задайте поле, вид сравнения и значение, включите Использование. Период в типовых отчетах обычно задается параметрами, а не отбором. Перед добавлением проверяйте дубли, после — сверяйте результат с ручной настройкой.

Частые вопросы

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

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

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

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

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

Передайте значения через параметры формы: при вызове ОткрытьФорму("Отчет.ИмяОтчета.Форма", ПараметрыФормы) добавьте в структуру параметров ключ Отбор (структура с полями) и признак СформироватьПриОткрытии = Истина. В типовых конфигурациях на БСП стандартная форма отчета сама преобразует параметр Отбор в настройки компоновки.

Чем отличается отбор в фиксированных настройках от обычного?

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

Можно ли добавить отбор в отчет, построенный без СКД?

Если отчет построен на произвольном запросе с выводом в табличный документ, механизм отборов СКД недоступен. Отбор реализуется через параметры запроса: условия добавляются в текст запроса (в том числе динамически, через конкатенацию строк с проверкой), а значения передаются через Запрос.УстановитьПараметр().

Как сохранить программно установленные отборы, чтобы они применялись при следующем открытии?

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