Добрый день,
Стоит такая задача:
При создании и сохранении нового Договора появляется запрос "Вы желаете создать Проект по этому договору", при положительном ответе открывается карточка редактирования Проекта с перенесенными некоторыми данными (название договора, дата)
Возможно есть какие-то примеры подобных решений?
Нравится
Здравствуйте, Елена!
Решить Вашу задачу можно настроив простой бизнес-процесс следующего вида:
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
Спасибо, Илья
Прочитала все темы по передачи параметров, но мне все равно не яснен механизм передачи значений от одного действия к другому. Например, как получить данные из поля Клиент в карточке договора и поместить ее в новую карточку проекта при открытии?
Так же сталкнулась с такой проблемой:
Вот часть моей диаграммы

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

Хочу в атрибутах окна для проекта (действие открытие нового проекта) прописать, что поле Ответственный равен параметру OwnerID, при нажатии на кнопку Добавить выдает ошибку
"Ошибка выполнения метода 'wnd_ShowCustomWindowFieldEditOnPrepare'. Дублируется значение свойства 'Caption'. Значение 'PercentIncome' уже существует"
Что я не так делаю?
Здравствуйте, Елена!
Передача параметров происходит следующим образом:
В первой карточке "Открытие окна" необходимо добавить параметр в раздел "Соответствие поля диаграммы полям данных окна" параметр "ContactID" и отметить пункт "Сохранить введённое значение после закрытия карточки"
Во втором "Открытии Окна" необходимо получить этот параметр из ранее сохраннёного значения.
Это должно решить обе Ваши проблемы.
С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft
Илья,
возможно я что-то не так делаю, но у меня в принципе таких окон редактирования нет. При нажатии на действие Открытие окна появляется какая форма:


И если в первом открытие я могу ставить соответствия полей и атрибутов, то для окна проекты возникает ошибка (описано выше),
Так же вопрос, как в бизнес процессе указать шаг : перейти в раздел Проекты и активировать деталь Команда?
Как по мне, то создавать бизнес-процесс для двух-трех действий -- это не очень правильно. Возможно, я ошибаюсь -- но такую задачу я решила бы следующим образом.
Для примера рассмотрим процесс создания счета из меню действия--создать счет в разделе Продажи.
Сначала там вызывается функция CreateInvoice(), в которой через атрибуты и значения по умолчанию мы передаем необходимые величины (дату, клиента, продажу) в счет:
[javascript]
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);
}
[/javascript]
Потом, при закрытии карточки счета, в функции btnOKOnClick(Control) идет проверка, не создан ли этот документ из Продаж (атрибут IsCreatedByOpportunityID) -- и если да, то предлагает перейти к созданному счету:
[javascript]
var IsCreatedByOpportunityID= Self.Attributes('IsCreatedByOpportunityID');
if (IsCreatedByOpportunityID) {
if (ShowConfirmationDialog("Перейти к созданному счету?") == wmrYes) {
GotoWorkspace('wnd_InvoicesWorkspace', BaseDBEdit.RecordID);
}
}
[/javascript]
Если нужно открыть нужную деталь при этом, то следует добавить, после функции GotoWorkspace, следующие строчки:
[javascript]
var MainWindow = Connector.Attributes('MainWindow');
var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_InvoicesWorkspace');
var pcDetails = WorkspaceWindow.ComponentsByName('pcDetails');
pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgDetail'); //название нужной детали
[/javascript]
К чему я веду. Все, что нужно для Вашей задачи -- это добавить вопрос "Создать проект по договору?" при закрытии карточки договора, т.е. в функцию btnOKOnClick Договора, причем сделать еще доп.проверку, чтобы запись была новая, например, так:
[javascript]
if (dlData.Dataset.State == dstInsert) {
if (ShowConfirmationDialog("Создать проект по договору?") == wmrYes) {
CreateProject();
}
}
[/javascript],
а дальше -- по аналогии, как я расписала создание счета: создать проект, передать туда нужные значения, а при его закрытии -- проверить, не создавался ли он из договора, и если да --то перейти в нужный раздел.
Желаю удачи!
С уважением, Ольга Прилипко
Спасибо, Ольга
прописала на функцию btnOKOnClick Договор скрипт, проверка if (dlData.Dataset.State == dstInsert) не работает в принципе
Создала функцию CreateProject() в скрипте wnd_ContractsWorkspaceScript (по аналогии), как его подвязать к скрипту btnOKOnClick договора? Так
[javascript]
if (ShowConfirmationDialog("Создать проект по договору?") == wmrYes) {
CreateProject();
}
[/javascript]
Выдает ошибку "Предполагается наличие объекта"
функцию CreateProject() нужно создать в этом же скрипте, т.е. в wnd_ContractEditScript.
проверка (dlData.Dataset.State == dstInsert) может не работать, если Вы написали код после базового scr_BaseDBEdit.btnOKOnClick(Control) -- потому что уже датасет сохранился и определить, в каком он был режиме (вставка или редактирование) уже нельзя.
Ну что-то у меня получилось=)
После создания нового договора, идет вопрос пользователю, после чего открывается проект с занесенными значениями из договора, но окно редактирования проекта не активировано, т.е. на первом плане общее окно Террасофта и приходится переключатся на карточку редактирования
1) Как сделать карточку проекта активной?
Далее в проекте. Значения с договора то оно перенесло, а вот значения полей, Состояние,Тип, которые должны браться из справочника, пустуют, хотя если создавать проект напрямую из раздела, там все подтягивается

