В этой статье речь пойдет о достаточно редкой ошибке, которая может встретиться при работе с отчетами на СКД или динамическими списками. Дословно текст ошибки такой: “Ошибка в элементе отбора глобальные элементы отбора обязательно должны использовать поля“. Что это значит, как воспроизвести и как исправить?
Содержание
Немного об устройстве отбора в СКД
Начну издалека. В настройках системы компоновки данных есть объект Отбор, с типом ОтборКомпоновкиДанных. И его элементы представляют собой либо группы, либо отдельные элементы отбора.
У каждого элемента отбора СКД есть несколько основных свойств: Левое значение, Правое значение, Вид сравнения и Использование. Как в левом, так и в правом значениях можно указать либо поле компоновки данных, либо конкретное значение.
Внимание! На момент написания публикации, указанная на скриншоте выше настройка динамического списка приводит к падению платформы.
На скриншоте видно, что первая строка отбора содержит ПолеКомпоновкиДанных(“Номер”) в левом значении, а у второй строки и левое и правое значение – это конкретные даты.
Для объекта с типом ДинамическийСписок указание в левом значении любого значения, кроме какого-либо поля компоновки данных, приводит к вылету платформы. Но только при включенном флажке “Использование”!
Причина возникновения ошибки
Суть ошибки сводится к тому, что в корневом элементе отбора присутствуют строки, у которых и ЛевоеЗначение и ПравоеЗначение не имеют тип ПолеКомпоновкиДанных. И в подавляющем большинстве случаев это возникает из-за неверной программной установки отбора. Но тем не менее, и через настройки в конфигураторе эту ошибку также можно воспроизвести.
Отличие отбора в динамическом списке и СКД
В системе компоновки данных отбор можно задавать отдельно на каждом уровне структуры отчета например, у нас может быть отчет по продажам с группировками Контрагент >> Номенклатура >> Детальные записи. И на каждую группировку мы можем наложить свой отбор.
В динамическом списке отбор накладывается всегда на корневой элемент структуры – т.е. элементы отбора динамического списка всегда будут глобальные.
Воспроизводим ошибку в коде для динамического списка
В приведенном ниже фрагменте кода мы намеренно присваиваем левому значению число 10, а правому значению – булево значение Ложь. Важно понимать, что должны быть соблюдены условия, что именно оба поля не являются полями с типом ПолеКомпоновкиДанных.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПолеРодитель = Новый ПолеКомпоновкиДанных("Родитель"); ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = 10; ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Ложь; ЭлементОтбора.Использование = Истина; КонецПроцедуры
Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля - как исправить?
Возможны два варианта – нужно чтобы как минимум либо ЛевоеЗначение, либо ПравоеЗначение имело тип ПолеКомпоновкиДанных.
Например:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПолеЭтоГруппа = Новый ПолеКомпоновкиДанных("ЭтоГруппа"); ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = ПолеЭтоГруппа; ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Ложь; ЭлементОтбора.Использование = Истина; КонецПроцедуры
Но и наоборот также будет работать!
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПолеЭтоГруппа = Новый ПолеКомпоновкиДанных("ЭтоГруппа"); ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Ложь; ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = ПолеЭтоГруппа; ЭлементОтбора.Использование = Истина; КонецПроцедуры
Воспроизводим ошибку в настройках СКД
- Возьмем любой отчет, использующий систему компоновки данных, и откроем настройки.
- Перейдем на закладку Отбор, и добавим новую строку. Далее у нас есть два варианта, приводящих к ошибке.
- В качестве левого значения укажем поле из имеющихся параметров данных, например ПараметрыДанных.НачалоПериода. В качестве правого значения укажем конкретную дату.
Второй вариант – в качестве левого и правого значения укажем что-нибудь, не являющееся полем компоновки данных: Дату, Строку, Булево или Число. Т.е. конкретные значения. - В пользовательском режиме укажем какое-нибудь значение параметра и попробуем сформировать отчет.
- Получим ошибку: “глобальные элементы отбора обязательно должны использовать поля“
Однако, если мы перенесем эти же элементы отбора не на уровень отчета, а на уровень любой группировки, то отчет будет работать корректно!
В динамическом списке такую настройку произвести невозможно – как уже говорил выше, конфигуратор при попытке сохранить настройки вылетает. В пользовательском режиме с нуля такие настройки тоже воспроизвести нельзя – только если они изначально заданы в конфигураторе.