Переход на создание нового проекта

Добрый день,

Стоит такая задача:

При создании и сохранении нового Договора появляется запрос "Вы желаете создать Проект по этому договору", при положительном ответе открывается карточка редактирования Проекта с перенесенными некоторыми данными (название договора, дата)

Возможно есть какие-то примеры подобных решений?

Нравится

19 комментариев

Здравствуйте, Елена!

Решить Вашу задачу можно настроив простой бизнес-процесс следующего вида:

1) Открытие карточки редактирования договора;
2) Вопрос пользователю;
3) Открытие карточки редактирования проекта.

Подробно о создании БП можно прочитать в Руководстве администратора
(раздел "Автоматизация бизнес-процессов").

Возможно Вам так-же будет полезен видеоурок по созданию БП.

Касательно автоматического запуска БП по событию, то данная тема обсуждалась в следующих темах:
http://www.community.terrasoft.ru/forum/topic/2390
http://www.community.terrasoft.ru/forum/topic/7109

С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft

Здравствуйте, Елена!

Рекомендуется передавать информацию в атрибуты открываемой карточки, если она Вами вызывается функцией ShowEditWindowEx.

Пример можно посмотреть в функции CreateContract() в скрипте wnd_OpportunitiesWorkspaceScript

Спасибо за помощь!

Создала бизнес процесс, но есть 2 вопроса:

1) Когда и куда прописывать код для переноса значений из одной карточки в другую?
2) После закрытия договора, поставила действие "вопрос пользователю", который адекватно работает только в таком виде
й

Можно ли убрать radiobox, оставить только вопрос и кнопки ОК, Отмена и, при этом, в бизнес процессе следующий шаг прописать только на результат ОК?

Здравствуйте, Елена!

1) Передача парматеров между элементами БП обсуждалась в следующих темах:
http://www.community.terrasoft.ru/blogs/7310
http://www.community.terrasoft.ru/forum/topic/8647
http://www.community.terrasoft.ru/forum/topic/8608
http://www.community.terrasoft.ru/forum/topic/8631

2) К сожалению в базовой конфигурации такой вид вопроса пользователю не реализован.

С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft

Спасибо, Илья

Прочитала все темы по передачи параметров, но мне все равно не яснен механизм передачи значений от одного действия к другому. Например, как получить данные из поля Клиент в карточке договора и поместить ее в новую карточку проекта при открытии?

Так же сталкнулась с такой проблемой:

Вот часть моей диаграммы

1

В Атрибутах окна для договора (действие открытие нового договора) прописано пока 2 параметра, название договора и ответственный

2

Хочу в атрибутах окна для проекта (действие открытие нового проекта) прописать, что поле Ответственный равен параметру OwnerID, при нажатии на кнопку Добавить выдает ошибку

"Ошибка выполнения метода 'wnd_ShowCustomWindowFieldEditOnPrepare'. Дублируется значение свойства 'Caption'. Значение 'PercentIncome' уже существует"

Что я не так делаю?

Здравствуйте, Елена!

Передача параметров происходит следующим образом:

В первой карточке "Открытие окна" необходимо добавить параметр в раздел "Соответствие поля диаграммы полям данных окна" параметр "ContactID" и отметить пункт "Сохранить введённое значение после закрытия карточки"

Во втором "Открытии Окна" необходимо получить этот параметр из ранее сохраннёного значения.


Это должно решить обе Ваши проблемы.

С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft

Илья,

возможно я что-то не так делаю, но у меня в принципе таких окон редактирования нет. При нажатии на действие Открытие окна появляется какая форма:

1

2

И если в первом открытие я могу ставить соответствия полей и атрибутов, то для окна проекты возникает ошибка (описано выше),

Так же вопрос, как в бизнес процессе указать шаг : перейти в раздел Проекты и активировать деталь Команда?

Как по мне, то создавать бизнес-процесс для двух-трех действий -- это не очень правильно. Возможно, я ошибаюсь -- но такую задачу я решила бы следующим образом.

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

