Showing posts with label service 1c outlook x64. Show all posts
Showing posts with label service 1c outlook x64. Show all posts

Monday, February 1, 2016

Отправка почты из под 1C через outlook

В обще дальнейшая часть автоматизации и веселостей от microsoft.
При отправке почтового сообщения через outlook api возникли проблемы

&НаКлиенте
Процедура Отправить(Команда)
Попытка
objOutlook = Новый COMОбъект("Outlook.Application");
Исключение
objOutlook = НЕопределено;
Возврат;
КонецПопытки;
myItem = objOutlook.CreateItem(0);
myRecipient = myItem.Recipients.Add("pd@rl.ua");
myRecipient.Type=1;
myItem.Subject = "Тест "+ТекущаяДата();
//myItem.Attachments.Add("C:\image.jpg");
myItem.HTMLBODY ="TEST";
myItem.Send();
КонецПроцедуры


при чем этот код работал нормально и письма уходили нормально.

А вот при отправке со стороны сервера была проблема


&НаКлиенте
Процедура Отправить(Команда)
ОтправитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтправитьНаСервере()

Попытка
objOutlook = Новый COMОбъект("Outlook.Application");
Исключение
objOutlook = НЕопределено;
Возврат;
КонецПопытки;
myItem = objOutlook.CreateItem(0);
myRecipient = myItem.Recipients.Add("pd@rl.ua");
myRecipient.Type=1;
myItem.Subject = "Тест "+ТекущаяДата();
//myItem.Attachments.Add("C:\image.jpg");
myItem.HTMLBODY ="TEST";
myItem.Send();
//myItem.Display();
КонецПроцедуры



Первично проверил по инету, с наскоку решить проблему не удалось
1. http://infostart.ru/public/325873/ выполняем
Заходим на сервер приложений 1С под локальным админом
Запускаем DCOMCNFG (Консоль настроек "Component Services")
Открываем ветку Console Root -> Component Services -> Computers -> My computer -> DCOM Config
Ищем "Microsoft Excel Application"
Если нашли, то переходим к пункту 4 (Настраиваем свойства DCOM компонента "Microsoft Excel Application")
Закрываем "Component Services"
Настройка реестра
Запускаем REGEDIT
Открываем ветку Computer\HKEY_CLASSES_ROOT\AppID\EXCEL.EXE, если ее нет, то создаем
Создаем в ней строковый параметр AppID = {00020812-0000-0000-C000-000000000046}
Выполняем команду "mmc comexp.msc /32", которая делает то же что и DCOMCONFIG, но позволяет видеть 32 битные компоненты.
После этого в Component Services должен появиться "Microsoft Excel Application"
Настраиваем свойства DCOM компонента "Microsoft Excel Application"
Закладка "Security"
"Launch and Activation Permissions" - Customize - Edit
Добавляем пользователя, под которым запускается агент сервера 1С
Назначем ему только следующие права (allow):
Local Launch
Local Activation
"Access Permissions" - Customize - Edit
Добавляем пользователя, под которым запускается агент сервера 1С
Назначаем ему только следующие права (allow):
Local Access
Закладка "Identity"
Должно быть выбрано "The launching user"
Системные папки
Папка "C:\Windows\SysWOW64\config\systemprofile\Desktop\"
Проверяем наличие папки , если нет -то создаем.
Заходим в свойства этой папки.
Закладка Security
Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
Добавляем право "Read" и "Write"
Папка "C:\Windows\System32\config\systemprofile\Desktop\"
Проверяем наличие папки , если нет -то создаем.
Заходим в свойства этой папки.
Закладка Security
Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
Добавляем право "Read" и "Write"

После этого почта все также не уходила, сделал шаг
2. http://stackoverflow.com/questions/3750605/getting-creating-an-outlook-application-in-windows-7
In start menu select Run
Type dcomcnfg and click OK
Component Services window is opened.
Expand the nodes Component Services -> MyComputer -> DCOM Config .
Right click on the application (Outlook Message Attachment) and select properties.
Click on Identity tab whatever necessary.
Click on “The interactive user" then OK

Вот после этого почта стала уходить нормально.

Friday, August 1, 2014

Автоматическая загрузка прайса и работа с ФорматированныйДокумент

Есть у меня почтовая рассылка прайс листов из 1с. Сделана она с использованием ФорматированныйДокумент.
Лень, как известно двигатель прогресса, в общем надоело мне грузить картинки в рассылки каждый раз вручную, и задумался я над тем как сделать это все автоматом...
В общем логика состоит в том, что маркетинг высылаем письмо роботу на почту, робот почту анализирует и создает документ рассылки.
Нарвался на трудность в форматируемом документе, это отсутствие возможности отцентровать текст (сделать по центру). Решения в нете не нашел, сделал свое.

ТелоРассылки.ПолучитьHTML(ТекстHTML,Вложения);
			ТекстHTML = СтрЗаменить(ТекстHTML,"","
"center"">
"
); ТелоРассылки.УстановитьHTML(ТекстHTML,Вложения);

А ниже уже обработка по загрузке с почты прайсов.


