Разработка
06
Май
4

Фильтрация связи N:N в CRM 2015

Задача: имеется N:N связь между Контактом и кастомным объектом Страна. Необходимо сделать так, чтобы при выборе страны к контроле выбора записей Страны там отображались только определенные страны.

Исполнение:

  • Создайте JS Веб-ресурс с таким кодом:
    // Фильтруем связь N:N
    function addExistingFromSubGridCustom(gridTypeCode, gridControl, context, fetch, layout, viewName) {
        var viewId = "{11111111-1111-1111-1111-111111111111}"; // Любой ID
        var relName = gridControl.GetParameter("relName");
        var roleOrd = gridControl.GetParameter("roleOrd");
    
        // Создаем кастомное Представление
        var customView = {
            fetchXml: fetch,
            id: viewId,
            layoutXml: layout,
            name: viewName,
            recordType: gridTypeCode,
            Type: 0
        };
    
        var parent = GetParentObject(null, 0);
        var parameters = [gridTypeCode, "", relName, roleOrd, parent];
        var callbackRef = Mscrm.Utilities.createCallbackFunctionObject("locAssocObjAction", context, parameters, false);
    
        // Вызываем лукап с нашим кастомным представлением
        LookupObjectsWithCallback(callbackRef, null, "multi", gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView]);
    }
    
    // Фильтруем N:N связь Стран с Контактом
    function filterAddExistingCountry(gridTypeCode, gridControl) {
    
        // FetchXML, который возвращает отфильтрованные данные
        var fetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
            "  <entity name='new_country'>" +
            "    <attribute name='new_name' />" +
            "    <order attribute='new_name' descending='false' />" +
            "    <filter type='and'>" +
            "      <condition attribute='statecode' operator='eq' value='0' />" +
            "      <condition attribute='new_name' operator='like' value='%о%' />" +
            "    </filter>" +
            "  </entity>" +
            "</fetch>";
    
        // Настраиваем колонки в кастомном представлении
        var layout = "<grid name='resultset' object='10006' jump='new_countryid' select='1' icon='1' preview='1'>" +
            "  <row name='result' id='new_countryid'>" +
            "    <cell name='new_name' width='300' />" +
            "  </row>" +
            "</grid>";
    
        addExistingFromSubGridCustom(gridTypeCode, gridControl, this, fetch, layout, "Страны с буквой О");
    }
    

    Здесь две функции:

    • Первая – основная – формирует кастомное Представление и другие параметры, а затем подсовывает их служебной функции;
    • Вторая – настроечная – в ней мы определяем параметры фильтрации и столбцы для Представления.
  • Добавьте JS Веб-ресурс на форму Контакта;
  • Измените для объекта Страна CommandDefinition для кнопки Add Existing. XML будет примерно такой:
    <CommandDefinition Id="Mscrm.AddExistingRecordFromSubGridAssociated">
      <EnableRules>
        <EnableRule Id="Mscrm.AppendToPrimary" />
        <EnableRule Id="Mscrm.EntityFormIsEnabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.AddExisting" />
        <DisplayRule Id="Mscrm.ShowForManyToManyGrids" />
        <DisplayRule Id="Mscrm.AppendToPrimary" />
        <DisplayRule Id="Mscrm.AppendSelected" />
      </DisplayRules>
      <Actions>
        <JavaScriptFunction FunctionName="filterAddExistingCountry" Library="$webresource:new_contact.js">
          <CrmParameter Value="SelectedEntityTypeCode" />
          <CrmParameter Value="SelectedControl" />
        </JavaScriptFunction>
      </Actions>
    </CommandDefinition>
    

    Здесь по сравнению со стандартным CommandDefinition мы только перенаправляем JS вызов на кастомную библиотеку с нашей функцией.

Готово – идем тестировать.



Комментарии (4)
  • lunchev86 06.05.2015

    Добрый вечер! Интересует очень один вопрос.
    Возможно ли отфильтровать сабгрид по текущим контакткам? Что-то как у Ответственный = текущий пользователь.

  • slivka_83 06.05.2015

    Добрый день.
    CRM какой версии?

  • lunchev86 06.05.2015

    Установлена crm 2016

  • slivka_83 06.05.2015

    Попробуйте так: http://mmcrm.ru/?p=6140

*

code