2) как добавить значения из справочников назад к полям?
На btnOKOnClick проекта добавила код
[javascript]
...
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;
}
[/javascript]
Не происходит вообще ничего, т.е. при нажатии ОК даже карточка редактирования не закрывается.
3) как это исправить?
"Перепечай Елена" написал:1) Как сделать карточку проекта активной?
где именно Вы написали код создания проекта? До базовой scr_BaseDBEdit.btnOKOnClick(Control) или после? я бы в конце прописала бы, т.е. после всего "базового", либо вообще на афтерпост датасета перенесла бы.
потому что если написать "до", то что происходит: сначала открывается карточка счета, потом идет сохранение договора. А по логике вещей нужно сначала одно закончить (договор), потом начинать другое (проект). даже странно, что оно у Вас на ИДшник договора не ругалось, ведь если договор новый и еще не сохранился в базу -- то его ИДшки еще нет "в природе" -- а Вы создаете проект, где указываете эту ИД...
"Перепечай Елена" написал:2) как добавить значения из справочников назад к полям?
Все должно нормально подтягиваться. Напишите, на всякий случай, Вашу функцию создания проекта -- может, что-то там недописано...
А насчет того, что у Вас не закрывается проект -- опять-таки, нужно смотреть, где Вы написали код и правильно ли передали атрибут. Насколько я вижу, Вы прописали это перед строчкой
[javascript]
return Result;
[/javascript]
Попробуйте написать в блоке
[javascript]
if (Result){
[/javascript]
, т.е. выше. или даже перед этим блоком. И, я еще заметила, Вы исправили строчку
[javascript]
var pcDetails = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail');
[/javascript]
как раз тут нужно было оставить исходный вариант
[javascript]
var pcDetails = WorkspaceWindow.ComponentsByName('pcDetails');
[/javascript]
, а название своей детали писать позже.
В общем, Елена, что сделайте:
1) проверьте, чтобы функция создания проекта вызывалась ПОСЛЕ сохранения Договора (если в бтнОкОнКлик -- то после вызова базового метода, если не в этой функции -- то на афтерпосте датасета: окно -- невизуальные компоненты -- длДата -- методы -- АфтерПост)
2) посмотрите, чтобы название атрибута IsCreatedByProjectID и в ф-ции создания проекта, и при проверке в самом проекте (на кнопке Ок) были одинаковые, я имею ввиду их имена. Вообще, по идее, атрибут должен называться IsCreatedByContractID, а не IsCreatedByProjectID -- но это уже Ваше дело, как его называть..
3) перепроверьте, где Вы размещаете проверку, что окно создано из договора (как я написала выше). Я бы посоветовала еще отладчик, поставить дебаггер на начало кнопки Ок и смотреть, как оно "идет" и какие значения получаются.
Если сами не разберетесь -- напишите сюда, что у Вас получилось/не получилось. И тело функции CreateProject() тоже выложите.
Желаю удачи!:smile:
С уважением, Ольга Прилипко
Ольга,
Если я прописываю код создания проекта после базового scr_BaseDBEdit.btnOKOnClick(Control или в функции афтерпост, то вообще ничего не происходит, проверка if (dlData.Dataset.State == dstInsert) дает false.
Создание проекта:
[javascript]
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);
}
[/javascript]
То что я дописала после создания проекта на кнопку ОК:
[javascript]
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');
[/javascript]
Больше никаких изменений в код не вносила, но проблемы остались те же
"Перепечай Елена" написал:Если я прописываю код создания проекта после базового scr_BaseDBEdit.btnOKOnClick(Control или в функции афтерпост, то вообще ничего не происходит, проверка if (dlData.Dataset.State == dstInsert) дает false.
Я уже писала, почему так происходит:
"Ольга Прилипко" написал:проверка (dlData.Dataset.State == dstInsert) может не работать, если Вы написали код после базового scr_BaseDBEdit.btnOKOnClick(Control) -- потому что уже датасет сохранился и определить, в каком он был режиме (вставка или редактирование) уже нельзя.
можно поступить следующим образом: сохранить значение состояния датасета в переменную IsNew ДО базового сохранения, а потом уже его проверять:
[javascript]
...
var IsNew = (dlData.Dataset.State == dstInsert);
...
scr_BaseDBEdit.btnOKOnClick(Control)
...
if (IsNew) {
...
[/javascript]
насчет атрибута IsCreatedByContractID -- Вы же его не передали при создании этого проекта:
[javascript]
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);
}
[/javascript]
теперь должно срабатывать.
Карточка редактирования стала активной, спасибо!
А вот с данными по умолчанию та же беда
Мой код CreateProject
[javascript]
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);
}
[/javascript]
Параметр NewContractID передают из btnOKOnClick
[javascript]
var NewContractID = dlData.Dataset('ID')
[/javascript]
Функция на ОК карточки проекта
[javascript]
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;
}
[/javascript]
функции beforeOpen, AfterOpen для проекта не меняла.
Нужные параметры из карточки договора передаются, а вот те, что должны ставится по умолчанию из справочников, например Состояние, Тип не передаются
"Перепечай Елена" написал:Нужные параметры из карточки договора передаются, а вот те, что должны ставится по умолчанию из справочников, например Состояние, Тип не передаются
Елена, только что посмотрела, почему так. Дело в том, что в Проекте эти значения прописаны не на датасете или окне, а при нажатии на кнопку "создать (проект/стадию/работу)" в гриде Проектов.
Просмотрите функцию AddProjectRecord и SetDefaultValuesForProjectEssence в скрипте scr_ProjectCommonUtils -- и разберитесь, какие значения там передаются (тип, состояние, календарь и т.п.). Потом допишите их в свою функцию CreateProject.
Желаю удачи!
С уважением, Ольга Прилипко.
Пробовала 2 варианта:
1) Добавила содержимое функции SetDefaultValuesForProjectEssence в CreateProject
[javascript]
DefaultValues('EssenceType') = petProject;
DefaultValues('StateID') = GetProjectStateIDByFlags(petProject, true, false);
DefaultValues('TypeID') = GetDefaultProjectTypeID(petProject);
DefaultValues('PlanningType') = pptByChildElements;
[/javascript]
2) просто вызвала функцию SetDefaultValuesForProjectEssence в CreateProject.
Результат один и тот же. Теперь значения по умолчанию переносятся, а вот те что из карточки договора нет(((
+При нажатии ОК карты редактирования проекта появляется ошибка
"Ошибка выполнения метода 'btnOKOnClick'. 'Name' - есть null или не является объектом "
Никакое поле Nаme найти не могу, код кнопки выставляла в предидущем ответе
Елена, сделайте проще: добавьте в функцию CreateProject заполнение значений "Тип элемента", "Тип планирования" и др. после определения DefaultValues:
[javascript]
function CreateProject(NewContractID) {
..........
var DefaultValues = GetNewDictionary();
DefaultValues.Add('EssenceType', 'Project');
DefaultValues.Add('PlanningType', '{5D576142-CE74-4A8D-A4D6-BE52D5C8952E}');
...........
[/javascript]