Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
![](http://www.axforum.info/forums/blog_attachment.php?attachmentid=80&stc=1&d=1296211379)
![](http://www.axforum.info/forums/blog_attachment.php?attachmentid=100&stc=1&d=1296211379)
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Мультиязычный CRM. Уведомления из рабочих процессов на языке пользователя
Запись от Артем Enot Грунин размещена 04.06.2013 в 17:02
Обновил(-а) Артем Enot Грунин 20.08.2013 в 09:10
Обновил(-а) Артем Enot Грунин 20.08.2013 в 09:10
Теги activity, development, workflow
UPDATE 20.08.2013: Недавно я обнаружил, что если назначить запись команде "team", то входной параметр этой активности все равно будет инициализирован. При этом, активность будет валиться с ошибкой при попытке прочитать параметры несуществующего пользователя. Пример ниже был обновлен и корректно работает в данной ситуации.
В своем прошлом посте Мультиязычный CRM. Как автоматически назначить пользователю нужный язык я рассказал об одной из проблем, с которой сталкивается разработчик CRM на интернациональных проектах. Однако, назначить пользователю нужный язык - это лишь половина проблемы. В дальнейшем нам придется считаться с этим параметром во всех доработках, которые взаимодействуют с ним в текстовом виде.
Одна из таких задач - стандартные уведомления по электронной почте, которые встречаются в большинстве проектов. Увы, но в текущей версии CRM не предусмотрено способа чтобы получить язык пользователя в рабочем процессе. Технически задача решаема в XAML процессе, но этот способ для сильных духом. Я предпочитаю написать дополнительную активность процесса.
Ниже приведен код активности, которая возвращает числовой код языка пользователя, ссылка на которого была передана активности в качестве параметра:
Пример использования такой активности:
![Нажмите на изображение для увеличения
Название: Sutup.png
Просмотров: 258
Размер: 8.2 Кб
ID: 324](//axforum.info/forums/blog_attachment.php?s=79a37b14ab71ec5f8af6b32cc131af0a&attachmentid=324&thumb=1&d=1370350890)
На картинке процесс получает язык ответственного за задачу Пользователя, чтобы в дальнейшем обратится к нему на его языке:
![Нажмите на изображение для увеличения
Название: branch.png
Просмотров: 138
Размер: 8.7 Кб
ID: 325](//axforum.info/forums/blog_attachment.php?s=79a37b14ab71ec5f8af6b32cc131af0a&attachmentid=325&thumb=1&d=1370351108)
В своем прошлом посте Мультиязычный CRM. Как автоматически назначить пользователю нужный язык я рассказал об одной из проблем, с которой сталкивается разработчик CRM на интернациональных проектах. Однако, назначить пользователю нужный язык - это лишь половина проблемы. В дальнейшем нам придется считаться с этим параметром во всех доработках, которые взаимодействуют с ним в текстовом виде.
Одна из таких задач - стандартные уведомления по электронной почте, которые встречаются в большинстве проектов. Увы, но в текущей версии CRM не предусмотрено способа чтобы получить язык пользователя в рабочем процессе. Технически задача решаема в XAML процессе, но этот способ для сильных духом. Я предпочитаю написать дополнительную активность процесса.
Ниже приведен код активности, которая возвращает числовой код языка пользователя, ссылка на которого была передана активности в качестве параметра:
X++:
public sealed class GetUserLcidWorkflow : CodeActivity { [RequiredArgument] [Input("Пользователь")] [ReferenceTarget("systemuser")] public InArgument<EntityReference> SystemUser { get; set; } [Output("Код языка пользователя")] [Default("1049")] public OutArgument<int> LCID { get; set; } protected override void Execute(CodeActivityContext executionContext) { // Create the tracing service ITracingService tracingService = executionContext.GetExtension<ITracingService>(); // Create the context IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>(); IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); EntityReference user = SystemUser.Get<EntityReference>(executionContext); if (user.LogicalName == "systemuser") { Entity userSettings = service.Retrieve("usersettings", user.Id, new ColumnSet("uilanguageid")); this.LCID.Set(executionContext, userSettings.GetAttributeValue<int>("uilanguageid")); } else { tracingService.Trace("GetUserLcidWorkflow was executed for team reference"); } } }
На картинке процесс получает язык ответственного за задачу Пользователя, чтобы в дальнейшем обратится к нему на его языке:
Всего комментариев 0