SelectObject

From SunFlurry wiki
Revision as of 13:25, 30 October 2020 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  SelectObject, AskObject (Загрузка модулей)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку или число, неверный путь, отсутствует заданный модуль
Визуальность:Да

Функция позволяет загружать и инициировать выполнение модуля и формы в модальном режиме для выбора объекта базы данных из списка объектов, при этом возможно начальное позиционирование на указанный объект, определение требуемого объекта формы списка объектов (если их несколько), изменение заголовка формы, использование других возможностей. Функция не возвратит результат до тех пор, пока модуль не закончит работы, при этом, модуль может изменить переданные параметры, если они представляли собой переменные. Функция не может использоваться для локальных клиентов, не связанных с базой данных. Путь, задаваемый первым аргументом этой функции, может представлять собой серверный файловый путь (пример: Modules\FreeForms\Касса\Список доверенностей) или наименование объекта базы данных в виде <Тип объекта>.<Вид объекта> (пример Ref.Номенклатура), система преобразовывает его в соответствующий путь. Некоторые отличия этой функции от LoadModule и OpenObject, а также особенности поведения модуля и формы, открытых этой функцией:

  • Функция работает только в модальном режиме, выбор режима загрузки недоступен.
  • В открытой функцией форме идентифицируется (по умолчанию задается в Студии, см. isDefaultControl) табличный элемент формы, список или древовидный элемент формы, которые используются для выбора объекта. При нажатии на клавишу Enter, либо двойном клике мышью, система автоматически закроет форму и передаст выбранный объект в виде результата.
  • По умолчанию запрещен выбор папок справочников, чтобы разрешить выбор папок наряду с обычными элементами, необходимо установить галку areFoldersSelectable на используемом для выбора элементе формы в Студии, либо указать возможность выбора папок в аргументе <Дополнительные установки> этой функции.
  • Если в таблице элементов объекта присутствует по крайней мере один периодический реквизит, в заголовок формы будет также добавлена дата загрузки периодических реквизитов. Изменение периода загрузки реквизитов производится с помощью функций Form.BegPeriodDate и Form.EndPeriodDate. При этом функция Form.EndPeriodDate автоматически обновит таблицу элементов объекта.
  • Модуль и форма, используемые системой по умолчанию задаются в Студии и зависят от дополнительных установок, передаваемых в эту функцию. К примеру, для выбора элементов может быть задана одна форма по умолчанию, а для выбора папок другая.

Загрузка модуля проходит следующие этапы:

  • Если путь и наименование модуля указаны корректно, произойдет загрузка модуля и его выполнение. Если во время выполнения модуля произошло исключение, то дальнейшая загрузка произведена не будет, модуль будет закрыт, а с ним завершен поток, если модуль его создавал. На этом этапе новая кнопка на панели задач визуального клиента не создается.
  • Будет произведен запуск функции OnOpen с параметром, если он указан. Изменяя параметр, функция может изменить имя загружаемой формы. Если функция отсутствует, этот этап будет пропущен. Если функция возвратит ноль (либо вызовет исключение), дальнейшая загрузка произведена не будет, модуль будет закрыт, а с ним завершен поток, если модуль его создавал. Таким образом можно вызывать модули без наличия формы, как вызываются обычные функции (либо как невизуальный дополнительный поток, который завершится после выполнения требуемой работы). Однако, нужно понимать, что подобный вызов, происходит гораздо медленнее, чем вызов обычной функции даже для модулей, не порождающих дополнительный поток. На этом этапе новая кнопка на панели задач визуального клиента не создается.
  • Будет произведена попытка создания и начального заполнения формы с именем, заданным шестым аргументом (либо именем, возвращенным функцией OnOpen). Если форма с таким именем в пути вызова функции отсутствует, будет вызвано исключение, модуль будет закрыт, а с ним завершен поток, если модуль его создавал. На этом этапе новая кнопка на панели задач визуального клиента не создается, однако, рабочий поток находится в режиме ожидания, так как форму создает и заполняет визуальный поток. Для консольного клиента этот этап будет пропущен.
  • Будет произведен запуск функции OnPostOpen, таким же образом, как была вызвана функция OnOpen ранее.
  • Происходит этап показа и выполнения формы:
    • Для консольного клиента будет выполнена функция OnConsoleWork, при попытке выхода из которой будет вызвана функция OnExit, если последняя возвратит ноль, снова будет вызвана функция OnConsoleWork, иначе работа модуля будет закончена, и завершен поток, если модуль его создавал. Если функции OnConsoleWork в модуле не существует, работа модуля завершается без вызова OnExit.
    • Для визуального клиента происходит вывод на экран загруженной формы, создается кнопка на панели задач.
      • Происходит заполнение табличных элементов формы, полей, списков и прочего из базы данных. Вызываются визуальные события, типа OnInitLine и подобные.
      • Происходит инициализация особых режимов вызова и сопутствующих им данных, если это необходимо (к примеру, открытия родительского справочника и пр.)
      • Происходит вызов визуального события OnOpen, если оно задано на форме, шаблонах формы, закладках элементов формы.
      • Происходит позиционирование на требуемом элементе таблицы выбора, если таковой задан.
      • Происходит заполнение из базы данных элементов формы, которые не были обновлены из-за их изменения внутри OnOpen и ранее из-за изменения их параметров и фильтров. Таким образом происходит оптимизация загрузки, чтобы элементы не обновлялись при загрузке более одного раза, замедляя загрузку и увеличивая нагрузку на базу данных. Кроме того, все созданные ранее асинхронные события и вызовы функций выполняются последовательно на этом этапе (система задерживает их выполнение до полной инициализации формы, так как они могут использовать загруженные формой данные).
      • Создаются записи в журнале регистрации событий при открытии элементов базы данных, если это необходимо.
      • Освобождается ожидавший все этой время рабочий поток, который теперь может продолжить исполнение. В этот момент устанавливается внутренний флаг окончания загрузки формы и функция Form.IsFullyInitialized будет возвращать 1.
      • Если внутри событий была вызвана функция закрытия формы Form.Close, форма закрывается и завершается рабочий поток, если он был создан. Иначе, управление отдается пользователю и форма ожидает от него команд, внешних прерываний, внешних сообщений или событий типа OnTimer.