function CreateInvoice() {
	var EditWindowUSI = 'wnd_InvoiceEdit';
	var Attributes = GetNewDictionary();
	var OpportunityID = BaseWorkspace.GridDataset.Values('ID');
	var CurrentDate = new Date(System.Now());
	Attributes.Add('RecordID', GUID_NULL);		
	Attributes.Add('NotifyObject', Self);
	var DefaultValues = GetNewDictionary();	
	DefaultValues.Add('OpportunityID', OpportunityID);
	var Dataset = BaseWorkspace.GridDataset;
	var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID');
	DefaultValues.Add('CustomerID', CustomerID);
	var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID');
	DefaultValues.Add('ContactID', ContactID);
	DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
	var CampaignID = GetFieldValueFromDisabledField(Dataset, 'CampaignID');
	DefaultValues.Add('CampaignID', CampaignID);
	Attributes('IsCreatedByOpportunityID') = OpportunityID;
	var ProjectID = GetFieldValueFromDisabledField(Dataset, 'ProjectID');
	DefaultValues.Add('ProjectID', ProjectID);
	ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);	
}

Потом, при закрытии карточки счета, в функции btnOKOnClick(Control) идет проверка, не создан ли этот документ из Продаж (атрибут IsCreatedByOpportunityID) -- и если да, то предлагает перейти к созданному счету:

       var IsCreatedByOpportunityID= Self.Attributes('IsCreatedByOpportunityID');
 	if (IsCreatedByOpportunityID) {
		if (ShowConfirmationDialog("Перейти к созданному счету?") == wmrYes) {
	 		GotoWorkspace('wnd_InvoicesWorkspace', BaseDBEdit.RecordID);
		}
	 }

Если нужно открыть нужную деталь при этом, то следует добавить, после функции GotoWorkspace, следующие строчки:

   var MainWindow = Connector.Attributes('MainWindow');
   var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_InvoicesWorkspace');
   var pcDetails = WorkspaceWindow.ComponentsByName('pcDetails');
   pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgDetail'); //название нужной детали

К чему я веду. Все, что нужно для Вашей задачи -- это добавить вопрос "Создать проект по договору?" при закрытии карточки договора, т.е. в функцию btnOKOnClick Договора, причем сделать еще доп.проверку, чтобы запись была новая, например, так:

if (dlData.Dataset.State == dstInsert) {
		if (ShowConfirmationDialog("Создать проект по договору?") == wmrYes) {
	 		CreateProject();
		}
	 }

,
а дальше -- по аналогии, как я расписала создание счета: создать проект, передать туда нужные значения, а при его закрытии -- проверить, не создавался ли он из договора, и если да --то перейти в нужный раздел.

Желаю удачи!
С уважением, Ольга Прилипко

Спасибо, Ольга

прописала на функцию btnOKOnClick Договор скрипт, проверка if (dlData.Dataset.State == dstInsert) не работает в принципе

Создала функцию CreateProject() в скрипте wnd_ContractsWorkspaceScript (по аналогии), как его подвязать к скрипту btnOKOnClick договора? Так

if (ShowConfirmationDialog("Создать проект по договору?") == wmrYes) {
                        CreateProject();
                }

Выдает ошибку "Предполагается наличие объекта"

функцию CreateProject() нужно создать в этом же скрипте, т.е. в wnd_ContractEditScript.
проверка (dlData.Dataset.State == dstInsert) может не работать, если Вы написали код после базового scr_BaseDBEdit.btnOKOnClick(Control) -- потому что уже датасет сохранился и определить, в каком он был режиме (вставка или редактирование) уже нельзя.

Ну что-то у меня получилось=)

После создания нового договора, идет вопрос пользователю, после чего открывается проект с занесенными значениями из договора, но окно редактирования проекта не активировано, т.е. на первом плане общее окно Террасофта и приходится переключатся на карточку редактирования

1) Как сделать карточку проекта активной?

Далее в проекте. Значения с договора то оно перенесло, а вот значения полей, Состояние,Тип, которые должны браться из справочника, пустуют, хотя если создавать проект напрямую из раздела, там все подтягивается
11

2) как добавить значения из справочников назад к полям?

На btnOKOnClick проекта добавила код

