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