Как исправить ошибку «Глобальные элементы отбора обязательно должны использовать поля» в СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим детально природу этой ошибки и разберем по шагам все способы её устранения, основываясь на практике решения подобных задач в 1С.

Суть проблемы: Отборы против Параметров

Проанализируем ситуацию. В СКД существует четкое разделение между Параметрами данных и Отборами. Параметры (те, что пишутся с амперсандом, например, &НачалоПериода) передаются напрямую в запрос или используются для управления логикой получения данных в виртуальных таблицах. Отборы же работают с уже полученным результатом запроса, фильтруя готовые строки.

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

Решение 1. Правильная настройка периода в виртуальных таблицах

Если вы используете виртуальную таблицу (например, ОстаткиИОбороты), СКД автоматически создает параметры НачалоПериода и КонецПериода. Выясним, как правильно вывести их для пользователя:

  1. Откроем схему компоновки данных и перейдем на вкладку «Параметры».
  2. Найдем строки НачалоПериода и КонецПериода.
  3. Проверим колонку «Ограничение доступности». Если там стоит галочка, пользователь не увидит эти параметры в настройках отчета и, пытаясь «найти выход», полезет в настройки отбора, что и спровоцирует ошибку. Снимем галочку ограничения доступности для тех параметров, которые должен заполнять пользователь.
  4. Перейдем на вкладку «Настройки», затем на вложенную вкладку «Параметры» (внизу).
  5. Для каждого параметра нажмем на кнопку «Свойства элемента пользовательских настроек» (иконка с шестеренкой) и установим флаг «Включать в пользовательские настройки».

Важный нюанс: убедитесь, что эти же поля НЕ добавлены во вкладку «Отбор» в настройках компоновщика. Если они там есть — удалите их. Параметры должны управляться только через вкладку параметров.

Решение 2. Использование составного типа «СтандартныйПериод»

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

  1. На вкладке «Параметры» добавим новый параметр, назовем его ПериодОтчета с типом СтандартныйПериод.
  2. Для системных параметров НачалоПериода и КонецПериода в колонке «Выражение» пропишем связь:
    • Для начала периода: &ПериодОтчета.ДатаНачала
    • Для конца периода: &ПериодОтчета.ДатаОкончания
  3. Установим флаг «Ограничение доступности» для НачалоПериода и КонецПериода (чтобы они не путали пользователя), а для ПериодОтчета — снимем его и включим в пользовательские настройки.

Решение 3. Программная установка отборов

Если вы формируете отбор программно, ошибка может возникнуть из-за неправильного типа передаваемого значения в свойство ЛевоеЗначение. Проанализируем пример некорректного и корректного кода.

Неправильно: обращение к параметру или использование строки вместо объекта поля.


// ОШИБКА: Попытка передать параметр в левое значение отбора
НовыйЭлемент = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПараметрКомпоновкиДанных("Склад"); // Так нельзя!

Правильно: использование объекта ПолеКомпоновкиДанных, ссылающегося на доступное поле набора данных.


// ПРАВИЛЬНО: Использование ПоляКомпоновкиДанных
НовыйЭлемент = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад"); 
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлемент.ПравоеЗначение = СсылкаНаСклад;
НовыйЭлемент.Использование = Истина;

Также обратите внимание на свойство Поле у доступных полей выбора. Если вы ищете поле через ДоступныеПоляОтбора, присваивать нужно именно свойство Поле, а не весь объект описания поля:


НайденноеПоле = КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных("ФизЛицо"));
ОтборФизЛицо.ЛевоеЗначение = НайденноеПоле.Поле; // ПРАВИЛЬНО

Решение 4. Конфликты имен и виртуальные поля

Иногда СКД «запутывается», если имя параметра совпадает с именем поля в запросе. Например, если в тексте запроса вы написали ГДЕ Склад = &Склад. В некоторых случаях система может интерпретировать Склад в отборах как попытку обратиться к параметру.

Рекомендуется давать параметрам уникальные префиксы, например: &П_Склад или &ВыбранныйСклад. Это гарантирует, что в списке доступных полей отбора будут только реальные поля данных, а в списке параметров — только управляющие переменные.

Решение 5. Очистка пользовательских настроек (Кэш)

Бывает так: программист исправил схему, убрал лишние отборы, настроил параметры, а у пользователя ошибка сохраняется. Выясним причину: это происходит потому, что 1С сохраняет настройки отчета (варианты) в системных хранилищах. Старый вариант отчета «помнит», что в отборах когда-то было поле НачалоПериода, и пытается его применить к новой схеме.

Что нужно сделать:

  1. В режиме «Предприятие» откройте настройки отчета.
  2. Нажмите кнопку «Установить стандартные настройки».
  3. Если это не помогло, удалите текущий вариант отчета и создайте его заново (или выберите другой стандартный вариант).
  4. В крайнем случае поможет очистка кэша пользователя или удаление записей из регистра СохраненныеНастройки (в старых конфигурациях).

Резюме

Для предотвращения ошибки «Глобальные элементы отбора обязательно должны использовать поля», всегда придерживайтесь следующих правил:

← На главную