...
	var IsCreatedByProjectID= Self.Attributes('IsCreatedByProjectID');
        if (IsCreatedByProjectID) {
                if (ShowConfirmationDialog("Перейти к созданному проекту?") == wmrYes) {
                        GotoWorkspace('wnd_ProjectWorkspace', BaseDBEdit.RecordID);
                        var MainWindow = Connector.Attributes('MainWindow');
   var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI','wnd_ProjectWorkspace');
   var pcDetails = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail');
   pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail'); 
 
 
                }
         } 
 
	return Result;	
 
 
}

Не происходит вообще ничего, т.е. при нажатии ОК даже карточка редактирования не закрывается.

3) как это исправить?

"Перепечай Елена" написал:1) Как сделать карточку проекта активной?

где именно Вы написали код создания проекта? До базовой scr_BaseDBEdit.btnOKOnClick(Control) или после? я бы в конце прописала бы, т.е. после всего "базового", либо вообще на афтерпост датасета перенесла бы.
потому что если написать "до", то что происходит: сначала открывается карточка счета, потом идет сохранение договора. А по логике вещей нужно сначала одно закончить (договор), потом начинать другое (проект). даже странно, что оно у Вас на ИДшник договора не ругалось, ведь если договор новый и еще не сохранился в базу -- то его ИДшки еще нет "в природе" -- а Вы создаете проект, где указываете эту ИД...
"Перепечай Елена" написал:2) как добавить значения из справочников назад к полям?

Все должно нормально подтягиваться. Напишите, на всякий случай, Вашу функцию создания проекта -- может, что-то там недописано...

А насчет того, что у Вас не закрывается проект -- опять-таки, нужно смотреть, где Вы написали код и правильно ли передали атрибут. Насколько я вижу, Вы прописали это перед строчкой

return Result;  

Попробуйте написать в блоке

if (Result){

, т.е. выше. или даже перед этим блоком. И, я еще заметила, Вы исправили строчку

var pcDetails = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail');

как раз тут нужно было оставить исходный вариант

var pcDetails = WorkspaceWindow.ComponentsByName('pcDetails');

, а название своей детали писать позже.

В общем, Елена, что сделайте:
1) проверьте, чтобы функция создания проекта вызывалась ПОСЛЕ сохранения Договора (если в бтнОкОнКлик -- то после вызова базового метода, если не в этой функции -- то на афтерпосте датасета: окно -- невизуальные компоненты -- длДата -- методы -- АфтерПост)
2) посмотрите, чтобы название атрибута IsCreatedByProjectID и в ф-ции создания проекта, и при проверке в самом проекте (на кнопке Ок) были одинаковые, я имею ввиду их имена. Вообще, по идее, атрибут должен называться IsCreatedByContractID, а не IsCreatedByProjectID -- но это уже Ваше дело, как его называть..
3) перепроверьте, где Вы размещаете проверку, что окно создано из договора (как я написала выше). Я бы посоветовала еще отладчик, поставить дебаггер на начало кнопки Ок и смотреть, как оно "идет" и какие значения получаются.

Если сами не разберетесь -- напишите сюда, что у Вас получилось/не получилось. И тело функции CreateProject() тоже выложите.
Желаю удачи!:smile:
С уважением, Ольга Прилипко

Ольга,

Если я прописываю код создания проекта после базового scr_BaseDBEdit.btnOKOnClick(Control или в функции афтерпост, то вообще ничего не происходит, проверка if (dlData.Dataset.State == dstInsert) дает false.

Создание проекта:

function CreateProject() {
        var EditWindowUSI = 'wnd_ProjectEdit';
        var Attributes = GetNewDictionary();
 
        var CurrentDate = new Date(System.Now());
        Attributes.Add('RecordID', GUID_NULL);          
       // Attributes.Add('NotifyObject', Self);
        var DefaultValues = GetNewDictionary(); 
 
        var Dataset = dlData.Dataset;//BaseWorkspace.GridDataset;
        var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID');
        DefaultValues.Add('ClientID', CustomerID);
        var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID');
        DefaultValues.Add('ContactID', ContactID);
        DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
 
        var OpportunityID = GetFieldValueFromDisabledField(Dataset, 'OpportunityID');
        DefaultValues.Add('OpportunityID', OpportunityID);
        var CompaingID = GetFieldValueFromDisabledField(Dataset, 'CompaingID');
        DefaultValues.Add('CompaingID', OpportunityID);
 
        ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); 
 }

То что я дописала после создания проекта на кнопку ОК:

