LoadModule

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

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

По каждому указанному пути может находиться неограниченное число модулей, форм, табличных файлов, ini-файлов или любых других бинарных файлов. При открытии объектов модули по умолчанию для каждого из случаев (открытие папки, открытие элемента, открытие в режиме таблицы и пр.) задаются в Студии. При вызове данной функции указывается модуль, который обязательно должен существовать и форма, которая может отсутствовать, если модуль не будет визуальным. Загрузка модуля проходит следующие этапы:

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

Синтаксис

LoadModule(<Способ вызова (INT)>,<Путь или имя базы данных (STRING)>,<Параметр>,<Опция>,<Имя модуля (STRING)>="Module",<Имя формы (STRING)>="SelectForm",<Серийный номер потока, в котором происходит исполнение (INT)>):<Результат модального выполнения>

Аргументы

  • <Способ вызова (INT)> - Способ вызова открываемого модуля. Возможны следующие значения:
    • 0 -- модуль будет загружен модально, если вызов не происходит из корневого модуля. Модальные модули не возвращают управления до тех пор, пока их выполнение не будет завершено. Для визуальных клиентов, модальная форма открывается в той же группе закладок, в которой была открыта вызывавшая форма, при этом создает запрет на активацию последней, до тех пор, пока модальная форма не будет закрыта. Табличные формы, которые могла создать любая из форм, при этом, будут доступны.
    • 1 -- модуль создает новый поток (для визуального клиента форма модуля будет помещена в новую группу закладок) в случае, если модуль с таким же путем, именем и именем формы (или объект с таким же идентификатором, при этом, все новые объекты одного вида имеют одинаковые идентификаторы) уже не открыт. Если подобный модуль уже открыт, будет произведена его визуальная активация на экране и вызов визуального события OnReopen.
    • 2 -- модуль создает новый поток (для визуального клиента форма модуля будет помещена в новую группу закладок).
    • 10 -- модуль будет загружен модально к основному окну системы. При показе такой формы, доступ к любым формам любых потоков будет заблокирован до того момента, как данная форма будет закрыта. Последующие вызовы функций загрузки модулей (LoadModule, OpenObject и пр.) в режимах, не совпадающих с 10 или 11, не разрешены. Данный способ загрузки используется для простых диалоговых окон (которые могут иметь минимальные возможности для редактирования данных) и совпадает по поведению с окнами, получаемыми функциями типа Box.
    • 11 -- совпадает с режимом 10, только модуль будет загружен модально к основному окну системы в режиме развернутого окна (maximized).
  • <Путь или имя базы данных (STRING)> - Строковое представление данного аргумента может представлять собой путь к объекту базы данных, относительный путь к папке проекта на сервере, абсолютный путь к папке проекта на локальном компьютере. См. описание этой функции для более полной информации. Также можно указывать путь к внешнему объекту и путь внутри него (см. Имена файлов), если внешний объект уже присутствует в системе, повторная его загрузка не будет выполнена. Для программного доступа к файлам внешних объектов см. группу функций работы с внешними объектами.
  • <Параметр>,<Опция> - (возможен аргумент-переменная (ByRef)) (необязательный аргумент) Аргументы передаются в вызываемый модуль без изменения, и могут использоваться по усмотрению разработчика. Аргументы будут доступы начиная с первого вызова модуля под именами Param и Option. При открытии/загрузке объектов базы данных первый аргумент (Param) рекомендуется использовать для указания на родителя (Parent) текущего элемента или списка элемента справочников. Система сама может пытаться использовать по умолчанию значение этого аргумента, как родителя справочника при загрузке объектов (это поведение, однако, может быть изменено). Если аргументы представлены переменными и модуль вызывается в модальном режиме, вызываемая программа может изменить значения этих переменных и, после того, как вызываемый модуль закончит работу, измененные значения будут переданы в исходных переменных.
  • <Имя модуля (STRING)> - (необязательный аргумент) Имя загружаемого модуля, если этот параметр не указан, будет использовано имя Module.
  • <Имя формы (STRING)> - (необязательный аргумент) Имя загружаемой формы, если этот параметр не указан, будет использовано имя SelectForm. Если форма не будет использоваться (загруженный модуль будет закрыт, так как функция OnOpen возвратит 0, либо произойдет исключение и пр.), т.е. загрузка будет прервана до начала загрузки визуальной части, этот параметр не имеет значения.
  • <Серийный номер потока, в котором происходит исполнение (INT)> - (возможен аргумент-переменная (ByRef)) (необязательный аргумент) Задает переменную в которую будет помещен серийный номер потока, в котором было запущено исполнение.

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

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

Примеры

//Открывается журнал документов "Общий журнал" с именами модуля и формы по умолчанию, ему передается параметр Param в виде документа, на который требуется произвести позиционирование
//Журнал открывается в новом потоке, если он уже не открыт (в последнем случае, для его формы будет вызвано визуальное событие OnReopen)
LoadModule(1,"Jor.ОбщийЖурнал",аДок);

//Вызывается новая копия обработки "редактирование партий в документе", обработке передаются требуемые параметры
Сп:=List.Create();
Сп.SetByName("Документ",аДок);
Сп.SetByName("ТипВывода",1);
LoadModule(2,"Modules\FreeForms\Склад\Редактирование партий в документе",Сп,0,"Module","Form");


//Обработка "выбор адреса доставки" предлагает выбрать элемент списка, который возвращается, как элемент списка с именем "Ответ"
Сп:=List.Create();
Сп.SetByName("Список",спАдресаДоставки);
Сп.SetByName("ТорговыйПредставитель",аТорговыйПредставитель);
Сп.SetByName("Договор",аДоговор);
//При вызове модулю передан параметр Param в виде списка с доп. параметрами
LoadModule(10,"Modules\FreeForms\Выбор адреса доставки",Сп,0,"Module","Form");
Зн:=Сп.GetByName("Ответ");
If IsEmpty(Зн) Then
  Exit;
EndIf;
//Зн -- возвращенный выбранный элемент списка