Difference between revisions of "OpenObject"

From SunFlurry wiki
Jump to: navigation, search
 
m (1 revision imported)
 
(2 intermediate revisions by 2 users not shown)
Line 34: Line 34:
 
** 1 -- модуль создает новый поток (для визуального клиента форма модуля будет помещена в новую группу закладок) в случае, если модуль с таким же путем, именем и именем формы (или объект с таким же идентификатором, при этом, все новые объекты одного вида имеют одинаковые идентификаторы) уже не открыт. Если подобный модуль уже открыт, будет произведена его визуальная активация на экране и вызов визуального события ''OnReopen''.
 
** 1 -- модуль создает новый поток (для визуального клиента форма модуля будет помещена в новую группу закладок) в случае, если модуль с таким же путем, именем и именем формы (или объект с таким же идентификатором, при этом, все новые объекты одного вида имеют одинаковые идентификаторы) уже не открыт. Если подобный модуль уже открыт, будет произведена его визуальная активация на экране и вызов визуального события ''OnReopen''.
 
** 2 -- модуль создает новый поток (для визуального клиента форма модуля будет помещена в новую группу закладок).
 
** 2 -- модуль создает новый поток (для визуального клиента форма модуля будет помещена в новую группу закладок).
** 10 -- модуль будет загружен модально к основному окну системы. При показе такой формы, доступ к любым формам любых потоков будет заблокирован до того момента, как данная форма будет закрыта. Последующие вызовы функций загрузки модулей ([[LoadModule]], [[OpenObject]] и пр.) не разрешены. Данный способ загрузки используется для простых диалоговых окон (которые могут иметь минимальные возможности для редактирования данных) и совпадает по поведению с окнами, получаемыми функциями типа [[Box]].
+
** 10 -- модуль будет загружен модально к основному окну системы. При показе такой формы, доступ к любым формам любых потоков будет заблокирован до того момента, как данная форма будет закрыта. Последующие вызовы функций загрузки модулей ([[LoadModule]], [[OpenObject]] и пр.) в режимах, не совпадающих с 10 или 11, не разрешены. Данный способ загрузки используется для простых диалоговых окон (которые могут иметь минимальные возможности для редактирования данных) и совпадает по поведению с окнами, получаемыми функциями типа [[Box]].
 +
** 11 -- совпадает с режимом 10, только модуль будет загружен модально к основному окну системы в режиме развернутого окна (''maximized'').
 
* <code>''<Параметр>,<Опция>''</code> - {{ByRef}} {{Optional}} Аргументы передаются в вызываемый модуль без изменения, и могут использоваться по усмотрению разработчика. Аргументы будут доступы начиная с первого вызова модуля под именами '''Param''' и '''Option'''. При открытии/загрузке объектов базы данных первый аргумент (''Param'') рекомендуется использовать для указания на родителя (Parent) текущего элемента или списка элемента справочников. Система сама может пытаться использовать по умолчанию значение этого аргумента, как родителя справочника при загрузке объектов (это поведение, однако, может быть изменено). Если аргументы представлены переменными и модуль вызывается в модальном режиме, вызываемая программа может изменить значения этих переменных и, после того, как вызываемый модуль закончит работу, измененные значения будут переданы в исходных переменных.
 
* <code>''<Параметр>,<Опция>''</code> - {{ByRef}} {{Optional}} Аргументы передаются в вызываемый модуль без изменения, и могут использоваться по усмотрению разработчика. Аргументы будут доступы начиная с первого вызова модуля под именами '''Param''' и '''Option'''. При открытии/загрузке объектов базы данных первый аргумент (''Param'') рекомендуется использовать для указания на родителя (Parent) текущего элемента или списка элемента справочников. Система сама может пытаться использовать по умолчанию значение этого аргумента, как родителя справочника при загрузке объектов (это поведение, однако, может быть изменено). Если аргументы представлены переменными и модуль вызывается в модальном режиме, вызываемая программа может изменить значения этих переменных и, после того, как вызываемый модуль закончит работу, измененные значения будут переданы в исходных переменных.
 
