Записки на лету

Использование JScript в Dynamics CRM 2011

В этой статье я буду писать о своем опыте использования JavaScript в MS Dynamics CRM 2011.

Работа с полями

Во-первых, чтобы скрипт работал на форме его необходимо добавить в веб-ресурс и добавить этот веб-ресурс непосредственно на форму.

Получить значение текстового поля «telephone»

Xrm.Page.data.entity.attributes.get("telephone1").getValue();

Сохранить значение «123» в текстовое поле «telephone»

Xrm.Page.data.entity.attributes.get("telephone1").setValue("123");

Получить значение пиклиста «address1_addresstypecode»

Xrm.Page.data.entity.attributes.get("address1_addresstypecode").getValue(); //Цифровое значение
Xrm.Page.data.entity.attributes.get("address1_addresstypecode").getText(); //Текстовое значение

Имейте в виду, что если значение пиклиста не выбрано, то getValue()/getText() вернет «undefined».
Установить значение 2 пиклиста «address1_addresstypecode»

Xrm.Page.data.entity.attributes.get("address1_addresstypecode").setValue(2);

Установить значение поля с датой «birthdate» на сегодня

var today = new Date();
Xrm.Page.data.entity.attributes.get("birthdate").setValue(today);

Для выражения Xrm.Page.data.entity.attributes.get() есть сокращенный вариант Xrm.Page.getAttribute().
Если поле помечено на форме, что оно доступно только для чтения (ReadOnly) чтобы его изменить необходимо выставить ему SubmitMode = Always.

Xrm.Page.getAttribute("fieldName").setSubmitMode("always");

Отключить (Disable) поле «name»

Xrm.Page.ui.controls.get("name").setDisabled(true);

Скрыть (Hide) поле «name»

Xrm.Page.ui.controls.get("name").setVisible(false);

Скрыть (Hide) секцию в табе

Xrm.Page.ui.tabs.get("tabname").sections.get("sectionname").setVisible(false);

Работа с формой

Сохранить форму

Xrm.Page.data.entity.save();

Сохранить и закрыть форму

Xrm.Page.data.entity.save("saveandclose");

Остановить сохранение формы
Вешаемся на событие формы OnSave.
Обязательно надо поставить галочку напротив «Pass execution context as first parameter». Без этого не сработает.

function formOnSave(executionObj)
{
var shouldSave = true;
if (shouldSave) {
alert("Unable to save because of some reason or the other.");
executionObj.getEventArgs().preventDefault();
}
}

Закрыть форму
Пользователю будет показано напоминание если он не сохранил изменения.

Xrm.Page.ui.close();

Открыть форму создания
entityType — имя сущности (entity logical name).

Xrm.Utility.openEntityForm(entityType);

Открыть форму создания с заполненными полями
parameters — объект с параметрами,
entityType — имя сущности (entity logical name).

var entityType = "account";
var parameters = {};
// Заполняем лукап "accountid"
parameters["accountid"] = "b053a39a-041a-4356-acef-ddf00182762b";
parameters["accountidname"] = "Имя организации"
// Следующий параметр только для поля типа Клиент, где надо указать Контакт это или Организация
parameters["accountidtype"] = "account";
// Заполняем текстовое поле "name"
parameters["name"] = "Test";
// Заполняем пиклист "address1_addresstypecode"
parameters["address1_addresstypecode"] = "3";
// Заполняем булево поле Да/Нет  "donotemail"
parameters["donotemail"] = "1";
Xrm.Utility.openEntityForm(entityType, null, parameters);

Подробнее здесь Set Field Values Using Parameters Passed to a Form.
Открыть форму существующей сущности
id — GUID экземпляра сущности,
entityType — имя сущности (entity logical name).

Xrm.Utility.openEntityForm(entityType, id);

Определить тип формы
Значения тип форм (Form type codes):
Create — 1, Update — 2, Read Only — 3, Disabled — 4, Bulk Edit — 6.

Xrm.Page.ui.getFormType();

Получить GUID текущей записи

Xrm.Page.data.entity.getId();

Получить GUID текущего пользователя

Xrm.Page.context.getUserId();

Получить LCID текущего пользователя и организации

Xrm.Page.context.getUserLcid(); //For User
Xrm.Page.context.getOrgLcid(); //For Organization

Список всех LCID здесь.

Получить URL сервера CRM

Xrm.Page.context.getServerUrl();

