MassLoadObjects

From SunFlurry wiki
Jump to: navigation, search
  MassLoadObjects (Загрузка группы объектов)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Невозможно превратить в строку, число, неверный объект загрузки
Визуальность:Нет

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

Синтаксис

MassLoadObjects(<Объект для загрузки>,<Аргумент 1>,<Аргумент 2>,<Также загружать периодические реквизиты (INT)>=0,<Производить загрузку заголовков (INT)>=0,<Доп. реквизиты при загрузке заголовков (STRING)>=""):<Количество объектов, которые были загружены (INT)>

Аргументы

  • <Объект для загрузки> - Объект, содержащий объекты для загрузки. Данный объект может быть:
    • список значений -- будут загружены объекты из списка. Последующие два аргумента могут задавать начальный индекс списка (первый объект для загрузки) и конечный индекс списка (последний объект для загрузки) соответственно.
    • таблица значений -- будут загружены объекты из таблицы значений. Последующие два аргумента могут иметь следующее значение:
      • В случае, если аргументы представляют собой целые числа, они задают индекс начальной строки загрузки и индекс конечной строки загрузки соответственно. В этом режиме объекты будут собираться из всех столбцов таблицы. Для исключения определенных столбцов таблицы из загрузки также смотрите статью ForbidMassLoad.
      • В случае, если аргументы представляют собой строки, первый задает наименования столбцов для загрузки через запятую (пустое значение -- все столбцы), второй задает наименования столбцов для пропуска (т.е., список столбцов, которые не нужно загружать) через запятую. В этом режиме объекты будут собираться для всех строк таблицы, но только для определенных ее столбцов. Для исключения определенных столбцов таблицы из загрузки также смотрите статью ForbidMassLoad.
    • дерево значений или ветка дерева значений -- будут загружены объекты из дерева/ветки значений. Дополнительные аргументы не требуются.
    • объект базы данных -- если объект загружен, будут загружены любые объекты, являющиеся его реквизитами. Также будут загружены любые объекты любой из его загруженных строчных частей. Дополнительные аргументы не требуются.
  • <Аргумент 1>,<Аргумент 2> - (необязательный аргумент) Значения этих аргументов зависят от типа объекта загрузки (первого аргумента).
  • <Также загружать периодические реквизиты (INT)>=0 - (необязательный аргумент) Режим позволяет при загрузке объектов также загружать их периодические реквизиты (см. статью Объект базы данных). Периодические реквизиты будут загружены на дату периодических реквизитов объектов (см. UseDate).
  • <Производить загрузку заголовков (INT)>=0 - (необязательный аргумент) Режим загрузки только заголовков (см. статью Объект базы данных). Аргумент может принимать следующие значения:
    • 0 -- производить полную загрузку объектов
    • 1 -- производить загрузку объектов в режиме только заголовки или частичная загрузка (в зависимости от наличия следующего аргумента), объекты, которые не могут быть загружены частично, будут пропущены. К примеру, если при настройке проекта для объекта не задан реквизит сортировки, данный объект не может быть загружен в режиме только заголовков.
    • 2 -- производить загрузку объектов в режиме только заголовки или частичная загрузка (в зависимости от наличия следующего аргумента), объекты, которые не могут быть загружены частично, будут загружены полностью. К примеру, если при настройке проекта для объекта не задан реквизит сортировки, данный объект не может быть загружен в режиме только заголовков.
  • <Доп. реквизиты при загрузке заголовков (STRING)> - (необязательный аргумент) Список наименований реквизитов через запятую, которые будут загружены дополнительно в режиме загрузки только заголовков. В случае, когда этот аргумент задан, объекты будут загружены в режиме "частичная загрузка". Если наименование реквизита в загружаемом объекте отсутствует, оно будет пропущено. Таким образом можно загружать разные объекты одним вызовом функции, указав всю совокупность реквизитов для частичной загрузки.

Возвращаемое значение

Возвращает количество объектов, которые участвовали в загрузке.


Примеры

