Кастомизация
13
Фев
8

Закрытие многих действий в один клик

Небольшой JS-код, который поможет Вам сохранить кучу драгоценных кликов 🙂 Будем закрывать несколько Действий по нажатию одной кнопки.

  1. Скачайте иконку кнопки manyclose.png и поместите ее в папку <сайт CRM>\ISV;
  2. Экспортируйте из CRM ISV.config и откройте его в каком-нибудь текстовом редакторе;
  3. Добавьте в него такой XML-код для объекта activitypointer:
    <Entity name="activitypointer">
      <Grid>
        <MenuBar>
          <Buttons>
            <Button Icon="/isv/manyclose.png" JavaScript="
              // Получаем список выделеных записей
              var grid = document.getElementById('gridBodyTable');
              var a = document.all['crmGrid'].InnerGrid.SelectedRecords; 
              var selectedItems = new Array(a.length);
              
              // Просматриваем список выделенных записей
              for (var i=0; i &lt; a.length; i++) { 
                var stateReq = '';
                var stateType = '';
                var state = 'Completed';
                var status = '-1';
                
                // В зависимости от типа записи определяем необходимые статусы
                if(a[i][1] == '4212') {
                  stateReq = 'SetStateTaskRequest';
                  stateType= 'Task';
                } else if(a[i][1] == '4210') {
                  stateReq = 'SetStatePhoneCallRequest'; 
                  stateType= 'PhoneCall';
                } else if(a[i][1] == '4207') {
                  stateReq = 'SetStateLetterRequest';
                  stateType= 'Letter';
                } else if(a[i][1] == '4204') {
                  stateReq = 'SetStateFaxRequest';
                  stateType= 'Fax';
                } else if(a[i][1] == '4214') {
                  stateReq = 'SetStateServiceAppointmentRequest';
                  stateType= 'ServiceAppointment';
                  state = 'Closed';
                } else if(a[i][1] == '4201') {
                  stateReq = 'SetStateAppointmentRequest';
                  stateType= 'Appointment';
                } else if(a[i][1] == '4402') {
                  stateReq = 'SetStateCampaignActivityRequest';
                  stateType= 'CampaignActivity';
                  state = 'Closed';
                } else if(a[i][1] == '4401') {
                  stateReq = 'SetStateCampaignResponseRequest';
                  stateType= 'CampaignResponse';
                } else if(a[i][1] == '4202') {
                  stateReq = 'SetStateEmailRequest';
                  stateType= 'Email';
                }
                
                // Формируем SOAP-запрос на закрытие текущего просматриваемого Действия
                var xml = '' + 
                '&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>' + 
                '&lt;soap:Envelope xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;>' + 
                '  &lt;soap:Header>' + 
                '    &lt;CrmAuthenticationToken xmlns=&quot;http://schemas.microsoft.com/crm/2007/WebServices&quot;>' + 
                '      &lt;AuthenticationType xmlns=&quot;http://schemas.microsoft.com/crm/2007/CoreTypes&quot;>0&lt;/AuthenticationType>' + 
                '      &lt;OrganizationName xmlns=&quot;http://schemas.microsoft.com/crm/2007/CoreTypes&quot;>Microsoft&lt;/OrganizationName>' + 
                '      &lt;CallerId xmlns=&quot;http://schemas.microsoft.com/crm/2007/CoreTypes&quot;>00000000-0000-0000-0000-000000000000&lt;/CallerId>' + 
                '    &lt;/CrmAuthenticationToken>' + 
                '  &lt;/soap:Header>' + 
                '  &lt;soap:Body>' + 
                '    &lt;Execute xmlns=&quot;http://schemas.microsoft.com/crm/2007/WebServices&quot;>' + 
                '      &lt;Request xsi:type=&quot;'+stateReq+'&quot;>' + 
                '        &lt;EntityId>' + a[i][0] + '&lt;/EntityId>' + 
                '        &lt;'+stateType+'State>'+state+'&lt;/'+stateType+'State>'+
                '        &lt;'+stateType+'Status>' +  status + '&lt;/'+stateType+'Status>'+
                '    &lt;/Request>' + 
                '    &lt;/Execute>' + 
                '  &lt;/soap:Body>' + 
                '&lt;/soap:Envelope>' + 
                '';
                
                // Отправляем SOAP-запрос
                var xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
                xmlHttpRequest.Open('POST', '/mscrmservices/2007/CrmService.asmx', false);
                xmlHttpRequest.setRequestHeader('SOAPAction','http://schemas.microsoft.com/crm/2007/WebServices/Execute');
                xmlHttpRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
                xmlHttpRequest.setRequestHeader('Content-Length', xml.length);
                xmlHttpRequest.send(xml);
                var resultXml = xmlHttpRequest.responseXML;                        
              }
              
              // Обновляем представление действий
              window.crmGrid.Refresh(); 
            " Client="Web" AvailableOffline="true">
              <Titles>
                <Title LCID="1033" Text="Закрыть Действия" />
              </Titles>
              <ToolTips>
                <ToolTip LCID="1033" Text="Закрыть все выделенные Действия" />
              </ToolTips>
            </Button>
          </Buttons>
        </MenuBar>
      </Grid>
    </Entity>
    

    Этот код содержит определение кнопки для объекта activitypointer, по нажатию на которую запускается JavaScript-код. Этот код просматривает выделенные в представление записи и определяет какому объекту (из тех что отображаются в Действиях). Затем для каждой из них формируется SOAP-запрос на ее закрытие и отправляется в CRM. Ну, и напоследок обновляется представление Действий;

  4. Импортируйте ISV.config обратно и можете тестировать кнопку.


Комментарии (8)
  • svec 13.02.2011

    Чтобы появилась кнопка, ещё нужно включить отображение настраиваемых объектов в параметрах.
    Но у меня почемуто постоянно при нажатии вылазит окно с авторизацией. Что это может быть?

  • slivka_83 13.02.2011

    Добрый день.

    А другие SOAP-запросы у Вас не просят авторизации?

  • svec 13.02.2011

    Нет, не просит.
    И авторизоваться хочет именно на эту машину (контроллер домена стоит на другой машине)

  • slivka_83 13.02.2011

    эээ… я чего то запутался 🙂 Запрос отправляется на сервер CRM 🙂 причем тут контроллер домена?

  • svec 13.02.2011

    Ну про контроллер домена я написал к тому, что может быть разница между моей системой и здешним примеров в том, что у вас контроллер домена на этой же машине.
    А когда вылазит запрос на авторизацию, то там уже прописан юзер, но перед / не домен, а имя этой машины на которой CRM.

  • slivka_83 13.02.2011

    Ну, тогда не знаю… сайт CRM добавлен в доверенные? 🙂
    А вообще это самый обычный SOAP-запрос. Для проверки попробуйте создайт любой другой и засунуть в ISV-кнопку. 🙂

  • Александр 13.02.2011

    >Но у меня почему то постоянно при нажатии вылазит >окно с авторизацией. Что это может быть?
    Возможно вы забыли поменять название организации с Microsoft на свою…

    &lt;OrganizationName xmlns=&quot;http://schemas.microsoft.com/crm/2007/CoreTypes&quot;>Microsoft&lt;/OrganizationName>' +
    
  • Борис 13.02.2011

    Соглашусь с последним комментом, необходимо
    …..CoreTypes">Microsoft</…

    поменять Microsoft на имя своей компании (т.е crmserver)

    и всё работает. Хорошее решение. Спасибо автору )

*

code