В этом посте я опишу свое первое задание, с которого и началось мое знакомство с CRM .

Задание заключалось в следующем: есть определенный договор (например договор купли-продажи чего-то) в формате . doc . В определенные места этого договора нужно вставить данные из определенного объекта сущности (ну и из связанных с данным объектом других объектов).

Вот сейчас на тестовом примере и расскажу как я это реализовала.

Сейчас я создала тестовую сущность new _ dogovor . В нее добавила такие поля:

Название договора – new _ dogovor . new _ name

№ договора – new _ dogovor . new _ number

Организация – new_dogovor.new_accountid (lookup к сущности Account)

Контакт – new_dogovor.new_contactid (lookup к сущности Contact)

new_dogovor

На форму новой сущности new _ dogovor добавила кнопку :

Фрагмент из файла isv . config . xml :

<Entity name=»new_dogovor»>
<ToolBar ValidForCreate=»0″ ValidForUpdate=»1″>
<Button Title=»To Word» ToolTip=»Open Word» Icon=»/_imgs/ico_18_debug.gif» JavaScript=»window.toword();» />
</ToolBar>
</Entity>

При нажатии на эту кнопку происходит вызов функции window . toword (); При этом сама функция определена в событии OnLoad сущности new _ dogovor .Также я использовала функцию Retrieve (….), которая получает любое поле указанного объекта сущности, не буду ее описывать, так как это уже сделано вот тут.

Код из события OnLoad сущности new_dogovor:

function Retrieve(sEntity, sGuid, sAttribute)
{
var sXml = «<?xml version=\»1.0\» encoding=\»utf-8\»?>»;
sXml += «<soap:Envelope xmlns:soap=\»http://schemas.xmlsoap.org/soap/envelope/\» xmlns:xsi=\»http://www.w3.org/2001/XMLSchema-instance\» xmlns:xsd=\»http://www.w3.org/2001/XMLSchema\»>»;
sXml += «<soap:Body>»;
//sXml += «<entityName xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»+mEntity.get(«Name»)+»</entityName>»;
sXml += «<entityName xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»+sEntity+»</entityName>»;

sXml += «<id xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»+sGuid+»</id>»;

sXml += «<columnSet xmlns:q1=\»http://schemas.microsoft.com/crm/2006/Query\» xsi:type=\»q1:ColumnSet\» xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»;
sXml += «<q1:Attributes>»;

sXml += «<q1:Attribute>»+sAttribute+»</q1:Attribute>»;

sXml += «</q1:Attributes>»;
sXml += «</columnSet>»;
sXml += «</soap:Body>»;
sXml += «</soap:Envelope>»;

var oXmlHttp = new ActiveXObject(«Msxml2.XMLHTTP»);
oXmlHttp.Open(«POST», «/MsCrmServices/2006/CrmService.asmx», false);
oXmlHttp.setRequestHeader(«SOAPAction», «http://schemas.microsoft.com/crm/2006/WebServices/Retrieve»);
oXmlHttp.setRequestHeader(«Content-Type», «text/xml; charset=utf-8″);
oXmlHttp.setRequestHeader(«Content-Length», sXml.length);
oXmlHttp.send(sXml);
var doc = oXmlHttp.responseXML;
var retValue = «»;
retValue = oXmlHttp.responseXML.selectSingleNode(«//RetrieveResult/»+sAttribute).text;
return retValue;
}

window.toword=function()
{
var oWord = new ActiveXObject(«Word.Application»);
var oDoc;
oWord.Visible = 1;
oDoc = oWord.Documents.Add(«http://localhost:5555/dogovor.doc»); //путь,где лежит документ
oDoc.Bookmarks.Item(«number»).Range.Text =crmForm.all.new_number.DataValue;//закладка
oDoc.Bookmarks.Item(«account»).Range.Text =crmForm.all.new_accountid.DataValue[0].name;
oDoc.Bookmarks.Item(«contact»).Range.Text =crmForm.all.new_contactid.DataValue[0].name;
oDoc.Bookmarks.Item(«tel»).Range.Text =Retrieve(‘contact’,crmForm.all.new_contactid.DataValue[0].id,’telephone1′);
oDoc.Bookmarks.Item(«adr»).Range.Text =Retrieve(‘account’,crmForm.all.new_accountid.DataValue[0].id,’address2_country’);
}

С помощью Retrieve через лукапы получены поле Рабочий телефон сущности Контакт и поле Страна сущности Организация.

Нужно создать документ-шаблон Word. У меня он называется dogovor.doc и лежит по пути установки CRM в папке CRMWeb. В этом документе следует расставить закладки. Я их назвала number,contact,account,tel,adr. Вот пример как это сделать:

bookmark

word1

Нужно заметить, что придется понизить уровень безопасности в IE . Связано это с тем, что word – это по сути объект ActiveX , и IE очень нервно реагирует. Но даже после понижения уровня безопасности IE реагирует на попытку открыть Word вот таким сообщением:

activex

Пока с этим ничего не поделать, так что пусть будет (жмем Yes).

Итак, теперь результат. В моем примере, при нажатии на кнопку «To Word» открывается документ dogovor.doc и по закладкам проставляются данные, которые берутся из объекта сущности и из связанных с ним объектов.

Хочу добавить, что нужно обязательно юзать блоки try catch, так как поля могут быть не заполнены.

Данный способ глуповат и неудобен, но тем не менее первое придуманное решение было именно таким. Можно иначе, но это я опишу как-нибудь в следующий раз :)

Возможно, сумбурно и не все расписано, но я же все же впервые описываю это так. ;)

Проверено с Word 2003/2007, MS CRM 3.0 (в MS CRM 4.0 не тестировала, но проблем быть не должно).