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

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

Содержание

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

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

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

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

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

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

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

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

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

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

В приведенном ниже фрагменте кода мы намеренно присваиваем левому значению число 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



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

Новая тема

Ответить

gucci76

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

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

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

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

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

Читают тему:

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

Открытие формы с отбором в обычном приложении

В обычном приложении (я пробовал на платформе 8.2.18.102) я знаю только один способ открытия формы списка или формы выбора с отбором (буду рад увидеть другие варианты), выглядит он примерно так:

нФормаВыбора = Справочники.ТестСправочник.ПолучитьФормуВыбора(, ЭлементыФормы.тестОбъект);

нФормаВыбора.Отбор.ТестРеквизит.ВидСравнения = ВидСравнения.Равно;

нФормаВыбора.Отбор.ТестРеквизит.Значение = «Тест1»;

нФормаВыбора.Отбор.ТестРеквизит.Использование = Истина;

нФормаВыбора.Открыть();

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

Кроме этого, если код открытия формы у Вас размещается в событии «НачалоВыбора», то не забудьте отменить стандартную обработку, а в качестве владельца открывающейся формы можно указать первый параметр события — «Элемент».

Открытие формы с отбором в управляемом приложении

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

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

ПараметрыОтбора.Вставить(«ТестРеквизит», «Тест1»);

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

ПараметрыФормы.Вставить(«Отбор», ПараметрыОтбора);

ОткрытьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», ПараметрыФормы, Элементы.тестОбъект);

Проблема в том, что нельзя выбрать вид сравнения (только «равно») и нет доступа к некоторым другим параметрам.

Второй способ лишен недостатков первого способа, но выглядит значительно более громоздко:

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

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

эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТестРеквизит»);

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

эОтбор.ПравоеЗначение = «Тест2»;

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

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

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

ПараметрыФормы.Вставить(«ФиксированныеНастройки», фиксНастройки);

ОткрытьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», ПараметрыФормы, Элементы.тестОбъект);

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

нФормаВыбора = ПолучитьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», , Элементы.тестОбъект);

эОтбор = нФормаВыбора.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТестРеквизит»);

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

эОтбор.ПравоеЗначение = «Тест2»;

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

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

нФормаВыбора.Открыть();

Не забывайте отключать стандартную обработку, если это требуется, а также указывать/не указывать владельца при получении/открытии формы.

В заключение отмечу, что я намеренно не использую модальное открытие формы списка/выбора (1С с некоторых пор приказала отказываться от модальности), но если у Вас есть потребность в модальности, то такое, разумеется, тоже возможно.

На этом все, надеюсь данная статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

loading.gif Загрузка…

Понравилась статья? Поделить с друзьями:
  • Ошибка в электронном разрешении в мексику
  • Ошибка в1406 на шевроле эпика
  • Ошибка в электронном полисе осаго как исправить ошибку
  • Ошибка в1404 ниссан альмера классик
  • Ошибка в электронном листке нетрудоспособности как исправить