С выходом 12-го роллапа функция устарела и теперь рекоммендуется делать так

Xrm.Page.context.getClientUrl();

а чтобы работало всегда то так

var ORG_URL = (typeof(Xrm.Page.context.getClientUrl) == "function") ? Xrm.Page.context.getClientUrl() : Xrm.Page.context.getServerUrl();

Получить имя организации

Xrm.Page.context.getOrgUniqueName();

Лукапы

Получить GUID значение лукапа «contactid»

Xrm.Page.data.entity.attributes.get("contactid").getValue()[0].id;

Получить текстовое значение лукапа «contactid»

Xrm.Page.data.entity.attributes.get("contactid").getValue()[0].name;

Функция, которая заполняет лукап
Параметры:
fieldName — название поля,
id — GUID экземпляра сущности,
name — название сущности, которое будет показано в лукапе,
entityType — имя сущности (entity logical name)

// Set the value of a lookup field
function SetLookupValue(fieldName, id, name, entityType) {
if (fieldName != null) {
var lookupValue = [];
lookupValue[0] = {};
lookupValue[0].id = id;
lookupValue[0].name = name;
lookupValue[0].entityType = entityType;
Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
}
}

Данная функция заполняет первое и единственное значение лукапа. Если необходимо ввести несколько значений то следует добавить к массиву lookupValue необходимое количество объектов, по одному на каждый элемент в лукапе.

Тоже самое можно сделать с помощью JSON в одну строку, что выглядит, правда уже не так красиво.

Xrm.Page.data.entity.attributes.get(fieldName).setValue([{ id: id, name: name, entityType: entityType}]);

Открыть диалоговое окно
В CRM 2011 есть обертка для window.showModalDialog(), функция называется openStdDlg().

openStdDlg(sPath, oArgs, iWidth, iHeight, bResizable, bModeless, sCustomWinParams);

где:
sPath — ссылка на окно,
oArgs — объект с параметрами,
iWidth — ширина окна,
iHeight — высота окна,
bResizable — можно ли изменять размер окна,
bModeless — ,
sCustomWinParams — пользовательские параметры, передаваемые в окно.

Открыть форму сущности
Следующий пример открывает форму существующей сущности incident с GUID = 47c2bb7b-ba62-4afb-9b10-1a24c7a2799e в новом окне.

window.open(Xrm.Page.context.getServerUrl() +
"/main.aspx?etn=incident&pagetype=entityrecord&id=" +
encodeURIComponent("{47c2bb7b-ba62-4afb-9b10-1a24c7a2799e}"),
"_blank",
"location=no,menubar=no,status=no,toolbar=no",
false);

Обновить рибон
Обновляет только состояние Enable/Disable Rule;

Xrm.Page.ui.refreshRibbon();

Статья еще не закончена и, скорее всего, вряд ли будет, так как я буду ее пополнять по мере расширения моего собственного опыта.
Ждите обновлений…

 
Comments

Статья хорошая, такой мини-справочник, написано кратко и главное понятно, спасибо!

В раздел открыть форму сущности
я бы добавил параметр resizable=yes

Иначе нельзя изменить размер окна формы

Можно и так.
Это стандартный набор параметров Window.open()
Вот полный список:
channelmode=yes|no|1|0 Whether or not to display the window in theater mode. Default is no. IE only
directories=yes|no|1|0 Whether or not to add directory buttons. Default is yes. IE only
fullscreen=yes|no|1|0 Whether or not to display the browser in full-screen mode. Default is no. A window in full-screen mode must also be in theater mode. IE only
height=pixels The height of the window. Min. value is 100
left=pixels The left position of the window
location=yes|no|1|0 Whether or not to display the address field. Default is yes
menubar=yes|no|1|0 Whether or not to display the menu bar. Default is yes
resizable=yes|no|1|0 Whether or not the window is resizable. Default is yes
scrollbars=yes|no|1|0 Whether or not to display scroll bars. Default is yes
status=yes|no|1|0 Whether or not to add a status bar. Default is yes
titlebar=yes|no|1|0 Whether or not to display the title bar. Ignored unless the calling application is an HTML Application or a trusted dialog box. Default is yes
toolbar=yes|no|1|0 Whether or not to display the browser toolbar. Default is yes
top=pixels The top position of the window. IE only
width=pixels The width of the window. Min. value is 100

Роман

Спасибо, помогло, полезная информация.