Синтаксис

SelectObject(<Путь или имя базы данных (STRING)>,<Параметр>,<Опция>,<Имя модуля (STRING)>="Module",<Имя формы (STRING)>="SelectForm",<Объект для позиционирования>,<Наименование объекта формы, осуществляющего выбор (STRING)>,<Заголовок формы (STRING)>,<Дополнительные установки (INT)>=0):<Выбранный объект или пустое значение>

Аргументы

  • <Путь или имя базы данных (STRING)> - Строковое представление данного аргумента может представлять собой путь к объекту базы данных, относительный путь к папке проекта на сервере. См. описание этой функции для более полной информации.
  • <Параметр>,<Опция> - (возможен аргумент-переменная (ByRef)) (необязательный аргумент) Аргументы передаются в вызываемый модуль без изменения, и могут использоваться по усмотрению разработчика. Аргументы будут доступы начиная с первого вызова модуля под именами Param и Option. При открытии/загрузке объектов базы данных первый аргумент (Param) рекомендуется использовать для указания на родителя (Parent) текущего элемента или списка элемента справочников. Система сама может пытаться использовать по умолчанию значение этого аргумента, как родителя справочника при загрузке объектов (это поведение, однако, может быть изменено). Если аргументы представлены переменными и модуль вызывается в модальном режиме, вызываемая программа может изменить значения этих переменных и, после того, как вызываемый модуль закончит работу, измененные значения будут переданы в исходных переменных.
  • <Имя модуля (STRING)> - (необязательный аргумент) Имя загружаемого модуля, если этот параметр не указан, будет использовано имя, заданное в Студии, либо Module, если в проекте модуль не задан.
  • <Имя формы (STRING)> - (необязательный аргумент) Имя загружаемой формы, если этот параметр не указан, будет использовано имя, заданное в Студии, либо SelectForm, если в проекте форма не задана. Если форма не будет использоваться (загруженный модуль будет закрыт, так как функция OnOpen возвратит 0, либо произойдет исключение и пр.), т.е. загрузка будет прервана до начала загрузки визуальной части, этот параметр не имеет значения.
  • <Объект для позиционирования> - (необязательный аргумент) Объект базы данных, на который будет выполнено позиционирование экранного элемента, в котором осуществляется выбор.
  • <Наименование объекта формы, осуществляющего выбор (STRING)> - (необязательный аргумент) Наименование объекта формы, в котором осуществляется выбор. Если этот параметр не задан, таким объектом принимается элемент формы, имеющий признак isDefaultControl, задаваемый в Студии.
  • <Заголовок формы (STRING)> - (необязательный аргумент) Задает заголовок формы выбора, заголовок можно изменить и после загрузки формы.
  • <Дополнительные установки (INT)> - (необязательный аргумент) Битовая маска, определяющая дополнительные установки выбора:
    • Бит 0 (1) -- Разрешает выбирать папки справочников (1), либо только элементы (0, по умолчанию).
    • Бит 1 (2) -- Форсирует выбор родителя справочника до начала выбора элемента, если справочник имеет родителей (по умолчанию -- нет). Данный пункт позволяет открыть другие формы выбора для выбора родителей данного справочника, если они заданы до того, как произойдет открытие формы выбора элемента. Выбранные родители будут установлены, как родительский элемент на элементе формы, в котором отображены выбираемые элементы (соответствует установке Form.ParentElement). Формы для выбора родителей вызываются с установками по умолчанию, если необходимо произвести выбор родителей с установками, отличными от умолчания, программа должна предусмотреть вызов функций SelectObject для выбора родителей и передачи выбранного родителя в форму выбора подчиненных элементов самостоятельно.

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

Функция возвращает выбранный пользователем элемент, либо пустое значение, если пользователь закрыл форму, не осуществив выбор.

Примеры

//Функция выбирает необходимый элемент или папку элементов справочника "Контрагенты"
аЗн:=SelectObject("Ref.Контрагенты",,,"Module","SelectForm",аПоз,,"Выберите значение отбора: контрагент",1);
If isEmpty(аЗн) Then
  Exit;
EndIf;

//Функция выбирает документ определенного вида из журнала документов "ОбщийЖурнал"
аДок:=SelectObject("Jor.ОбщийЖурнал",ВидДокументов,0,"Module","SelectForm",,,"Выберите требуемый документ");
if isEmpty(аДок) Then
  Exit;
EndIf;

//Функция выбирает требуемый элемент справочника "Договоры", при этом происходит позиционирование на элемент по умолчанию аДоговор
//  Форме выбора передается элемент-родитель аКонтрагент, если же аКонтрагент не выбран, произойдет выбор элемента родительского справочника до того, как будет выбран договор.
аЭл:=SelectObject("Ref.Договоры",аКонтрагент,0,"Module","SelectForm",аДоговор,,"Выберите требуемый договор",2);
If isEmpty(аЭл) Then
  Exit;
EndIf;