Кастомизация
23
Дек
30

Счетчик

Счетчик – довольно частое требование при кастомизации MS CRM. Вообщето, в MS CRM уже реализован механизм счетчиков, но он задействован только для определенных сущности и настраивается только для них. Перенести его на кастомные объекты стандартными средствами нельзя.

Посему добрые люди придумали плагины, реализующие данную функцию 🙂 установку и работу одного из них мы сейчас и рассмотрим:

  • Скачайте архив плагина;
  • Скопируйте файл counter.config в подпапку server\bin\assembly, папки, в которой установлен CRM (по дефолту это C:\Program Files\Microsoft CRM\Server\bin\assembly).
    Щелкните правой кнопкой по файлу и выберите Properties — перейдите к вкладке Security — и поставьте для Network Service права Full Control;


  • Запустите Plugin Registration Tool и подключитесь к Вашей организации CRM;
  • Нажмите Register — Register New Assembly. В диалоговом окне Register New Plugin сделайте следующее:
    • в Step #1 укажите путь к CounterPlugin.dll
    • в Step #3 выберите Database

    Нажмите Register Selected Plugins;

  • После регистрации Вы увидите строку с плагином в основном окне Plugin Registration Tool. Выделите ее и нажмите Register — Register New Step. В диалоговом окне Register New Step введите следующую информацию:
    • Message: Create
    • Primary Entity: объект для которого будет задействован счетчик
    • Description: просто пользовательское описание шага
    • Eventing Pipeline Stage of Execution: Pre Stage
    • Execution Mode: Synchronous
    • Step Deployment: Server
    • Triggering Pipeline: Parent Pipeline

    Щелкните Register New Step.
    П.С. Чтобы задействовать счетчик для другого объекта, просто зарегистрируйте еще один такой же шаг, но уже выберите этот объект;



  • Импортируйте в CRM customizations.xml. В результате чего в CRM создастся новый объект Counter. Откройте окно настройки этого объекта и отобразите его в какой-либо из областей (например, в Парметрах). Публикуйте;
  • Теперь нужно настроить логику работы счетчиков. Перейдите к объекту Counter и создайте новую запись (одна запись = один счетчик для какого-либо поля). Заполните необходимые поля: префикс, суффикс, приращение, количество символов и т.д. И не забудьте про имя счетчика 🙂 оно нам далее понадобится (к тому же оно обязательное 🙂 );
  • Все что нам осталось, так это сопоставить счетчик какому-либо полю какой-либо сущности. Откройте скопированный ранее файл counter.config (расположенный по дефолту в C:\Program Files\Microsoft CRM\Server\bin\assembly\counter.config) и добавьте туда такую строку (на каждый счетчик должна приходится одна строка):
    <Counter Name="test1" ObjectTypeCode="1" Attribute="address1_name"/>

    где:

    • Name – имя счетчика;
    • ObjectTypeCode – код объекта (можете посмотреть в статье Прямой доступ к объектам MS CRM или в своей системе пройдя по ссылке http://<crm_сервер>/sdk/list.aspx);
    • Attribute – имя поля, в которое должна подставлятся очередная итерация счетчика.
  • Все! Тестируем: просто создайте новую запись Вашего объекта 🙂



Вариант #2

Еще один счетчик… на этот раз с очень простой функциональностью – в счетчике только числа:

  • Скачайте архив счетчика;
  • Зарегистрируйте в Plugin Registration Tool сборку Magnetism.Crm4.dll;
  • Создайте для нее новый шаг с такими параметрами:
    • Message: Create
    • Primary Entity: <объект для которого создается счетчик>
    • Stage of Execution: Pre Stage
    • Exec. Mode: Synchronous
    • Triggering Pipeline: Parent Pipeline
  • Импортируйте в CRM файл кастомизации customizations.xml;
  • Опубликуйте импортированный объект Incremental Numbering. При этом вынесите его отображение в какую-либо область навигации;
  • Создайте для объекта, в котором будет задействован счетчик новое поле с типом int. В это поле и будет подставляться значение счетчика. Вынесите его на форму;
  • Создайте новую запись объекта Incremental Numbering, в которой укажите следующие параметры:
    • Произвольное имя (которое поможет Вам идентифицировать счетчик)
    • Имя объекта, в котором задействован счетчик;
    • Имя поля, в которое подставляется значение счетчика;
    • Начальное значение счетчика.

    Одна запись этого объекта представляет собой один счетчик. Соответственно, Вам нужно создать по одной записи на каждый счетчик;

  • Идем тестировать… 🙂







Комментарии (30)
  • Катя 23.12.2009

    Не могли пояснить для чего нужен счётчик? Для графический отчётов? И ещё в каких сущностях механизм счетчика уже реализован как вы пишите в первом предложении.

  • slivka_83 23.12.2009

    Они нужны для формирования уникальных номеров документов. Например, бухгалтерских. А реализованы они например в объектах Предложение и зака (поле Код предложения) и Заказа (поле Номер заказа). В стандартном функционале счетчики задаются в Параметрах — Администрирование — Автоматическвая нумерация.

  • Катя 23.12.2009

    Спасибо. Теперь понятно. Я думала, что это для создания графический отчётов, так как им нужен числовой параметр если пользоваться встроенным редактором.

  • Анатолий 23.12.2009

    Здравствуйте.
    Подскажите пожалуйста: Что если просто нужно пересчитать кол-во определенных сущностей например Контактов и разместить где то цифру, например в представлении, при этом доступ к серверу ограничен (hosting, аренда). Такое вообще возможно?
    Спасибо.

  • slivka_83 23.12.2009

    А редактирование ISV.config’а Вам доступно? Если да, то можно например, Выводить количество Контактов по нажатию кнопки над представлением (или возможно выводить количество прямо на сомой нопки). Устраивает?

  • Анатолий 23.12.2009

    Да конечно. Вы мне тут только сегодня как раз помогли c клонированием, за что еще раз огромное человеческое, там же как раз обсуждалась часть из ISV.config. Доступно все кроме папок сервера, тамошний admin очень подозрителен ко всему внедряемому из вне.

  • slivka_83 23.12.2009

    Повесьте в isv.config такой код:

            <Entity name="contact">
                  <Grid>
                    <MenuBar>
                      <Buttons>
                        <Button Icon="/_imgs/ico_18_debug.gif" JavaScript="
                                
                                
                                var authenticationHeader = GenerateAuthenticationHeader();
    
    // Prepare the SOAP message.
    var xml = "<?xml version=&apos;1.0&apos; encoding=&apos;utf-8&apos;?>"+ 
    "<soap:Envelope xmlns:soap=&apos;http://schemas.xmlsoap.org/soap/envelope/&apos;"+
    " xmlns:xsi=&apos;http://www.w3.org/2001/XMLSchema-instance&apos;"+
    " xmlns:xsd=&apos;http://www.w3.org/2001/XMLSchema&apos;>"+ 
    authenticationHeader+ 
    "<soap:Body>"+ 
    "<Fetch xmlns=&apos;http://schemas.microsoft.com/crm/2007/WebServices&apos;>"+ 
    "<fetchXml>&lt;fetch mapping=&apos;logical&apos; aggregate=&apos;true&apos;&gt;&lt;entity name=&apos;contact&apos;&gt;&lt;attribute name=&apos;contactid&apos; alias=&apos;count&apos; aggregate=&apos;count&apos;/&gt;&lt;/entity&gt;&lt;/fetch&gt;</fetchXml>"+ 
    "</Fetch>"+ 
    "</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/Fetch");
    xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xHReq.setRequestHeader("Content-Length", xml.length);
    [text]
    xHReq.send(xml);
    // Capture the result.
    var resultXml = xHReq.responseXML;
    
    // Check for errors.
    var errorCount = resultXml.selectNodes(&apos;//error&apos;).length;
    if (errorCount != 0)
    {
     var msg = resultXml.selectSingleNode(&apos;//description&apos;).nodeTypedValue;
     alert(msg);
    }
    // Process and display the results.
    else
    {
    
    // Capture the result and UnEncode it.
    var resultSet = new String();
    resultSet = resultXml.text;
    resultSet.replace(&apos;&lt;&apos;,&apos;<&apos;);
    resultSet.replace(&apos;&gt;&apos;,&apos;>&apos;);
    
    // Create an XML document that you can parse.
       var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
       oXmlDoc.async = false; 
    // Load the XML document that has the UnEncoded results.
       oXmlDoc.loadXML(resultSet);
    // Display the results.
       alert("Количество контактов: " + oXmlDoc.getElementsByTagName(&apos;./count&apos;)[0].nodeTypedValue);
    }
                                
                                
                                
                                ">
                          <Titles>
                            <Title LCID="1049" Text="Количество контактов" />
                          </Titles>
                        </Button>
                        <ToolBarSpacer />
                      </Buttons>
                    </MenuBar>
                  </Grid>
            </Entity>
    
  • Анатолий 23.12.2009

    Что не получается с синтаксисом, примечания не понятно нужно ли исправлять //, плюс не все понятно с тэгами и кавчками а нет ли адаптированного кода?

  • slivka_83 23.12.2009

    Вопрос не совсем понятен? 🙂 Вы просили выводить в алерте количество Контактов. Этот код это и делает 🙂 Что еще надо? 🙂

  • Анатолий 23.12.2009

    Здравствуйте.
    Дело в том, что я повесил код, но CRM ругается на файл isv.config, с данным кодом, я попытался разобраться в коде, но кое чего не понял, о чем и написал выше.
    Спасибо.

  • slivka_83 23.12.2009

    блин… тупой движок блога 🙂 дело в том, что ISV.config — это XML документ, в котором существуют служебные символы (например. символ &). Чтобы исправить ситуацию, скопируйте код куданибудь в текстовый файл и в тексте между

    JavaScript="
    
    ">  
    

    замените символы

    "

    на

    &quot;

    … других служебных символов пока не заметил.

  • Анатолий 23.12.2009

    Здравствуйте.
    С новым годом.
    Попробовал все равно ругаеца.
    Спасибо.

  • slivka_83 23.12.2009

    Ок. Значит какие-то служебные символы все равно затесались. Тогда вернусь из отпуска вышлю письмом в txt файле.

  • Анатолий 23.12.2009

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

  • slivka_83 23.12.2009

    Вы про плагин? 🙂 Если да, то должно работать 🙂

  • Анатолий 23.12.2009

    Здрасте
    Не я про код в ISV, в полне устраивает просто alert с кол-вом записей.
    Спасибо.

  • slivka_83 23.12.2009

    Да, должно функционировать. Только в коде нужно поменять имя сущности 🙂

  • Alex 23.12.2009

    При регистрации плагина в базе пишет ошибку
    Unable to find configuration file.
    Ошибка проявляется при выполнении базнес-броцессов. Один из шагов процесса – создание записи, на которую настроен счетчик.

  • slivka_83 23.12.2009

    А что значит «пишет в базе ошибку»?

    Я зарегистрировал плагин в точности как тут описано 🙂 Создал Бизнес-процесс с одним шагом — создание Бизнес-партнера. В логах CRM (как сервера приложений так и асинхронного сервиса)ошибок не наблюдаю 🙂

    Может Вы не верно идентифицировали причинно-следственную связь? 🙂

  • Alex 23.12.2009

    Читаем так:
    При регистрации плагина в базе, пишет ошибку при выполнении бизнес-процесса.
    Сама ошибка Unable to find configuration file. т.е не может найти конфигурационный файл.

  • Alex 23.12.2009

    вот тут более подробное описание
    http://axforum.info/forums/showthread.php?t=33962

  • slivka_83 23.12.2009

    Послушайте… если я не могу воспроизвести ситуацию, то тут можно только гадать 🙂 Поэтому давайте воспользуемся методом исключений 🙂 от обратного… если отменить публикацию Бизнес-процеса (в котором создается Задача) номера в Задаче проставля.ются корректно? без ошибок? 🙂

  • Alex 23.12.2009

    Ок. Плагин зарегистрирован. Добавлен шаг на создание задачи. все настроено. при создании задачи не из бизнес-процесса — все работает ошибки нет.
    Номер задачи проставляется корректно.
    Далее делаем бизнес-процесс, один из шагов — создание задачи. При выполнении бизнес-процесса на этом шаге процесс валиться с ошибкой.

  • slivka_83 23.12.2009

    Продолжаем «очищать» эксперимент 🙂 Отключите Ваш текущий БП и создайте новый (запускаемый вручную). Единственным шагом его сделайте создание Задачи. В шаблоне создаваемой Задачи заполните любое поле, кроме того, что используется для номера. Ну, и запустите БП 🙂

  • slivka_83 23.12.2009

    Добавил еще один счетчик…

  • Александр 23.12.2009

    Добрый день!

    Подскажите как поступить в такой ситуации. Используется счетчик с использованием плагина для заказов, системная нумерация не подходит. Проблема в том, что при создании заказа из Возможной сделки, счетчик не срабатывает 🙁
    Может есть способ принудительно вызывать плагин счетчика из другого места(плагина)?

  • slivka_83 23.12.2009

    Добрый день. Скорее всегдо что параметры на которые зарегистрирован шаг плагина, не соответствует тем, которые действительно происходят при создании заказа из Возможной сделки. Напрмер, асинхронность, чилдпипилайн, глубина.

    Попробуйте использовать http://mmcrm.ru/?p=1438 или http://mmcrm.ru/?p=1000 чтобы выяснить параметры при хоторых происходит созданиеи заказа из Возможной сделки. И зарегистрировать шаг с этими параметрами.

  • ivgen 23.12.2009

    Я вот все по инструкции сделал, но счетчик, видимо, не срабатывает, поле остается пустое.

  • Александр 23.12.2009

    Спасибо за ссылки, использовал Crm Event Listner.
    При создании заказа из возможной сделки счетчик так и не работает, единственное отличие в Event — это параметры, которые не указываются при регистрации плагина.
    Тоесть, событие Create при создании заказа из ВС: Depth = 2, Invocation Source = 1.
    При обычном создании заказа Create: Depth = 1, Invocation Source = 0. А затем Event плагина с счетчиком.
    Возможно поэтому и не срабатывает.

    Есть идея подменить кнопку в ВС на создание заказа из организации но предполагаю что это не сработает. Кнопка создания в заказе onClick =
    locAddRelatedToNonForm(1088, 1,'{DB88F23B-90F0-DE11-954D-001517817114}’, »), а в ВС onClick = window.execScript(parent.customAddRelatedItem(21)).
    Может кто-то делал подобное, возможно ли так сделать?

  • slivka_83 23.12.2009

    > ivgen
    Нужны грязные подробности 🙂

    > Александр
    > Возможно поэтому и не срабатывает.
    Попробуйте зарегистрировать еще один шаг с такими параметрами.
    Если не получится, то могу предположить что в коде происхоодит проверка на на определенные параметры, а остальные игнорируются 🙂 тут уже остается только писать свой код (в инете масса примеров кодов счетчиков) 🙂

    > Есть идея подменить кнопку в ВС
    Не поможет 🙂 она вызовет тот же самый функционал 🙂

*

code