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