В этой статье речь пойдет о достаточно редкой ошибке, которая может встретиться при работе с отчетами на СКД или динамическими списками. Дословно текст ошибки такой: “Ошибка в элементе отбора глобальные элементы отбора обязательно должны использовать поля“. Что это значит, как воспроизвести и как исправить?
Содержание
Немного об устройстве отбора в СКД
Начну издалека. В настройках системы компоновки данных есть объект Отбор, с типом ОтборКомпоновкиДанных. И его элементы представляют собой либо группы, либо отдельные элементы отбора.
У каждого элемента отбора СКД есть несколько основных свойств: Левое значение, Правое значение, Вид сравнения и Использование. Как в левом, так и в правом значениях можно указать либо поле компоновки данных, либо конкретное значение.
Внимание! На момент написания публикации, указанная на скриншоте выше настройка динамического списка приводит к падению платформы.
На скриншоте видно, что первая строка отбора содержит ПолеКомпоновкиДанных(“Номер”) в левом значении, а у второй строки и левое и правое значение – это конкретные даты.
Для объекта с типом ДинамическийСписок указание в левом значении любого значения, кроме какого-либо поля компоновки данных, приводит к вылету платформы. Но только при включенном флажке “Использование”!
Причина возникновения ошибки
Суть ошибки сводится к тому, что в корневом элементе отбора присутствуют строки, у которых и ЛевоеЗначение и ПравоеЗначение не имеют тип ПолеКомпоновкиДанных. И в подавляющем большинстве случаев это возникает из-за неверной программной установки отбора. Но тем не менее, и через настройки в конфигураторе эту ошибку также можно воспроизвести.
Отличие отбора в динамическом списке и СКД
В системе компоновки данных отбор можно задавать отдельно на каждом уровне структуры отчета например, у нас может быть отчет по продажам с группировками Контрагент >> Номенклатура >> Детальные записи. И на каждую группировку мы можем наложить свой отбор.
В динамическом списке отбор накладывается всегда на корневой элемент структуры – т.е. элементы отбора динамического списка всегда будут глобальные.
Воспроизводим ошибку в коде для динамического списка
В приведенном ниже фрагменте кода мы намеренно присваиваем левому значению число 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
Показывать по
10
20
40
сообщений
Новая тема
Ответить
gucci76
Дата регистрации: 16.03.2008
Сообщений: 364
Доброго времени суток.
Отчет на СКД. В СКД передается готовая таблица (а не запрос).
Хочу кроме отчета сохранять данные отчета в определенном формате в файл, но только по необходимости. Задумал это сделать через дополнительный параметр, созданный в СКД вручную, чтобы типовым механизмом вывести его на форму. Сделал параметр — отчет формируется.
Для удобства хочу добавить его на форму отчета через ПАНЕЛЬ ПОЛЬЗОВАТЕЛЯ. Добавил — отчет не формируется:
«Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля «ПараметрыДанных.ФормироватьФайл равно Да»
В параметрах СКД стоит «включать в доступные поля» и не стоит «ограничение доступности», «запрещать незаполненные»
Как побороть ошибку?
Показывать по
10
20
40
сообщений
Читают тему:
Продолжаем разговор о открытие форм различным способом (и с различными целями), предыдущая статья рассказывала о том, как открыть форму с заполнением, а данная статья расскажет о том, ка открыть форму с отбором (форма списка, форма выбора) в обычном и управляемом приложении.
Открытие формы с отбором в обычном приложении
В обычном приложении (я пробовал на платформе 8.2.18.102) я знаю только один способ открытия формы списка или формы выбора с отбором (буду рад увидеть другие варианты), выглядит он примерно так:
нФормаВыбора = Справочники.ТестСправочник.ПолучитьФормуВыбора(, ЭлементыФормы.тестОбъект); нФормаВыбора.Отбор.ТестРеквизит.ВидСравнения = ВидСравнения.Равно; нФормаВыбора.Отбор.ТестРеквизит.Значение = «Тест1»; нФормаВыбора.Отбор.ТестРеквизит.Использование = Истина; нФормаВыбора.Открыть(); |
В этом примере при получении формы владельца открывающейся формы (второй параметр) можно ничего не указывать (для формы списка, например), я указал поле в которое должен попадать выбранный элемент.
Кроме этого, если код открытия формы у Вас размещается в событии «НачалоВыбора», то не забудьте отменить стандартную обработку, а в качестве владельца открывающейся формы можно указать первый параметр события — «Элемент».
Открытие формы с отбором в управляемом приложении
В управляемом приложении я знаю несколько способов открыть форму с отбором. Первый способ простой, но сильно ограничен по возможностям, выглядит он примерно так:
ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить(«ТестРеквизит», «Тест1»); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить(«Отбор», ПараметрыОтбора); ОткрытьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», ПараметрыФормы, Элементы.тестОбъект); |
Проблема в том, что нельзя выбрать вид сравнения (только «равно») и нет доступа к некоторым другим параметрам.
Второй способ лишен недостатков первого способа, но выглядит значительно более громоздко:
фиксНастройки = Новый НастройкиКомпоновкиДанных; эОтбор = фиксНастройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»)); эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТестРеквизит»); эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; эОтбор.ПравоеЗначение = «Тест2»; эОтбор.Использование = Истина; эОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить(«ФиксированныеНастройки», фиксНастройки); ОткрытьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», ПараметрыФормы, Элементы.тестОбъект); |
И на всякий случай приведу третий способ, который, на самом деле, мало чем отличается от второго, но смотрите сами:
нФормаВыбора = ПолучитьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», , Элементы.тестОбъект); эОтбор = нФормаВыбора.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»)); эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТестРеквизит»); эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; эОтбор.ПравоеЗначение = «Тест2»; эОтбор.Использование = Истина; эОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; нФормаВыбора.Открыть(); |
Не забывайте отключать стандартную обработку, если это требуется, а также указывать/не указывать владельца при получении/открытии формы.
В заключение отмечу, что я намеренно не использую модальное открытие формы списка/выбора (1С с некоторых пор приказала отказываться от модальности), но если у Вас есть потребность в модальности, то такое, разумеется, тоже возможно.
На этом все, надеюсь данная статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Загрузка…