* <code>''<Имя модуля (STRING)>''</code> - {{Optional}} Имя загружаемого модуля, если этот параметр не указан, будет использовано имя, заданное в [[Студия/Конфигурация данных проекта|Студии]].
 
* <code>''<Имя модуля (STRING)>''</code> - {{Optional}} Имя загружаемого модуля, если этот параметр не указан, будет использовано имя, заданное в [[Студия/Конфигурация данных проекта|Студии]].

Latest revision as of 19:08, 20 November 2021

  OpenObject (Загрузка модулей)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку или число, неверный путь, отсутствует заданный модуль, не объект DB
Визуальность:Да

Функция позволяет загружать и инициировать выполнение модуля и формы, связанных с заданным объектом, при этом сам объект загружается в форму для редактирования или просмотра. Модуль может быть загружен как модально к текущему потоку (если текущий поток не является корневым), так и создавать новый поток, передавая ему два аргумента. В случае модального исполнения, функция не возвратит результат до тех пор, пока модуль не закончит работы, при этом, модуль может возвратить результат и изменить переданные параметры, если они представляли собой переменные. Функция может возвратить особую строку с результатом, если требуемый объект был заблокирован другим пользователем (см. ниже возвращаемое значение). Функция не может использоваться для локальных клиентов, не связанных с базой данных. Некоторые отличия этой функции от LoadModule, а также особенности поведения модуля и формы, открытых этой функцией:

  • Система пытается автоматически блокировать загружаемый объект. После блокировки объект, если он не является новым, будет загружен заново из базы данных, чтобы исключить вероятность устаревания информации. При закрытии формы, система автоматически разблокирует объект, если он был заблокирован.
    • При открытии объекта в режиме просмотра блокировка оного не производится, открытому таким образом объекту присваивается признак, не разрешающий его запись в базу данных (см. DB.Save).
  • В открытом модуле объект доступен с помощью комбинации Form.Object, которая будет работать корректно даже до того, как форма была загружена (к примеру, внутри функции OnOpen после загрузки модуля).
  • Статус объекта (флаг того, что он был модифицирован, дата его периодических реквизитов, его строковое представление и пр.) задает заголовок открытой формы по умолчанию. При изменении свойств объекта (к примеру после записи объект теряет флаг модифицированности), заголовок меняется автоматически.
  • Если в объекте присутствует по крайней мере один периодический реквизит, в заголовок формы будет также добавлена дата загрузки периодических реквизитов. Изменение периода загрузки реквизитов с помощью функции DB.UsePeriod автоматически обновит представление данных реквизитов на форме.
  • Модуль и форма, используемые системой по умолчанию задаются в Студии и зависят от типа открываемого объекта. К примеру, для элемента может использоваться одна форма по умолчанию, а для папки другая.

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

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

Синтаксис

OpenObject(<Объект базы данных (DB)>,<Режим просмотра (INT)>,<Способ вызова (INT)>,<Параметр>,<Опция>,<Имя модуля (STRING)>,<Имя формы (STRING)>):<Результат модального выполнения>

Аргументы

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

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

Функция возвращает значение переменной ModalResult, которая доступна для изменения в вызываемом модуле. Переменная будет возвращена только в случае, если модуль вызывается в модальном режиме. Если объект открывался в режиме редактирования (<Режим просмотра>=0), функция может возвратить сл. строки:

  • "LOCKED@RO" (только для режимов <Способ вызова> 1 или 2), если объект заблокирован другим пользователем и текущий пользователь решил открыть его в режиме просмотра.
  • "LOCKED@CL" (для любых режимов <Способ вызова>), если объект заблокирован другим пользователем и текущий пользователь отказался от попытки его открыть (отменил функцию загрузки объекта).

Примеры

//Открывается документ аДок в режиме редактирования, если он уже не был открыт, иначе произойдет активация открытого документа.
OpenObject(аДок,0,1);


//Родитель текущего элемента справочника открывается для редактирования, при этом, если попытка открытия удалась, текущий элемент закрывается (если он не был изменен и не новый).
if OpenObject(Эл.Parent(),0,1)="LOCKED@CL" then
  Exit;
ElseIf Эл.Selected()=1 Then
  Form.Close(0);
Endif;