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

В указанном справочнике страница редактирования "OpportunityStagePageV2", работает она понятно как, но как она вызывается не понятно.

Может у кого есть опыт с данным типом справочника?

Нравится

3 комментария
Лучший ответ

Здравствуйте!

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

Здравствуйте!

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

Через мастер деталей только.

Спасибо за ответы! Сам бы не за что не догадался

Показать все комментарии

Здравствуйте!

Имеется БП построенный на задачах.
Требуется закрыть для редактирования поля всех задач в одном бизнес-процессе. Поля необходимо закрыть все кроме дата завершения и ответственный.
Подскажите, более подробно, реализацию метода описанного в этой теме: https://community.terrasoft.ua/forum/topic/3864.
Как я понял из этой же темы через действия БП такой функционал не реализовать?

Нравится

2 комментария

Здравствуйте!
В tbl_Task есть поле WorkflowItemID, которое ссылается на таблицу tbl_WorkflowItem, в таблице tbl_WorkflowItem есть поле WorkflowID, которое является записью в tbl_Workflow
В tbl_Workflow есть поля DiagramServiceID,Name, по одному из которых мы можем сделать привязку и понять с какого БП мы создали задачу.
По сути нужно выполнить следующий запрос

SELECT Name FROM dbo.tbl_Workflow
WHERE id = (
		SELECT WorkflowID FROM dbo.tbl_WorkflowItem 
		WHERE ID = (SELECT WorkflowItemID from tbl_Task
		WHERE id = '{ID Задачи}')
		)

В конфигурации данные действия нужно делать через сервисы Dataset:
ds_WorkflowItem
ds_Workflow
Но перед этим их нужно немного доработать, а именно добавить в sq_WorkflowItem, параметр ID и CompareFilter ID
12
Далее на OnPrepare, карточки задачи (wnd_TaskEdit) мы можем делать не активными (свойство IsEnabled) соотвествующие поля

function wnd_TaskEditOnPrepare(Window) {
...
	if (!IsEmpty(WorkflowItemID))
	{
	var WorkflowID = GetDatasetFieldValueByID('ds_WorkflowItem',WorkflowItemID,'WorkflowID');
	var WorkflowName = GetDatasetFieldValueByID('ds_Workflow',WorkflowID,'Name');
		if  (WorkflowName == 'wd_TestTask')
			{
//нужные поля которые необходимо отключить, для примера поле Контрагент edtAccount
		    edtAccount.IsEnabled = false;
		    }
 
	}
} //end of function 

Алексей спасибо, все работает!

Показать все комментарии

Имеется такой вопрос: чем может грозить замена порядка Show-Prepare в функции

function ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues, UseCache) {
        if (IsUndefined(UseCache) || UseCache) {
                if (Assigned(Attributes)) {
                        var RecordID = Attributes('RecordID');
                        if (IsUndefined(RecordID) || RecordID == GUID_NULL) {
                                RecordID = EmptyStr;
                        }
                } else {
                        var RecordID = EmptyStr;
                }
                var EditWindow = WinCache_Get(EditWindowUSI, RecordID);
                if (!Assigned(EditWindow)) {
                        return;
                }
        } else {
                var EditWindow = Services.GetNewItemByUSI(EditWindowUSI);
        }
        SetAttributesByDictionary(EditWindow, Attributes);
        SetAttribute(EditWindow, 'DefaultValues', DefaultValues);
        EditWindow.Show();
        System.BeginProcessing();
        System.ProcessMessages();
        EditWindow.Prepare();
        System.EndProcessing();
        return EditWindow;
}

(скрипт scr_WindowUtils)
Замена следующая:

...
SetAttribute(EditWindow, 'DefaultValues', DefaultValues);
        System.BeginProcessing();
        System.ProcessMessages();
        EditWindow.Prepare();
        System.EndProcessing();
        EditWindow.Show();
        return EditWindow;
}

Нравится

2 комментария

Здравствуйте, Дмитрий!

Изменение последовательности Show-Prepare ничем страшным не грозит.

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

function ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues, UseCache,

ShowAfterPrepare) {

if ((!Services.AlwaysGetLastItemVersion) &&

(IsUndefined(UseCache) || UseCache)) {

if (Assigned(Attributes)) {

var RecordID = Attributes('RecordID');

if (IsUndefined(RecordID) || RecordID == GUID_NULL) {

RecordID = EmptyStr;

}

} else {

var RecordID = EmptyStr;

}

var EditWindow = WinCache_Get(EditWindowUSI, RecordID);

if (!Assigned(EditWindow)) {

return;

}

} else {

var EditWindow = Services.GetNewItemByUSI(EditWindowUSI);

}

SetAttributesByDictionary(EditWindow, Attributes);

SetAttribute(EditWindow, 'DefaultValues', DefaultValues);

if (!ShowAfterPrepare) {

EditWindow.Show();

}

System.BeginProcessing();

System.ProcessMessages();

EditWindow.Prepare();

System.EndProcessing();

if (!!ShowAfterPrepare) {

EditWindow.Show();

}

return EditWindow;

}

А в нужном для Вас месте вызываем эту функцию с ShowAfterPrepare=true. И получим последовательность выполнения Prepare, Show. Тогда как по всей системе останется Show, Prepare

Если же хотите, чтобы эта последовательность работала по всей системе, То можно реализовать функцию так как написали Вы. Ошибки могут возникнуть только в тех окнах, в которых есть обработчики событий OnShow, при этом в них инициализируются некоторые данные, которые используются в OnPrepare.

Terrasoft Support Team

Добрый день, Дмитрий!

Реализовать данную замену не рекомендуется. Функция ShowEditWindowEx используется для показа абсолютно всех окон редактирования в системе. В случае, если происходит показ окна редактирования, в котором необходимо показать пользовательские поля, то это может привести к нарушению размеров окна (исправить которое будет очень непросто, т.к. изменение размеров выполняется компонентом UserFieldsGroup из ядра системы).
Не совсем понятно, почему возник данный вопрос. При использовании достаточно быстрых машин промежуток времени с момента показа окна и до момента завершения обработчика OnPrepare достаточно невелик и незаметен пользователю.
Желаю успехов!

Показать все комментарии