if (Result){	
	var IsCreatedByContractID= Self.Attributes('IsCreatedByContractID');
        if (IsCreatedByContractID) {
                if (ShowConfirmationDialog("Перейти к созданному проекту?") == wmrYes) {
                        GotoWorkspace('wnd_ProjectWorkspace', BaseDBEdit.RecordID);
                        var MainWindow = Connector.Attributes('MainWindow');
   var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_ProjectWorkspace');
   var pcDetails = WorkspaceWindow.ComponentsByName('pcDetail');
   pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail'); 
 
 

Больше никаких изменений в код не вносила, но проблемы остались те же

"Перепечай Елена" написал:Если я прописываю код создания проекта после базового scr_BaseDBEdit.btnOKOnClick(Control или в функции афтерпост, то вообще ничего не происходит, проверка if (dlData.Dataset.State == dstInsert) дает false.

Я уже писала, почему так происходит:
"Ольга Прилипко" написал:проверка (dlData.Dataset.State == dstInsert) может не работать, если Вы написали код после базового scr_BaseDBEdit.btnOKOnClick(Control) -- потому что уже датасет сохранился и определить, в каком он был режиме (вставка или редактирование) уже нельзя.

можно поступить следующим образом: сохранить значение состояния датасета в переменную IsNew ДО базового сохранения, а потом уже его проверять:

...
var IsNew = (dlData.Dataset.State == dstInsert);
...
scr_BaseDBEdit.btnOKOnClick(Control)
...
if (IsNew) {
...

насчет атрибута IsCreatedByContractID -- Вы же его не передали при создании этого проекта:

function CreateProject() {
        var Dataset = dlData.Dataset; //
        var EditWindowUSI = 'wnd_ProjectEdit';
        var Attributes = GetNewDictionary();    
        var CurrentDate = new Date(System.Now());
        Attributes.Add('RecordID', GUID_NULL);          
       Attributes.Add('IsCreatedByContractID', dlData.Dataset('ID')); //вот здесь идет передача атрибутов. этому атрибуту мы даем значение=ИД записи договора
        var DefaultValues = GetNewDictionary(); 
        var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID'); 
        DefaultValues.Add('ClientID', CustomerID);
        var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID');
        DefaultValues.Add('ContactID', ContactID);
        DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);     
        ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); 
 }

теперь должно срабатывать.

Карточка редактирования стала активной, спасибо!

А вот с данными по умолчанию та же беда

Мой код CreateProject

function CreateProject(NewContractID) {
        var EditWindowUSI = 'wnd_ProjectEdit';
        var Attributes = GetNewDictionary();
       var Dataset = dlData.Dataset;
        var CurrentDate = new Date(System.Now());
 
        Attributes.Add('RecordID', GUID_NULL);
		Attributes.Add('IsCreatedByContractID', NewContractID);          
 
        var DefaultValues = GetNewDictionary(); 
 
 
        var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID');
        DefaultValues.Add('ClientID', CustomerID);
        var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID');
        DefaultValues.Add('ContactID', ContactID);
        DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
 
        var OpportunityID = GetFieldValueFromDisabledField(Dataset, 'OpportunityID');
        DefaultValues.Add('OpportunityID', OpportunityID);
        var CompaingID = GetFieldValueFromDisabledField(Dataset, 'CompaingID');
        DefaultValues.Add('CompaingID', OpportunityID);
 
        ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); 
 }

Параметр NewContractID передают из btnOKOnClick

var NewContractID =   dlData.Dataset('ID')

Функция на ОК карточки проекта

function btnOKOnClick(Control) {
	if (!WindowWasPrepared(Self)) {
        return;
    }
    var Dataset = dlData.Dataset;
    var IsAppend = (Dataset.State == dstInsert);
	var ProjectID = Dataset.Values('ID');
	var PlanningType = Dataset.Values('PlanningType');
	var EssenceType = Dataset.Values('EssenceType');
	if (EssenceType != petProject) {
    	var ParentProjectID = Dataset.Values('ParentProjectID');
		if (!IsActionAcceptedByProjectLock(new Array(ParentProjectID))) {
			return;
		}
	}
	var ActionsObject = GetActionsObjectByChangedDataFields(Dataset);
	var NearestParentID = Dataset.Values('NearestParentID');
	var Result = SaveChangesWithCheck(Self, BaseDBEdit,
		ActionsObject.ElementInMemoryNeedToBeUpdated);
	if (Result){
		if ((ActionsObject.NearestParentIDNeedToBeUpdated) && !IsAppend) {
			SetNearestParentIDToChilds(ProjectID, PlanningType, NearestParentID);
		}
		if (ActionsObject.ParentActualDatesNeedToBeUpdated) {
			SetParentProjectElementsActualDates(Dataset.Values('ID'), 
				Dataset.Values('ActualStartDate'), Dataset.Values('ActualDueDate'));
		}
		if (ActionsObject.ElementInMemoryNeedToBeUpdated) {
			SendMessageToParentWindows(Self, 'MSG_EDIT_ELEMENT_IN_COLLECTION', Dataset);
		}
		if (ActionsObject.ManhourDetailButtonsNeedToBeUpdated) {
			SendMessageToParentWindows(Self, 'MSG_UPDATE_MANHOUR_DETAIL_BUTTONS', Dataset);
		}
	    Self.IsVisible = false;
	    System.ProcessMessages();
		Self.Close();
		var NotifyObject = Self.Attributes('NotifyObject');
		if (Assigned(NotifyObject)) {
			NotifyObject.Notify(Self, MSG_AFTERCLOSE, null);
		}
 
		var IsCreatedByContractID= Self.Attributes('IsCreatedByContractID');
        if (IsCreatedByContractID) {
                if (ShowConfirmationDialog("Перейти к созданному проекту?") == wmrYes) {
                        GotoWorkspace('wnd_ProjectWorkspace', BaseDBEdit.RecordID);
                        var MainWindow = Connector.Attributes('MainWindow');
   var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_ProjectWorkspace');
   var pcDetails = WorkspaceWindow.ComponentsByName('pcDetail');
   pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail'); //название нужной детали
              }
         } 
 
     }
  return Result;
 
}

функции beforeOpen, AfterOpen для проекта не меняла.

Нужные параметры из карточки договора передаются, а вот те, что должны ставится по умолчанию из справочников, например Состояние, Тип не передаются

"Перепечай Елена" написал:Нужные параметры из карточки договора передаются, а вот те, что должны ставится по умолчанию из справочников, например Состояние, Тип не передаются

Елена, только что посмотрела, почему так. Дело в том, что в Проекте эти значения прописаны не на датасете или окне, а при нажатии на кнопку "создать (проект/стадию/работу)" в гриде Проектов.
Просмотрите функцию AddProjectRecord и SetDefaultValuesForProjectEssence в скрипте scr_ProjectCommonUtils -- и разберитесь, какие значения там передаются (тип, состояние, календарь и т.п.). Потом допишите их в свою функцию CreateProject.
Желаю удачи!
С уважением, Ольга Прилипко.

Пробовала 2 варианта:
1) Добавила содержимое функции SetDefaultValuesForProjectEssence в CreateProject

DefaultValues('EssenceType') = petProject;	
	DefaultValues('StateID') = GetProjectStateIDByFlags(petProject, true, false);
	DefaultValues('TypeID') = GetDefaultProjectTypeID(petProject);	
	DefaultValues('PlanningType') = pptByChildElements;
 

2) просто вызвала функцию SetDefaultValuesForProjectEssence в CreateProject.

Результат один и тот же. Теперь значения по умолчанию переносятся, а вот те что из карточки договора нет(((

+При нажатии ОК карты редактирования проекта появляется ошибка

"Ошибка выполнения метода 'btnOKOnClick'. 'Name' - есть null или не является объектом "

Никакое поле Nаme найти не могу, код кнопки выставляла в предидущем ответе

Елена, сделайте проще: добавьте в функцию CreateProject заполнение значений "Тип элемента", "Тип планирования" и др. после определения DefaultValues:

function CreateProject(NewContractID) {
    .......... 
        var DefaultValues = GetNewDictionary(); 
        DefaultValues.Add('EssenceType', 'Project');
        DefaultValues.Add('PlanningType', '{5D576142-CE74-4A8D-A4D6-BE52D5C8952E}');
   ...........
Показать все комментарии