Суть вопроса проста, но к сожалению так и не смог разобраться как действует заполнение контактной информации Контакта, контактной информацией выбранного Контрагента.
Хочу сделать тоже самое с договорами...Нужно в случае выбора Контрагента заполнить поля договора регалиями котнрагента, хранящиеся в таблице Контрагент.

Прошу прощения за тавтологию. Пытался описать вопрос обширнее).

Нравится

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

scr_ContactAccountUtils
function FillInformationBySelectedItem(Dataset, LookupDataset, Message)
- это оно. Суть - проста. Говорим откуда тянуть данные, куда писать. Все через датасеты.

ООО "Лайнсервис"
www.ls-crm.ru

А в какой момент фактически инициируется функция заполнения?
Так как она не прикручена ни к контролу ни к датасету

function SelfOnDatasetDataChange(DataField) 

в скрипте scr_Contact

function SelfOnDatasetDataChange(DataField) {
....
if (DataField.Name == 'AccountID') {
  var LookupDataset = DataField.LookupDataset;
  if (!IsEmptyStr(DataField.DisplayValue)) {
	FillInformationBySelectedItem(Dataset,  LookupDataset, DoYouWantToFillContactEntriesMessage);
  }
  return;
}
...
}

при смене значения в поле AccountID
а прикручено оно к ds_Contact
ООО "Лайнсервис"
www.ls-crm.ru

Для начала попытался заполнить текстовое поле "CustomerFIO"(Имя заказчика) на форме Договор способом выбора "CustomerID"(Индификатор контрагента.
Для этого:

1) Добавил в scr_ContactAccountUtils свою функцию

function FillCustomerBySelectedItem(Dataset, LookupDataset, Message) {
    if (System.MessageDialog(Message, mdtConfirmation, mdbYes + mdbNo, 0)
		== mrYes) {
		if (!Assigned(LookupDataset)) {
			return
		}
		if (LookupDataset.State == dstInactive) {
			return
		}
		var ContactIDName = 'CustomerFIO';
   		var ContactID = GetFieldValueFromDisabledField(LookupDataset,
		   		ContactIDName); 
   	    Dataset.Values(ContactIDName) = ContactID;
    	}
}

2) Прикрутил scr_ContactAccountUtils к ds_ContractScript
3) Добавил в ds_ContractScript функцию

function SelfOnDatasetDataChange(DataField) {
	var Dataset = DataField.ParentDataFields.ParentDataset;
try {
	if (DataField.Name == 'CustomerID') {
	var LookupDataset = DataField.LookupDataset;
	if (!IsEmptyStr(DataField.DisplayValue)) {	FillCustomerBySelectedItem(Dataset, LookupDataset, 			DoYouWantToFillCustomerEntriesMessage);
			}
			return;
		}
		} finally {
	}
	DataChange(DataField);
}

4) Добавил в константы: DoYouWantToFillCustomerEntriesMessage
5)

РЕЗУЛЬТАТ: При запуске и выборе Контрагента TSCRM зависает...Не могу определить где она зацикливается.

"Швец Александр" написал:DataChange(DataField);

а вот здесь что происходит, может закомментить это?

кстати, дебаггером бы пройтись можно было, выяснить сразу где оно виснет)) еще вопрос такой - нет ли на визуальной части каких обработчиков на контролах?

ООО "Лайнсервис"
www.ls-crm.ru

Чтобы находить нужные функции в скриптах используйте scr_GrepSearch (запустите этот скрипт в администраторе).
Подозреваю, что DataChange(DataField) изменяет значение какого нибудь поля, что в свою очередь вызывает событие SelfOnDatasetDataChange - вот Вам и зацикливание.

Александр и Сергей, спасибо за помощь.
Как оказалось никакого зацикливания не было)).
На самом деле подвисал JIT.
Перезагрузился.
С помощью отладчика нашёл свою ошибку.
Если поля в исходном и результирующем датасете имеют разное название, то необходимо изменить формальный параметр на фактический.
До:

function FillCustomerBySelectedItem(Dataset, LookupDataset, Message) {
    if (System.MessageDialog(Message, mdtConfirmation, mdbYes + mdbNo, 0) == mrYes) {
		if (!Assigned(LookupDataset)) {
			return
		}
		if (LookupDataset.State == dstInactive) {
			return
		}
		var ContactIDName = 'CEO';
   		var ContactID = GetFieldValueFromDisabledField(LookupDataset,
		   		ContactIDName); 
   	    Dataset.Values(ContactIDName) = ContactID;
    	}
}

После:

function FillCustomerBySelectedItem(Dataset, LookupDataset, Message) {
    if (System.MessageDialog(Message, mdtConfirmation, mdbYes + mdbNo, 0)
		== mrYes) {
		if (!Assigned(LookupDataset)) {
			return
		}
		if (LookupDataset.State == dstInactive) {
			return
		}
		var ContactIDName = 'CEO';
   		var ContactID = GetFieldValueFromDisabledField(LookupDataset,
		   		ContactIDName); 
   	    Dataset.Values('CustomerFIO') = ContactID;
    	}
}

В моём случае поле 'СЕО' находится в датасете Контрагента, а поле 'CustomerFIO' в датасете Договора.

А что касается

"Глова Сергей" написал:DataChange(DataField) изменяет значение какого нибудь поля, что в свою очередь вызывает событие SelfOnDatasetDataChange - вот Вам и зацикливание.

эта функция была установлена до внесения мною изменений. Как определить что она делает предложеным выше методом(scr_GrepSearch) не разобрался...

Находите scr_GrepSearch в администраторе. Нажимаете F9 или кнопочку "запустить скрипт". И пользуетесь таким функционалом для поиска непонятных функций.

"Глова Сергей" написал:Находите scr_GrepSearch в администраторе. Нажимаете F9 или кнопочку "запустить скрипт". И пользуетесь таким функционалом для поиска непонятных функций.

Это я пробовал, но в ответ Error "Метод Main не существует".
Может нужно передать ей какие то параметры?

Прошу меня извинить: по памяти на скрипт указывал. Вам нужен wnd_GrepSearchScript.

"Глова Сергей" написал:Вам нужен wnd_GrepSearchScript.

Большое спасибо.
Как раз этого инструмента и не хватало на поприще исследования структуры TSCRM.

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