Кастомизация
02
Сен
8

Значения полей с родительской формы

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

Для этого проще всего воспользоваться объектом opener, который ссылается на окно, которое открыло текущее окно. Но тут есть одна загвоздка: кнопки «Создать новый объект бла-бла-бла» и «Добавить существующий объект бла-бла-бла» расположены в представлении связанного объекта, как и сам список связанных записей. А все это представление в свою очередь динамически подгружается в iFrame, когда Вы щелкаете по кнопкам на левой навигационной панели. Поэтому объект opener ссылается не на родительскую форму, а на этот самый iFarme, в котором никаких полей нет и ничего Вы оттуда не вытащите. Чтобы добраться до основного окна формы необходимо использовать следующую конструкцию opener.parent.

Предположим, что нам нужно с формы объекта Письмо получить значения полей Имя и Фамилия, а также значение некоторой переменной родительской формы Контакта.

Поместите на событие онлоад формы Контакта следующий код:

somevar = "бесполезная переменная";

он просто создает глобальную (в рамках данной формы) переменную, которую нам нужно будет «перетащить» на форму Письма.


А на онлоад формы Письма повесьте следующий скрипт:

if (
	(window.opener != null) &&
	(window.opener.parent != null) &&
	(window.opener.parent.document != null) &&
	(window.opener.parent.document.crmForm != null) &&
	(window.opener.parent.document.crmForm.ObjectTypeCode == 2) // проверяем что родительская форма это Контакты
) {

	var base = window.opener.parent;
	crmForm.all.subject.DataValue = base.document.crmForm.all.firstname.DataValue + " " + base.document.crmForm.all.lastname.DataValue;
	crmForm.all.description.DataValue = base.somevar;
    
}

он подтсягивает с формы контакта значений двух полей (Имя и Фамили) и вставляет их объединение в поле тема. А в поле описание заносится созданная нами на форме Контакта переменная somevar.


Тестируем: создайте новую запись Контакта или откройте существующую, заполните у нее поля Имя и Фамили. перейдите к связанному представлению Действия и создайте новую запись Письмо (или откройте существующую). Поля Тема и Описание будут заполнены сами знаете чем 🙂


Заметьте, что этот скрипт будет работать, только если форма Письма открыта с формы Контакта (т.к. стоит проверка) – в противном случаи ничего не произойдет.

И кстати… аналогичным образом значения полей родительской формы можно не только получать, но и назначать 🙂

Комментарии (8)
  • smart_rookie 02.09.2009

    И кстати… аналогичным образом значения полей родительской формы можно не только получать, но и назначать

    Вот эта фраза рулит, она мне и помогла :).

  • AISt 02.09.2009

    Не подскажите в какую сторону смотреть:
    необходимо в пределах одной формы из фрейма передать параметр (значение) полю?

  • slivka_83 02.09.2009

    Ну, примерно так:

    parent.document.crmForm.all.< поле>.DataValue = «значение»;

  • AISt 02.09.2009

    Спасибо

  • Alex 02.09.2009

    Подскажите, пожалуйста, а как можно вытянуть данные в таком случае
    В форме контракты при изменении контрагента нужно, чтобы реквизиты контрагента подставились автоматически в форму контрактов, ну там ИНН, БИК и т.д.
    Через сопоставления как выяснилось это сделать нельзя, потому что там срабатывает только при создании новом записи

  • slivka_83 02.09.2009

    Необходимо использовать SOAP запрос, чтобы вытащить значения полей с другой записи. Если приветете точное названия всех полей (на инглише), то могу помочь составить.

  • Alex 02.09.2009

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

    А поля нужны все из Сведений для контракта
    person, personname, inn, kpp, korr, actinorder, personjobtitle, rs, bank, bik

    Вот это поля должны поставляться в форму Контрактов в раздел реквизитов

    И еще я не знаю на что повесить можно такой запрос, только ли на onchange по полю Контрагента? или нужно сделать что-то еще?

  • slivka_83 02.09.2009

    Судя по всему у Вас измененная форма контракта, т.к. у себя в стандартной поставке я таких полей не наблюдаю. Поэтому я просто «вытащил» с формы Контакта два поля (Должность и Основной телефон) и вывел их в сообщении. Надеюсь это поможет по аналогии вытащить другие необходимы поля и подставить их на форму 🙂

    Вот код… его нужно повесть на изменение поля клиент в Контракте:

    if (crmForm.all.customerid.DataValue != null && crmForm.all.customerid.DataValue[0].typename == "contact") {
    
        // Prepare variables for a contact to retrieve.
        var contactid = crmForm.all.customerid.DataValue[0].id;
        var authenticationHeader = GenerateAuthenticationHeader();
    
        // Prepare the SOAP message.
        var xml = "<?xml version='1.0' encoding='utf-8'?>"+ 
        "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"+
        " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"+
        " xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"+ 
        authenticationHeader+ 
        "<soap:Body>"+ 
        "<Retrieve xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ 
        "<entityName>contact</entityName>"+ 
        "<id>"+ contactid +"</id>"+ 
        "<columnSet xmlns:q1='http://schemas.microsoft.com/crm/2006/Query' xsi:type='q1:ColumnSet'>"+ 
        "<q1:Attributes>"+ 
        "<q1:Attribute>jobtitle</q1:Attribute>"+
        "<q1:Attribute>telephone1</q1:Attribute>"+
        "</q1:Attributes>"+ 
        "</columnSet>"+ 
        "</Retrieve>"+ 
        "</soap:Body>"+ 
        "</soap:Envelope>";
        // Prepare the xmlHttpObject and send the request.
        var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
        xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
        xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Retrieve");
        xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        xHReq.setRequestHeader("Content-Length", xml.length);
        xHReq.send(xml);
        // Capture the result.
        var resultXml = xHReq.responseXML;
    
        // Check for errors.
        var errorCount = resultXml.selectNodes('//error').length;
        if (errorCount != 0){
            var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
            alert(msg);
        } else {
            
            var jobtitle = "";
            var telephone1 = "";
            if (resultXml.selectSingleNode("//q1:jobtitle")) jobtitle = resultXml.selectSingleNode("//q1:jobtitle").nodeTypedValue;
            if (resultXml.selectSingleNode("//q1:telephone1")) telephone1 = resultXml.selectSingleNode("//q1:telephone1").nodeTypedValue;
            alert(jobtitle);
            alert(telephone1);
    
        }
    
    }
    

*

code