Скд ошибка в элементе отбора

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

Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если кому интересно, нашел выход в том, чтобы отбор с обращением к параметрам делать не в глобальной ветке «Отчет», а на уровне первой группировки. То есть щелкаем на первую после «Отчета» группировку, В заголовке «Настройки» переходим с «Отчет» на «<Имя нашей группировки>», и для неё ставим отбор.

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

Цитата
Сообщение от polax
Посмотреть сообщение

В настройках указываете нужный параметр

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

Добавлено через 3 минуты

Цитата
Сообщение от polax
Посмотреть сообщение

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

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

Добавлено через 15 секунд

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

к сожалению это работает только в УФ, в ОФ так не получится(((

Здрасте , почему?

Добавлено через 8 минут

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

1. Параметры в запросе

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

Добавлено через 7 минут

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

2. Параметры в СКД

Этот пункт тоже прояснил ситуацию, спасибо, единственно хотелось бы уточнить. Если в запросе участвую Голые даты, а мне бы хотелось, что бы мой отчет работал строго по конец Даты окончания, те до 23.59.59 могу я в СКД в параметрах задать Дату не как Дата Время, а в формате Дата и написать формулу КонецПериода(&КонецПериода,»День»), так будет работать. В запросе параметр как Дата Время, а в СКД Дата с функцией КонецПериода? Или получится каша?

Добавлено через 15 секунд

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

2. Параметры в СКД

Этот пункт тоже прояснил ситуацию, спасибо, единственно хотелось бы уточнить. Если в запросе участвую Голые даты, а мне бы хотелось, что бы мой отчет работал строго по конец Даты окончания, те до 23.59.59 могу я в СКД в параметрах задать Дату не как Дата Время, а в формате Дата и написать формулу КонецПериода(&КонецПериода,»День»), так будет работать. В запросе параметр как Дата Время, а в СКД Дата с функцией КонецПериода? Или получится каша?

Добавлено через 2 минуты

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

установки периода через одну переменную

это я примерно представвляю, но это пока не нужно, но спасибо, буду иметь в виду, что как-то так можно)

Добавлено через 1 минуту

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Сообщение было отмечено Andrey102019 как решение

Это что обозначает?

Добавлено через 1 минуту

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

(параметры указываются в фигурных скобочках)

это я знаю по курсам, пока правда не применял на практике, но тоже спасибо за доп. объяснение

Добавлено через 9 минут

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

4. Отборы в СКД — вообще штука ОГОНЬ

а вот про Огонь, хотелось бы немного подробнее, пока из вашего ответа ясно далеко не все.

накладывает в запросе фильтр на ВСЕ ОДНОИМЕННЫЕ поля отбора во всех временных таблицах

Я понимаю это так, что отборы в самом запросе, это условие ГДЕ. В литературе пишут, что производительнее для системы наложить ограничение через параметры, так как это ограничивает сам запрос и он становится легче и меньше нагружает систему 1С. Отбор это фильтр и он фильтрует уже полученные ранее данные по запросу. В чем тут тогда заключается Огонь? И второй вопрос к этому пункту, СКД оптимизирует все запросы, не получится так, что СКД исправит все фильтры на параметры и результат будет не предсказуемый? Мне после прочтения литературы показалось, что параметры более предпочтительны в СКД, а отборы могут понадобиться только пользователю для получения вариантов отчетов, по первичному запросу в СКД. Но вы практик, вам виднее, можете пояснить этот пункт?



0



Подскажите, пожалуйста, по такой проблеме: Отчет в СКД. Ставлю отбор, например: 1 = 1 (т.е. левое значение типа число, правое значение тип число). При выполнении получаю ошибку: «Ошибка в элементе отбора: глобальные элементы обязательно должны использовать поля «1 Равно 1». С  чем это может быть связано? Отбор с единицами приведен для примера.

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

либо левое значение, либо правое

Да, понял. Но в другом отчете получилось использовать в отборе параметры. Типа «Параметры.Имя Не заполнено»

Если кому интересно, нашел выход в том, чтобы отбор с обращением к параметрам делать не в глобальной ветке «Отчет», а на уровне первой группировки. То есть щелкаем на первую после «Отчета» группировку, В заголовке «Настройки» переходим с «Отчет» на «<Имя нашей группировки>», и для неё ставим отбор. У меня была задача вывода через СКД внешней таблицы (соответственно отбор при получении данных не сделать), и нужно было упростить пользователю работу с  параметрами. Делал такое условие отбора, что если пользователь оставил параметр пустым, выбираются все данные. Если что-то ввел — отбор по значению параметра.

это попытка избавится от галки «использование»?

просто ставь галку «Использование» в зависимости от значения поля, откуда берешь параметр

Тэги: 1С 8

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

Показывать по
10
20
40
сообщений

Новая тема

Ответить

gucci76

Дата регистрации: 16.03.2008
Сообщений: 364

Доброго времени суток.
Отчет на СКД. В СКД передается готовая таблица (а не запрос).
Хочу кроме отчета сохранять данные отчета в определенном формате в файл, но только по необходимости. Задумал это сделать через дополнительный параметр, созданный в СКД вручную, чтобы типовым механизмом вывести его на форму. Сделал параметр — отчет формируется.
Для удобства хочу добавить его на форму отчета через ПАНЕЛЬ ПОЛЬЗОВАТЕЛЯ. Добавил — отчет не формируется:
«Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля «ПараметрыДанных.ФормироватьФайл равно Да»

В параметрах СКД стоит «включать в доступные поля» и не стоит «ограничение доступности», «запрещать незаполненные»

Как побороть ошибку?

Показывать по
10
20
40
сообщений

Читают тему:

Понравилась статья? Поделить с друзьями:
  • Сквад не запускается ошибка unreal engine
  • Скачиваю файл пишет ошибка доступа
  • Скачиваю игру пишет ошибка торрента
  • Скачиваю игру а она выдает ошибку
  • Скачивание прервалось ошибка кода opensdk 525416