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