Формулировка проблемы: для упрощения процесса разработки приложений на базе Synergy необходимо изменить интерфейс конфигуратора на оболочку Synergy IDE.
Связанные задачи:
Решение:
В данной задаче описаны:
Перемещение доступно как для самих объектов приложения, так и для его папок, за исключением:
корневой ноды приложения;
дочерних групп пользователей;
дочерних групп реестров;
скриптов объектов: компонентов форм, пользовательских компонентов, скриптов интерпретатора.
Дочерние группы перемещаются только при перемещении соответствующей корневой группы. Скрипты объектов перемещаются только при перемещении соответствующего объекта.
Папки приложения перемещаются только внутри приложения.
Для всех объектов приложения, кроме указанных выше, необходимо добавить новый пункт контекстного меню "Переместить" (выше пунктов "Удалить"/"Скрыть", если они есть) с подпунктами:
"В текущем приложении"
"В приложение": в свою очередь содержит подпункты - наименования приложений, на которые у текущего пользователя есть право "Изменение", исключая текущее приложение. Если таких приложений нет, то подпункт "В приложение" заблокирован.
Для папок необходимо добавить только пункт "Переместить" без подпунктов, поскольку перемещение папок между приложениями не выполняется.
Перемещение объектов в пределах одного приложения фактически означает изменение его родительской папки. При этом сам перемещаемый объект и его связи с другими объектами не изменяются.
Для перемещения объектов SAD в контекстном меню нужного объекта выбирает пункт "Переместить" - "В текущем приложении". Открывается диалоговое окно "Выберите папку", содержащее дерево папок приложения и кнопку "Переместить":
Дерево по умолчанию развернуто на один уровень: отображены папки, располагающиеся непосредственно в корне приложения. Выделена корневая нода приложения.
Другие объекты приложения, кроме папок, в этом дереве не отображаются.
SAD выбирает в дереве целевую папку или корневую ноду приложения и нажимает на кнопку "Переместить". Возможно выполнение альтернативный потоков 1-3.
В случае успешного перемещения дерево приложения в навигаторе изменяется: объект перестает отображаться в исходной папке, отображается в целевой. При этом свойства объекта и его связи с другими объектами не изменяются.
Если для перемещения была выбрана папка приложения, то она перемещается вместе со всеми объектами приложения, которые в ней располагаются, и дочерними папками.
Альтернативный поток 1. В целевой папке содержится папка с таким же наименованием, как у перемещаемой папки.
Система отображает сообщение об ошибке с текстом: "Папка с таким наименованием уже присутствует в указанной папке", перемещение не выполняется, диалог не закрывается.
Альтернативный поток 2. Целевая папка является дочерней для перемещаемой папки.
Система отображает сообщение об ошибке с текстом: "Перемещение папки в ее дочернюю папку не допускается", перемещение не выполняется, диалог не закрывается.
Альтернативный поток 3. В качестве целевой папки указывается сама перемещаемая папка.
Система отображает сообщение об ошибке с текстом: "Перемещение папки в саму себя не допускается", перемещение не выполняется, диалог не закрывается.
Поскольку объекты разных приложений не могут взаимодействовать между собой и ссылаться друг на друга, при перемещении объектов между приложениями необходимо учитывать связи между объектами таким образом, чтобы после перемещения связанные объекты не оказались в разных приложениях.
Объект перемещается вместе со всеми своими зависимостями таким образом, что функциональность объекта при его перемещении в другое приложение не меняется.
Примечание:
В случае, если в приложении многие объекты зависят друг от друга, при попытке переноса одного из объектов, внешне не имеющего никаких зависимостей - например, пользовательского компонента - совместно с ним может быть перенесена большая часть других объектов приложения. В случае с пользовательским компонентом будут перенесены все ВМК, использующие этот компонент, и все формы, на которых этот компонент размещен. Формы, в свою очередь, повлекут перемещение всех объектов, на которые ссылаются компоненты форм, а также все реестры и/или карточки, использующие эти формы. Таким образом, возникает сильно связанный "снежный ком", разъединить который при переносе невозможно, и это не является ошибкой Synergy.
При возникновении такой ситуации рекомендуется отложить задачу переноса объектов и провести предварительный рефакторинг приложения, максимально разделяя объекты.
Если же в силу логических взаимосвязей разделение объектов произвести невозможно, то имеет смысл располагать их в одном приложении.
Для перемещения объектов из текущего в другое приложение SAD в контекстном меню нужного объекта выбирает пункт "Переместить" - "В приложение", далее выбирает подпункт с наименованием целевого приложения.
Открывается диалоговое окно "Выберите перемещаемые объекты", содержащее дерево объектов приложения и кнопку "Далее":
По умолчанию в дереве выделены:
выбранный для перемещения объект, у которого было вызвано контекстное меню;
все объекты, на которые ссылается выбранный объект (зависимости "вниз");
все объекты, которые содержат ссылки на выбранный объект (зависимости "вверх");
для всех объектов, выделенных по зависимостям - в свою очередь, их зависимости "вниз" и "вверх".
Снять выделение с объектов, выделенных по умолчанию, невозможно.
При необходимости SAD может дополнительно выделить другие объекты, которые необходимо переместить.
Выделение папок недоступно.
По нажатию на кнопку "Далее" в диалоге отображается дерево приложения, выбранного в пункте контекстного меню, и кнопка "Переместить":
Вид дерева такой же, как и в случае перемещения объектов в пределах одного приложения: отображены только папки приложения и его корневая нода, дерево развернуто на один уровень, выделена корневая нода приложения.
SAD выбирает одну папку, в которую будут перемещены все объекты, выделенные на предыдущем шаге.
В результате перемещения все выделенные объекты располагаются непосредственно в целевой папке выбранного приложения, вне зависимости от их расположения в исходном приложении. При этом все свойства и связи перемещенных объектов сохраняются.
Зависимости перемещаемого объекта "вниз" определяются по тем же правилам, как и в случае импорта этого объекта с зависимостями.
Сущности, объекты которых проверяются для выявления ссылок на выбираемый объект в зависимости от сущности этого объекта:
Справочник:
формы, в которых есть компоненты, ссылающиеся на этот справочник;
Форма:
реестр этой формы;
типы документов, использующих эту форму;
карточка пользователей, карточка должностей и карточка подразделений, использующие эту форму;
шаблоны документов, в которых использована эта форма;
шаблоны маршрутов, в которых используется тип действия "Условный переход" с этой формой в качестве источника данных;
Реестр:
формы, в которых есть компонент "Ссылка на реестр", где используется выбранный реестр;
реестры, где выбранный реестр указан в качестве реестра ответа;
действия по сотрудникам и действия по резерву, в которых используется выбранный реестр;
группы реестров, в которые входит выбранный реестр;
пользовательские отчеты, в которых в качестве модуля указан этот реестр;
Группа реестров:
все группы реестров, дочерние для выбранной группы;
если группа является корневой, то все ее дочерние группы;
если группа не является корневой, то:
ее родительские группы вплоть до корневой группы;
все дочерние группы выделенных родительских групп;
Шаблон маршрута:
реестры, в маршрутах которых используется тип действия "Запуск маршрута по шаблону" или "Условный переход", где указан этот шаблон;
шаблоны маршрутов, в которых используется тип действия "Запуск маршрута по шаблону" или "Условный переход", где указан выбранный шаблон;
типы документов, в которых указан выбранный шаблон маршрута;
Счетчик:
шаблоны номеров, использующие этот счетчик;
Шаблон номера:
журналы, использующие этот шаблон номера;
формы, в которых есть компонент "Номер", ссылающийся на этот шаблон номера;
Журнал:
типы документов, в которых указан выбранный журнал;
Тип документа:
реестры, в которых указан этот тип документа;
шаблоны документов, в которых указан этот тип документа;
Карточка пользователей, карточка должностей, карточка подразделений:
шаблоны маршрутов, в которых есть тип действия "Копирование в карточку", и указан идентификатор выбранной карточки;
реестры, в маршрутах которых есть тип действия "Копирование в карточку", и указан идентификатор выбранной карточки;
действия по сотрудникам и по резерву, где выбранная карточка пользователя используется в сопоставлении;
Группа пользователей:
реестры, в которых используется выбранная группа (непосредственно или в качестве прав на фильтры реестра);
типы документов, в которых указана выбранная группа;
карточки пользователей, создаваемых для этой группы;
пользовательские отчеты, доступные этой группе;
все группы пользователей, дочерние для выбранной группы;
если группа является корневой, то все ее дочерние группы;
если группа не является корневой, то:
ее родительские группы вплоть до корневой группы;
все дочерние группы выделенных родительских групп;
ПК:
ВМК, которые используют этот ПК;
формы, в которых ПК использован в качестве компонента;
Скрипт интерпретатора:
реестры, в маршрутах которых есть тип действия "Блокирующий процесс", где указан этот скрипт);
шаблоны маршрутов, в которых есть тип действия "Блокирующий процесс", где указан этот скрипт).
Для ВМК, внешних модулей, действий по сотрудникам и по резерву, пользовательских отчетов не может быть объектов, которые от них зависят.
При перемещении группы пользователей эта группа удаляется из прав на приложение.
Ссылки проверяются рекурсивно для каждого объекта, выделенного вручную или выделенного по зависимостям.