Получить консультацию

Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля

В этой статье речь пойдет о достаточно редкой ошибке, которая может встретиться при работе с отчетами на СКД или динамическими списками. Дословно текст ошибки такой: “Ошибка в элементе отбора глобальные элементы отбора обязательно должны использовать поля“. Что это значит, как воспроизвести и как исправить?

Содержание

Немного об устройстве отбора в СКД

Начну издалека. В настройках системы компоновки данных есть объект Отбор, с типом ОтборКомпоновкиДанных. И его элементы представляют собой либо группы, либо отдельные элементы отбора.

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

динамический список глобальные элементы отбора

Внимание! На момент написания публикации, указанная на скриншоте выше настройка динамического списка приводит к падению платформы.
На скриншоте видно, что первая строка отбора содержит ПолеКомпоновкиДанных(“Номер”) в левом значении, а у второй строки и левое и правое значение – это конкретные даты.
Для объекта с типом ДинамическийСписок указание в левом значении любого значения, кроме какого-либо поля компоновки данных, приводит к вылету платформы. Но только при включенном флажке “Использование”!

Причина возникновения ошибки

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

Отличие отбора в динамическом списке и СКД

В системе компоновки данных отбор можно задавать отдельно на каждом уровне структуры отчета например, у нас может быть отчет по продажам с группировками Контрагент >> Номенклатура >> Детальные записи. И на каждую группировку мы можем наложить свой отбор.
В динамическом списке отбор накладывается всегда на корневой элемент структуры – т.е. элементы отбора динамического списка всегда будут глобальные.

Воспроизводим ошибку в коде для динамического списка

В приведенном ниже фрагменте кода мы намеренно присваиваем левому значению число 10, а правому значению – булево значение Ложь. Важно понимать, что должны быть соблюдены условия, что именно оба поля не являются полями с типом ПолеКомпоновкиДанных.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ПолеРодитель = Новый ПолеКомпоновкиДанных("Родитель");
	
	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = 10;
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	ЭлементОтбора.Использование = Истина;
	
КонецПроцедуры

Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля - как исправить?

Возможны два варианта – нужно чтобы как минимум либо ЛевоеЗначение, либо ПравоеЗначение имело тип ПолеКомпоновкиДанных.
Например:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ПолеЭтоГруппа = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
	
	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = ПолеЭтоГруппа;
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	ЭлементОтбора.Использование = Истина;
	
КонецПроцедуры

Но и наоборот также будет работать!

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ПолеЭтоГруппа = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
	
	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Ложь;
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = ПолеЭтоГруппа;
	ЭлементОтбора.Использование = Истина;
	
КонецПроцедуры

Воспроизводим ошибку в настройках СКД

  1. Возьмем любой отчет, использующий систему компоновки данных, и откроем настройки.
  2. Перейдем на закладку Отбор, и добавим новую строку. Далее у нас есть два варианта, приводящих к ошибке.
  3. В качестве левого значения укажем поле из имеющихся параметров данных, например ПараметрыДанных.НачалоПериода. В качестве правого значения укажем конкретную дату.
    Второй вариант – в качестве левого и правого значения укажем что-нибудь, не являющееся полем компоновки данных: Дату, Строку, Булево или Число. Т.е. конкретные значения.
  4. В пользовательском режиме укажем какое-нибудь значение параметра и попробуем сформировать отчет.
  5. Получим ошибку: “глобальные элементы отбора обязательно должны использовать поля
СКД глобальные элементы отбора обязательно должны использовать поля
Ошибка глобальные элементы отбора обязательно должны использовать поля

Однако, если мы перенесем эти же элементы отбора не на уровень отчета, а на уровень любой группировки, то отчет будет работать корректно!

1с глобальные элементы отбора обязательно должны использовать поля

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

3 × четыре =

К НАЧАЛУ