При разработке отчетов на базе Системы компоновки данных (СКД) начинающие (и даже опытные) разработчики часто сталкиваются с невразумительной на первый взгляд ошибкой: «Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля...». Особенно часто это происходит при работе с виртуальными таблицами регистров накопления, где фигурируют параметры НачалоПериода и КонецПериода.
Рассмотрим детально природу этой ошибки и разберем по шагам все способы её устранения, основываясь на практике решения подобных задач в 1С.
Проанализируем ситуацию. В СКД существует четкое разделение между Параметрами данных и Отборами. Параметры (те, что пишутся с амперсандом, например, &НачалоПериода) передаются напрямую в запрос или используются для управления логикой получения данных в виртуальных таблицах. Отборы же работают с уже полученным результатом запроса, фильтруя готовые строки.
Ошибка возникает тогда, когда система обнаруживает в пользовательских настройках (в разделе «Отбор») ссылку на объект, который не является полем набора данных. Чаще всего это происходит, когда разработчик или пользователь пытается добавить в список отборов системные параметры, которые СКД не может сопоставить с колонками результирующей таблицы.
Если вы используете виртуальную таблицу (например, ОстаткиИОбороты), СКД автоматически создает параметры НачалоПериода и КонецПериода. Выясним, как правильно вывести их для пользователя:
НачалоПериода и КонецПериода.Важный нюанс: убедитесь, что эти же поля НЕ добавлены во вкладку «Отбор» в настройках компоновщика. Если они там есть — удалите их. Параметры должны управляться только через вкладку параметров.
Для удобства пользователя лучше всего использовать один параметр вместо двух дат. Рассмотрим, как это реализовать, чтобы избежать ошибок компоновки:
ПериодОтчета с типом СтандартныйПериод.НачалоПериода и КонецПериода в колонке «Выражение» пропишем связь:
&ПериодОтчета.ДатаНачала&ПериодОтчета.ДатаОкончанияНачалоПериода и КонецПериода (чтобы они не путали пользователя), а для ПериодОтчета — снимем его и включим в пользовательские настройки.Если вы формируете отбор программно, ошибка может возникнуть из-за неправильного типа передаваемого значения в свойство ЛевоеЗначение. Проанализируем пример некорректного и корректного кода.
Неправильно: обращение к параметру или использование строки вместо объекта поля.
// ОШИБКА: Попытка передать параметр в левое значение отбора
НовыйЭлемент = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПараметрКомпоновкиДанных("Склад"); // Так нельзя!
Правильно: использование объекта ПолеКомпоновкиДанных, ссылающегося на доступное поле набора данных.
// ПРАВИЛЬНО: Использование ПоляКомпоновкиДанных
НовыйЭлемент = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлемент.ПравоеЗначение = СсылкаНаСклад;
НовыйЭлемент.Использование = Истина;
Также обратите внимание на свойство Поле у доступных полей выбора. Если вы ищете поле через ДоступныеПоляОтбора, присваивать нужно именно свойство Поле, а не весь объект описания поля:
НайденноеПоле = КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных("ФизЛицо"));
ОтборФизЛицо.ЛевоеЗначение = НайденноеПоле.Поле; // ПРАВИЛЬНО
Иногда СКД «запутывается», если имя параметра совпадает с именем поля в запросе. Например, если в тексте запроса вы написали ГДЕ Склад = &Склад. В некоторых случаях система может интерпретировать Склад в отборах как попытку обратиться к параметру.
Рекомендуется давать параметрам уникальные префиксы, например: &П_Склад или &ВыбранныйСклад. Это гарантирует, что в списке доступных полей отбора будут только реальные поля данных, а в списке параметров — только управляющие переменные.
Бывает так: программист исправил схему, убрал лишние отборы, настроил параметры, а у пользователя ошибка сохраняется. Выясним причину: это происходит потому, что 1С сохраняет настройки отчета (варианты) в системных хранилищах. Старый вариант отчета «помнит», что в отборах когда-то было поле НачалоПериода, и пытается его применить к новой схеме.
Что нужно сделать:
СохраненныеНастройки (в старых конфигурациях).Для предотвращения ошибки «Глобальные элементы отбора обязательно должны использовать поля», всегда придерживайтесь следующих правил:
&) в список Отборов.ПолеКомпоновкиДанных и убедитесь, что путь к данным указан без амперсанда.