Передача даты начала задачи в пользовательское поле

Здравствуйте! Добавил пользовательское поле в карточку "Продукт в Продаже" - тип Дата. Как сделать настройку, чтобы при добавлении продукта в детали продукты Раздела "Продажи" при открытии карточки "Продукт в продаже" вышеназванное пользовательское поле заполнялось значением из поля "Дата начала" этой Продажи.

Нравится

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

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

Реализовать такой функционал с помощью пользовательских полей - нельзя.
Вам необходимо:

1) Удалить это пользовательское поле.
2) Создать поле с типом дата в таблице этой карточки - tbl_Offering, используя Террасофт Администратор
3) Добавить это поле в сервис select query этой карточки - sq_OfferingInTask.
4) Добавить это поле в датасет - ds_OfferingInTask
5) Добавить это поле в карточку - wnd_OfferingInTaskEdit
5) На событии OnPrepare этой карточки прописать следующую логику:

if(Window.Attributes('IsNew') == true)
{
var ParentTaskID = Self.Attributes('ParentRecordID');
var TaskDS = Services.GetNewItemByUSI('ds_Task');
ApplyDatasetIDFilter(TaskDS, ParentTaskID, true);
TaskDS.Open();
var MyDate = TaskDS('MyDateFromTask');
edtMyDateField.DataField.Value = MyDate;
TaskDS.Close(); 
}

где MyDateFromTask - имя поля с датой из реестра задач;
edtMyDateField - имя контрола с датой в карточке редактирования продукта в задаче;

Извиняюсь, спутал разделы. Правильный текст ниже.
Здравствуйте! Добавил пользовательское поле в карточку "Продукт в Продаже" - тип Дата. Как сделать настройку, чтобы при добавлении продукта в детали продукты Раздела "Продажи" при открытии карточки "Продукт в продаже" вышеназванное пользовательское поле заполнялось значением из поля "Дата начала" этой Продажи.
Этот же алгоритм применять?

Александр, здравствуйте!

Да, опять таки с помощью пользовательского поля этот функционал реализовать не получится.
Создайте это поле через ТС Администратор по алгоритму в первом сообщении, и далее на событии OnPrepare карточки продукта в продаже:

if(Window.Attributes('IsNew') == true)
{
var ParentOpportunityID = Self.Attributes('ParentRecordID');
var OpportunityDS = Services.GetNewItemByUSI('ds_Opportunity');
ApplyDatasetIDFilter(OpportunityDS, ParentOpportunityID, true);
OpportunityDS.Open();
var MyDate = OpportunityDS('MyDateFromOpportunity');
edtMyDateField.DataField.Value = MyDate;
OpportunityDS.Close(); 
}

где MyDateFromOpportunity - имя поля "Дата начала" в датасете продаж (ds_Opportunity),
edtMyDateField - имя контрола добавленного поля в карточку "продукты в продаже" с датой.

Дмитрий, сделал всё по Вашему алгоритму, но после внесенных изменений при нажатии кнопки "Добавить" на детали "Продукты"в разделе Продажи открывается окно, где все реквизиты недоступны для редактирования. В файле скрин окна карточки продукта. Может что то не так сделал?

Явно что-то не так сделали. Причем мой код не мог "задисейблить" все поля карточки в принципе.
Попробуйте откатить изменения, воспроизведется ли ошибка?
Также, предоставьте, пожалуйста, полный исходный код карточки.

Откатил изменения - убрал с события OnPrepare карточки продукта в продаже скрипт.
Карточка заработала.

Дмитрий, прошу прощения за нелогичное изложение проблемы, но дело в том, что изменения нужно внести в программу Terrasoft Sales версии 3.3.1.104. Вышеназванные рекомендации пробовал вносить в версии CRM 3.3.4.
Когда же открыл администратор в Terrasoft Sales версии 3.3.1.104, то оказалось, что wnd_OfferingInOpportunityDetailEdit в этой версии нет. При добавлении продукта в Sales открывается окно wnd_OfferingDetailEdit. Вопрос остается прежним. Как в программе Terrasoft Sales версии 3.3.1.104 в карточку Продукта в продаже передать значение даты из Продажи?

Здравствуйте.
Вам необходимо в таблицу tbl_OfferingInOpportunity добавить новое поле с типом Дата, к примеру, NewDate.
Далее, добавьте выборку этого поля в сервисе sq_OfferingInOpportunity.
Далее, добавьте данное поле в источник данных ds_OfferingInOpportunity.

Далее, откройте карточку wnd_OfferingDetailEdit и добавьте новое поле DateTimeDataControl. Свойство DatasetLink
заполните как dlData, а в свойство DataFieldName вручную впишите имя добавленного поля - NewDate.

Далее, перейдите на событие OnPrepare этой карточки и в конец функции обработчика этого события добавьте следующий код:

if(Window.Attributes('IsNew') == true)
	{
		var ParentOpportunityID = Self.Attributes('ParentItemID');
		var OpportunityDS = Services.GetNewItemByUSI('ds_Opportunity');
		ApplyDatasetIDFilter(OpportunityDS, ParentOpportunityID, true);
		OpportunityDS.Open();
		var MyDate = OpportunityDS('StartDate');
		edtNewDate.DataField.Value = MyDate;
		OpportunityDS.Close(); 
	}

Но, обращаю внимание, что карточка редактирования общая для продукта в документе, счете, продаже и т.д. А добавленное поле в карточку работать будет лишь для продукта в продаже. Соответсвенно, будет логичным написание доп. логикы для отображения данного поля только для того случая, если добавляемая(или открываемая) запись - это продукт в продаже.

Добрый день! Внес изменения, в разделе Продажи все отменно работает! Спасибо!
Единственное, как Вы правильно заметили, Дмитрий, логика скрипта не срабатывает, например в разделе счета. Выдает ошибку:
Ошибка выполнения метода 'wnd_OfferingDetailEditOnPrepare'. 'edtStartDateInOpportunity.DataField' - есть null или не является объектом.
Было бы замечательно, если бы посоветовали как победить эту беду.

Здравствуйте еще раз, Александр.

Замените код на следующий:

if(Window.Attributes('IsNew') == true )
	{
		var ParentOpportunityID = Self.Attributes('ParentItemID');
		var OpportunityDS = Services.GetNewItemByUSI('ds_Opportunity');
		ApplyDatasetIDFilter(OpportunityDS, ParentOpportunityID, true);
		OpportunityDS.Open();
		var MyDate = OpportunityDS('StartDate');
		try{
		edtNewDate.IsVisible = true;
		edtNewDate.DataField.Value = MyDate;}
		catch(e) { edtNewDate.IsVisible = false; };
		OpportunityDS.Close(); 
	}

Здравствуйте, Дмитрий! Всё работает! Большое спасибо за добрый совет и помощь! Очень приятно работать с Terrasoft!

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