Букмарклеты для CRM 2013
MS CRM построен на базе Веб-технологий, а значит – открывается в браузере (неожиданно, правда? 🙂 ). Поэтому в некоторых случаях можем использовать некоторые их возможности. А именно – букмарклет – закладка, сохраненная в веб-браузере, которая содержит JavaScript-команды. Применение их в отношении MS CRM поможет Вам сохранить пару щелчков мыши и даже больше.
Создаются они при помощи кнопки добавления в избранное:
- Щелкните Добавить в Панель избранного;
- Создастся закладка – откройте ее на редактирование;
- Измените URL (вставьте в нее JavaScript-команду) и названия закладки. А чтобы было совсем шикарно — повесьте на закладки подходящие иконки 🙂
А ниже подборка JavaScript, которые помогут облегчится Вам жизнь:
Быстрые переходы
Страница Решения
javascript: var nav = new Object(); nav.uri = "/tools/Solution/home_solution.aspx?etc=7100&sitemappath=Settings|Customizations|nav_solution"; window.top.document.getElementById("navBar").control.raiseNavigateRequest(nav); void (0)
Страница Администрирование
javascript: var nav = new Object(); nav.uri = "/tools/Admin/admin.aspx?sitemappath=Settings|System_Setting|nav_administration"; window.top.document.getElementById("navBar").control.raiseNavigateRequest(nav); void (0)
Страница настройки текущей сущности
javascript: var frame = $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') }); var form = frame[0].contentWindow; try { var etc = form.Xrm.Page.context.getQueryStringParameters().etc; } catch (e) { } form.Mscrm.RibbonActions.openEntityEditor(etc);
Расширенный поиск
javascript: var frame = $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') }); var form = frame[0].contentWindow; var u = form.Mscrm.CrmUri.create("/main.aspx"); u.get_query()["pagetype"] = "advancedfind"; try { var etc = form.Xrm.Page.context.getQueryStringParameters().etc; } catch (e) { } if (etc) { u.get_query()["extraqs"] = "EntityCode=" + etc; } form.openStdWin(u, "_blank", 900, 600); void (0);
Форма
Копирование GUID’а записи
На экран
javascript: if (window.prompt("EntityId:", $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Xrm.Page.data.entity.getId().slice(1, -1))) { }
В буфер
javascript: !(function (e) { if (!e) { return } try { var t = e.Xrm.Page.data.entity.getId(); if (!t) { return alert("Failed to find id on this form.") } if (window.clipboardData) { window.clipboardData.setData("Text", t) } else { window.prompt("Copy to clipboard: Ctrl+C, Enter", t) } } catch (n) { alert("Error occurred while retrieving record id. " + n.message) } })(function (e) { if (!e.APPLICATION_VERSION) { return alert("Could not determine the current version of CRM.") } if (e.APPLICATION_VERSION === "5.0") { return window.top.frames[0] } else if (e.APPLICATION_VERSION === "6.0" || e.APPLICATION_VERSION === "6.1") { var t = $("#crmContentPanel iframe:not([style*=\"visibility: hidden\"])"); if (t.length > 0 && t[0].contentWindow.Xrm.Page.ui) { return t[0].contentWindow } else { return alert("[CRM 2013] Could not locate the entity form.") } } else if (e.APPLICATION_VERSION) { return alert("Unsupported CRM Version Detected: " + e.APPLICATION_VERSION) } else { return alert("Unable to detect current CRM Version.") } }(window))
Copy a Link
javascript: $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Mscrm.CommandBarActions.sendFormShortcut();
Асинхронное (без перезагрузки) обновление страницы данными с сервера
javascript: $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Xrm.Page.data.refresh(false)
Асинхронное обновление страницы с сохранением введенных данных
javascript: $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Xrm.Page.data.refresh(true)
Сохранение
javascript: $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Xrm.Page.data.entity.save();
Сохранить и закрыть
javascript: $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Xrm.Page.data.entity.save('saveandclose');
Сохранить и создать
javascript: $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') })[0].contentWindow.Xrm.Page.data.entity.save('saveandnew');
Окно свойств
javascript: var frame = $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') }); var id = frame[0].contentWindow.Xrm.Page.data.entity.getId(); var etc = frame[0].contentWindow.Xrm.Page.context.getQueryStringParameters().etc; frame[0].contentWindow.Mscrm.RibbonActions.openFormProperties(id, etc);
Разработка
Опубликовать все настройки
javascript: var frame = $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') }); frame[0].contentWindow.Mscrm.FormEditor.PublishAll();
Отключение автоматического сохранения
Данный bookmarklet отключает автоматическое сохранение для текущей записи (будет работать до обновления записи).
javascript: var frame = $("iframe").filter(function () { return ($(this).css('visibility') == 'visible') }); frame[0].contentWindow.Xrm.Page.data.entity.addOnSave(function (context) { if (context.getEventArgs().getSaveMode() != 1) { context.getEventArgs().preventDefault(); } });
Активировать все поля
javascript: !(function (e) { if (!e) { return } e.Xrm.Page.ui.controls.forEach(function (e, t) { if (e && e.setDisabled) { e.setDisabled(false) } }); e.Xrm.Page.data.entity.attributes.forEach(function (e, t) { if (e && e.setSubmitMode) { e.setSubmitMode("always") } }) })(function (e) { if (!e.APPLICATION_VERSION) { return alert("Could not determine the current version of CRM.") } if (e.APPLICATION_VERSION === "5.0") { return window.top.frames[0] } else if (e.APPLICATION_VERSION === "6.0" || e.APPLICATION_VERSION === "6.1") { var t = $("#crmContentPanel iframe:not([style*=\"visibility: hidden\"])"); if (t.length > 0 && t[0].contentWindow.Xrm.Page.ui) { return t[0].contentWindow } else { return alert("[CRM 2013] Could not locate the entity form.") } } else if (e.APPLICATION_VERSION) { return alert("Unsupported CRM Version Detected: " + e.APPLICATION_VERSION) } else { return alert("Unable to detect current CRM Version.") } }(window))
Режим «Бога»
Режим «Бога» позволяет одним кликом отключить большую часть стандартной клиентской логики:
- Делает все обязательные поля не обязательными;
- Делает все скрытые поля видимыми;
- Активирует все неактивные поля;
- Делает все скрытые вкладки видимыми;
- Делает все скрытые секции видимыми;
- Разворачивает все свернутые вкладки;
- Очищает уведомления на уровне полей;
- Отключает скрипт на сохранение записи;
- Позволяет редактировать неактивные записи (работает только при включенном автосохранении и текущей объект не является Действием).
javascript: var form=$("iframe").filter(function(){return$(this).css("visibility")=="visible"})[0].contentWindow;try{form.Mscrm.InlineEditDataService.get_dataService().validateAndFireSaveEvents=function(){return new Mscrm.SaveResponse(5,"")}}catch(e){}varattrs=form.Xrm.Page.data.entity.attributes.get();for(var i in attrs){attrs[i].setRequiredLevel("none")}var contrs=form.Xrm.Page.ui.controls.get();for(var iin contrs){try{contrs[i].setVisible(true);contrs[i].setDisabled(false);contrs[i].clearNotification()}catch(e){}}var tabs=form.Xrm.Page.ui.tabs.get();for(var i in tabs){tabs[i].setVisible(true);tabs[i].setDisplayState("expanded");varsects=tabs[i].sections.get();for(var i in sects){sects[i].setVisible(true)}}
Системные названия атрибутов
Вариант 1
Заменяет метки полей на системные названия соответствующих атрибутов.
javascript: frames[0].Xrm.Page.ui.controls.forEach(function(a){a.setLabel(a.getName())});
Вариант 2
Создает рядом с меткой поле ввода, а в нем отображает системное имя, соответствующее метке.
javascript: (function(){var frm=(window.Xrm&&window.Xrm.Page&&window.Xrm.Page.ui&&window)||(frames[1]&&frames[1].Xrm&&frames[1].Xrm.Page.ui&&frames[1])||frames[0];var Xrm=frm.Xrm;if(!Xrm||!Xrm.Page||!Xrm.Page.ui){alert('Unable to find CRM form');return;}Xrm.Page.ui.tabs.forEach(function(tab){tab.setVisible(true);tab.sections.forEach(function(section){section.setVisible(true);});});var $=frm.jQuery||(frm.CEI&&frm.CEI.$);if(!$){var head=frm.document.getElementsByTagName('head').item(0);var s=frm.document.createElement('script');s.setAttribute('type','text/javascript');s.setAttribute('src','https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.js');s.async=false;head.appendChild(s);waitForJQ();}else{setLabels();}function waitForJQ(){if(frm.jQuery){$=frm.jQuery.noConflict(true);setLabels();}else{setTimeout(waitForJQ,1000);}}function setLabels(){Xrm.Page.data.entity.attributes.forEach(function(a){a.controls.forEach(function(c){var lblText=c.getLabel();c.setVisible(true);var attr=a.getName();var lbl=$('#'+c.getName()+'_c').html('');lbl.css('text-align','left');if(lbl.is('td')){lbl.closest('table').children('colgroup').children('col:even').attr('width','400');}$('<input/>').width(200).val(attr).appendTo(lbl).focus(function(){$(this).select()});$('<span></span>').text(lblText).appendTo(lbl);});});}})();
Список пиклистов и их значений
Выводит в отдельном окне все пиклисты имеющиеся на форме и их значения (как отображаемые, так и числовые).
javascript: var osa = ""; frames[0].Xrm.Page.ui.controls.forEach(function (c, i){if (c.getControlType() == "optionset"){var osv = "<br /><b><u>Name: "+c.getName()+"</u></b><br />";frames[0].$("#"+c.getName()+"_i").find("option").first().nextAll().each(function (){osv += "<div>Value: "+$(this).attr("value")+"%C2%A0%C2%A0-%C2%A0%C2%A0Text: "+$(this).attr("title")+"</div>";});osa += "<div>"+osv+"</div>";}});(window.open("#", "#").document.open()).write("<div style='font-family:Segoe UI,Arial;font-size:11px;overflow:always'>"+osa+"</div>")
Список измененных полей
javascript: var message="The following fields are dirty: \n";window.frames[0].Xrm.Page.data.entity.attributes.forEach(function(attribute,index){if(attribute.getIsDirty()==true){message+="\u2219 "+attribute.getName()+"\n";}});alert(message);
Код объекта
javascript: var typeCode = frames[0].Xrm.Page.context.getQueryStringParameters().etc; if (typeCode) { clipboardData.setData("Text", typeCode.toString()); window.prompt("Copy to clipboard: Ctrl+C, Enter", typeCode.toString()) }
Получить значение поля
Вызывает окно ввода, в котором вводится название поля. После этого возвращается его значение. Бывает полезно для получения значения скрытого поля.
javascript: var v, f = prompt("Enter field name"); var a = frames[0].Xrm.Page.getAttribute(f); switch (a.getAttributeType()) { case "optionset": case "boolean": v = a.getSelectedOption().text; break; case "lookup": v = a.getValue()[0].name; break; default: v = a.getValue(); break; } window.prompt("Copy to clipboard: Ctrl+C, Enter", v);
Супер круто! Стал постоянно пользоватся, экономит кучу времени! Большое спасибо!
Отлично! Спасибо 🙂
только «Режим Бога» надо чуток поправить, чтоб заработал:
1. return$(this).css(«visibility») — пробел после return
2. varattr — пробел после var
3. varsects — пробел после var
4. for(var iin contrs) — пробел между i и in