Процедура КомандаGetНаСервере()
	//НЕ забываем проверить как запускает оутглюк!!!!  runas /user:rl\usr1cv82 "C:\Program Files\Microsoft Office\Office15\outlook.exe"
	//
	
	
	RegExp = Новый COMОбъект("VBScript.RegExp");
	//СтруктураФайлов = Новый СписокЗначений;
	RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка 
	RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения 
	RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске 	
	RegExp.Pattern = "Дата:.*(\d{4})/(\d{1,2})/(\d{1,2})";
	
	
	
	olFolderInbox = 6;
	Попытка
		objOutlook = Новый COMОбъект("Outlook.Application");
	Исключение
		objOutlook = НЕопределено;
		//Сообщить("Не удалось создать объект Outlook.Application. Outlook установлен на компьютер?");
		Возврат;
	КонецПопытки;
	
	objNamespace = objOutlook.GetNamespace("MAPI");
	objFolderInbox = objNamespace.GetDefaultFolder(olFolderInbox);
	colMails = objFolderInbox.Items.Restrict("[unread] = true");
	Для каждого mail из colMails Цикл
		попытка
			Body = mail.HTMLBody;
		Исключение
			Body = mail.Body;
		КонецПопытки;
    	Matches=RegExp.Execute(Body);
		Если RegExp.Test(Body) тогда
			Год = Matches.Item(0).SubMatches.Item(0);
			Если СтрДлина(Год)=2 тогда
				Год="20"+Год;
			КонецЕсли;
			Месяц = Формат(Matches.Item(0).SubMatches.Item(1),"ЧН=0; ЧВН=");	
			День = Формат(Matches.Item(0).SubMatches.Item(2),"ЧН=0; ЧВН=");	
			Path = "\\srv-1c-01.rl.int\Price\"+Год+Месяц+День;
			for each File in НайтиФайлы(Path,,true) do
				If не File.Name="Thumbs.db" then
					УдалитьФайлы(File.FullName);
				Endif;
			EndDo;
			Если НайтиФайлы(Path).Количество()=0 тогда
				СоздатьКаталог(Path);
			КонецЕсли;
			
			ДокСсылка  = ПроверкаДокументаВБазе(Дата(Год,Месяц,День));
			Если НЕ ДокСсылка.Пустая() тогда
				ДокОбъект = ДокСсылка.ПолучитьОбъект();
			Иначе
				ДокОбъект = Документы.РассылкаПрайсЛистов.СоздатьДокумент();
			КонецЕсли;
			ДокОбъект.Дата = Дата(Год,Месяц,День);
			ДокОбъект.ДатаОтправки = Дата(Год,Месяц,День)+8*60*60;
			ДОкОбъект.Ответственный = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор("d57cf6b5-3dcd-11e1-80e4-00155d040a09"));
			ДОкОбъект.Автор = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор("d57cf6b5-3dcd-11e1-80e4-00155d040a09"));
			ДокОбъект.Статус = Перечисления.СтатусыРассылкиПрайса.Согласован;
			ДокОбъект.Комментарий = "Сформирован автоматом "+ Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH:mm:ss'");
			ДокОбъект.Тема = "Ежедневная рассылка прайс-листа  "+Формат(ДокОбъект.Дата,"ДФ='ддд dd/MM/yyyy'");
			ТелоРассылки = Новый ФорматированныйДокумент;
			ТекстHTML = Неопределено;
			Вложения = Неопределено;
						
			ТелоРассылки.ПолучитьHTML(ТекстHTML,Вложения);
			ТекстHTML = СтрЗаменить(ТекстHTML,"","
"center"">
"
); ТелоРассылки.УстановитьHTML(ТекстHTML,Вложения); ЕстьЧтоДобавлять = Ложь; For each Att in mail.Attachments do If Lower(Left(Att.FileName,5))="image" then Continue; EndIf; If Find("jpg,png,bmp,gif",Right(Att.FileName,3))> 0 then ЕстьЧтоДобавлять = Истина; Att.SaveAsFile(Path+"\"+Att.FileName); ТелоРассылки.Добавить(,ТипЭлементаФорматированногоДокумента.ПереводСтроки); ТелоРассылки.Добавить(Новый Картинка(Path+"\"+Att.FileName), ТипЭлементаФорматированногоДокумента.Картинка); endif; EndDo; ДокОбъект.Тело = Новый ХранилищеЗначения(ТелоРассылки,Новый СжатиеДанных(9)); ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; КонецЦикла; //закрываем соединение Попытка objNamespace.Logoff(); objOutlook.Quit(); Исключение КонецПопытки; objNamespace = Неопределено; objFolderInbox = неопределено; objOutlook = НЕопределено; colMails = Неопределено; КонецПроцедуры Функция ПроверкаДокументаВБазе(ДатаДок) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 | РассылкаПрайсЛистов.Ссылка |ИЗ | Документ.РассылкаПрайсЛистов КАК РассылкаПрайсЛистов |ГДЕ | НЕ РассылкаПрайсЛистов.ПометкаУдаления | И НАЧАЛОПЕРИОДА(РассылкаПрайсЛистов.Дата, ДЕНЬ) = &Дата"; Запрос.УстановитьПараметр("Дата", ДатаДок); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Если ВыборкаДетальныеЗаписи.Следующий() Тогда Возврат ВыборкаДетальныеЗаписи.Ссылка; КонецЕсли; Возврат Документы.РассылкаПрайсЛистов.ПустаяСсылка(); КонецФункции
Работает это все на Windows 2008R2 x64 c Microsoft Office x64, outlook x64. и работает нормально, главное не забыть отключить безопасность в outlook.