Как наложить локальный фильтр и избежать ошибки: свойство реквизита Preloaded

6 2

Что будет, если наложить локальный фильтр (Filter) на набор данных справочника при открытии? 

Например так:

Object.Filter = "<Имя реквизита> is not null"
Object.Filtered = true

 

 

 

Фильтр ограничивает выборку по данным, не выполняя повторный sql-запрос, то есть локально. А что, если фильтр наложен, а значение реквизита еще не загружено? 

Для избежания подобной ситуации необходимо загрузить значения реквизитов, по которым накладывается фильтр, до его использования. Сделать это можно с помощью свойства реквизита Preloaded в событии "Набор данных - Открытие", естественно, ДО вызова фильтра.

Object.Requisites('<Имя реквизита>').Preloaded = true

Object.Filter = "<Имя реквизита> is not null"
Object.Filtered = true
 
 
 
 
 
 
 
 
Итак, Preloaded - свойство реквизита:
1. При открытии набора данных справочника с сервера считываются значения реквизитов, это:
  • некоторые предопределенные реквизиты (ИД, Состояние, Статус, Код, Наименование и др.)
  • все реквизиты, которые соответствуют видимым колонкам формы-списка справочника (если для них в событии "Набор данных - Открытие" не прописано Preloaded = false)  
  • все остальные реквизиты, для которых в событии справочника "Набор данных - Открытие" устанавливается Preloaded = true
  
2. Если в событии справочника "Набор данных - Открытие" установить Preloaded = false, то, для не предопределенных реквизитов, в форме-списке значения не будут отображаться, что может ввести пользователя в заблуждение, на предопределенные реквизиты влияния не выявлено - отображаются нормально (подгружаются независимо от значения Preloaded). Затем, при открытии карточки записи справочника, все данные по реквизитам отображаются нормально, так как подгружаются с сервера. 
 
3. Свойство Preloaded устанавливается платформой на клиенте и действует на время одного запуска до закрытия компоненты.
 
4. На одном клиенте могут различаться одни и те же реквизиты в свойстве Preloaded - видимые колонки раздельно сохраняются для разных режимов справочника - просмотр/выбор/навигация.
 
 
PS. Пишите в комментариях, как вы использовали Preloaded в своих творениях, чем помогло/навредило.
6
Авторизуйтесь, чтобы оценить материал.
2
Эдуард Исабекян

А зачем вообще использовать Filter и Filtred в событии "Открытие" набора данных? В открытии гораздо эффективнее использовать AddWhere. Да, чуть сложнее составить условие при "правильном" написании кода, т.е. абстрагируясь от физической структуры данных, но при этом:

  • фильтр накладывается на сервере и на клиент загружаются только нужные данные;
  • шире возможности, особенно в сочетании с AddFrom;
  • нет проблем с Preloaded.

 А Filter полезен, если необходимо фильтровать уже имеющийся открытый набор данных и при работе с детальными разделами, которые иначе никак не отфильтруешь.

Preloaded же хорошо использовать если есть "широкий" справочник, т.е. большое количество реквизитов, и его набор данных открывается программно без показа формы. В таком случае по умолчанию Preloaded = true для всех реквизитов, соответственно все реквизиты попадают в запрос, что негативно сказывается на скорости выполнения этого запроса и открытии НД. Оставляя Preloaded = true только для тех, реквизитов которые нужны для чтения без открытия записей оптимизируем скорость открытия.

Петр Федотов
 А Filter полезен, если необходимо фильтровать уже имеющийся открытый набор данных и при работе с детальными разделами, которые иначе никак не отфильтруешь.

детальные разделы тоже можно через AddWhere просто делать это надо до вызова OpenRecord
 
Preloaded же хорошо использовать если есть "широкий" справочник
для этого удобнее использовать функцию CreateReference(), указав второй параметр - это как раз список реквизитов, которые станут Preloaded = True, а все остальные False

Авторизуйтесь, чтобы написать комментарий