//Ниже дан кусок кода для события OnBeforeLoadElements, производится заполнение таблицы Tab, в которую загружаются
//  подчиненные элементы справочника НаценкиНаГруппы, чтобы ускорить загрузку и уменьшить потребление памяти,
//  при этом, для таблицы необходимы не сами элементы, а объекты, помещенные в реквизит ГруппаНоменклатуры, т.е., элементы
//  представляют собой строчную часть с одним реквизитом ГруппаНоменклатуры.
//  Нам необходимо собрать все объекты из реквизитов ГруппаНоменклатуры и осуществить их загрузку в режиме частичной загрузки.
//
//  В таблице выводятся наименование загруженных объектов, реквизит "Code" загруженных объектов и иконка, соответствующая папке,
//  если элемент был папкой справочника Номенклатура. Поэтому для частичной загрузки достаточно реквизита "Code", остальные
//  перечисленные свойства всегда загружаются в этом режиме.
//

Tab:=Form.Tab.Value;
aEl:=Ref.НаценкиНаГруппы;
//Загрузка нужных элементов (не удаленных) справочника НаценкиНаГруппы в список aList
//Полная загрузка будет осуществлена быстро, так как элементы простые и содержат минимум реквизитов
aList:=aEl.Load(0,"@Parent,@Status",Form.Tab.ParentElement,0);

//Заполняем вспомогательный список bList, для частичной загрузки всех реквизитов ГруппаНоменклатуры 
bList:=List.Create();
//Цикл по всем загруженным элементам НаценкиНаГруппы
For i:=1 To aList.Size() Do
  Эл:=aList.Get(i);
  //Создание списка bList, состоящего из реквизитов ГруппаНоменклатуры загруженных элементов
  //  каждый из этих реквизитов пока не загружен, реквизиты содержат справочник Номенклатуры, с "тяжелыми" для загрузки элементами.
  bList.Add(Эл.ГруппаНоменклатуры);
EndDo;
//Загрузка всех накопленных элементов в режиме частичной загрузки, будут загружены наименования, реквизиты сортировки, свойства типа "удален", "папка" и пр., 
//  и реквизит "Code", требуемый для отображения
MassLoadObjects(bList,,,0,1,"Code");


Tab.Lock();
Try
  //Заполняем визуальную таблицу Tab из оригинального списка aList
  //Важно понимать, что все реквизиты ГруппаНоменклатуры каждого из элементов списка загружены 
  //  в режиме частичной загрузки ранее, для этого мы собирали их в список и вызывали MassLoadObjects
  aList.CopyTo(Tab,1,aList.Size(),"@ELEMENT");
  Tab.Select();
  While Tab.Next() Do
    Эл:=Tab.Get(Tab.CurLine,"@ELEMENT");
    //Эл.ГруппаНоменклатуры -- загружен в режиме частичной загрузки,
    //  чтение реквизитов и свойств, типа isFolder, Status не приведет к полной загрузке
    Tab.isFolder:=Эл.ГруппаНоменклатуры.isFolder();
    //Вывод на экран представления элемента также не приведет к к полной загрузке элемента
    Tab.ГруппаНоменклатуры:=Эл.ГруппаНоменклатуры;
    //Частичная загрузка также включала реквизит "Code", поэтому его безопасно добавить в выводимую таблицу
    Tab.Code:=Эл.ГруппаНоменклатуры.Code;
    //При частичной загрузке загруженных свойств достаточно, чтобы показать стандартную иконку (папка, элемент, удаленная папка, удаленный элемент)
    //Обратите внимание: стандартная иконка выводится для реквизита ГруппаНоменклатуры, а не для самого элемента Эл
    Tab.Icon(i,"Icon",GetStandardIcon(Эл.ГруппаНоменклатуры));
    //Остальные свойства берутся из элементов справочника НаценкиНаГруппы, которые подверглись полной загрузке
    Tab.Сумма:=Эл.Сумма;
    Tab.Процент:=Эл.Процент;
  EndDo;
  //Сортируем таблицу с учетом текущих визуальных настроек сортировки
  Стр:="isFolder-"+?(Form.Tab.SortString="","",","+Form.Tab.SortString);
  Tab.Sort(Стр);
Finally
  Tab.Unlock();
EndTry;