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

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

1С СКД: программная установка значения отбора

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

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

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

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

Где искать отбор: структура настроек компоновщика

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

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

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

Базовый способ: установка отбора в основных настройках

Если отчёт формируется программно или отбор должен быть скрытым и фиксированным, работайте напрямую с коллекцией Настройки.Отбор.Элементы. Типовой код для отчёта, созданного как объект (не через типовую форму):

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

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

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

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

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

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

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

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

Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")

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

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

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

Прервать;

КонецЕсли;

КонецЦикла;

Обратите внимание: свойство Использование обязательно должно быть установлено в Истина. Элемент отбора с правильным значением, но с выключенным использованием, просто не участвует в формировании отчёта — это одна из самых частых причин «отбор установил, а не работает».

Установка отбора в пользовательских настройках

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

Работа с пользовательскими настройками отличается тем, что элементы адресуются по идентификатору ИдентификаторПользовательскойНастройки, а не по индексу. Типовой приём — перебрать элементы и найти нужный по полю:

Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда

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

Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура") Тогда

ЭлементОтбора.ПравоеЗначение = НоменклатураСсылка;

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

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

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

Установка отбора при открытии отчёта извне

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

Приём с передачей готовых настроек: сформируйте компоновщик настроек на стороне вызывающего кода, установите отбор и передайте настройки в параметре формы. В модуле формы отчёта в обработчике ПриСозданииНаСервере примените переданные настройки к компоновщику отчёта:

// В вызывающем коде

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Новый Структура("Контрагент", КонтрагентСсылка));

ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

ОткрытьФорму("Отчет.ПродажиПоКонтрагентам.Форма", ПараметрыФормы);

Для отчётов, подключённых к подсистеме «Варианты отчётов» БСП, параметр Отбор обрабатывается типовым механизмом автоматически: значения из структуры подставляются в соответствующие элементы отбора. Для самописных форм обработку параметра нужно реализовать самостоятельно — найти элемент отбора и установить значение одним из способов, описанных выше.

Если отчёт должен сформироваться сразу при открытии, используйте параметр СформироватьПриОткрытии (в отчётах на БСП он поддерживается штатно). В собственных формах вызовите процедуру формирования в конце обработчика создания формы.

Программное формирование отчёта без формы

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

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

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

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

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

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

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

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

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

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

ЭлементОтбора.ПравоеЗначение = КонтрагентСсылка;

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

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

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

Тонкости: виды сравнения, типы значений и группы отбора

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

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

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

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

Проверка результата и отладка

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

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

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

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

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

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

Использование = Истина, ПравоеЗначение заполнено нужной ссылкой

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

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

Результат формирования
Норма

В отчёт попали только строки, удовлетворяющие условию

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

Данные не отфильтрованы или отчёт пуст при заведомо существующих данных

Повторное открытие формы
Норма

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

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

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

FAQ

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

Используйте вид сравнения ВСписке и передайте в ПравоеЗначение объект СписокЗначений, заполненный нужными ссылками. Не добавляйте несколько отдельных элементов с видом «Равно» — они объединятся по «И», и условие станет невыполнимым.

Почему отбор сбрасывается при повторном открытии отчёта?

Скорее всего, вы изменили основные настройки компоновщика, а форма при открытии загружает сохранённые пользовательские настройки и перезаписывает ваши изменения. Устанавливайте значение через ПользовательскиеНастройки.Элементы или передавайте отбор параметром формы при каждом открытии.

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

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

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

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

Как найти элемент отбора, если в настройках есть вложенные группы?

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

Итог

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

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