Каталог решений - Вдохнем вторую жизнь во встроенный почтовый клиент из 1С:Управление торговлей 10.3

Вдохнем вторую жизнь во встроенный почтовый клиент из 1С:Управление торговлей 10.3

Вдохнем вторую жизнь во встроенный почтовый клиент из 1С:Управление торговлей 10.3

В наличии

Хотели было воспользоваться почтовым клиентом из Управление торговлей 10.3, да не тут-то было. К сожалению, фирма «1С» почти совсем ее забросила и если Ваш респондент отправляет Вам письма, содержащие HTML, то Вас ждут матюки… Ну что же, как говорится: «Спасение утопающих — дело рук самих утопающих».

Категория:

Описание

Недавно возникла необходимость воспользоваться почтовым клиентом в Управление торговлей 10.3. Собирались получать письма из почтового ящика на Яндексе. Новый почтовый ящик — на нем лежало-то всего-ничего — пара писем от Яндекса с благодарностью за регистрацию. И каково же было удивление когда выяснилось, что даже эти несчастные письма мы получить не можем. Если письма содержали HTML то попытка получения этих писем приводила к ошибке:

{ОбщийМодуль.УправлениеЭлектроннойПочтой.Модуль(205)}: Метод объекта не обнаружен (tags)
        ТегиКартинок = НовыйHTMLДокумент.all.tags("img");
 

Если погуглить данную ошибку, то в ответ тишина. О ней рапортуют на разных форумах, но решений так и нет.

В результате не мудрствуя лукаво (возможно у кого-то будет более красивое решение) отключил код с ошибкой. В модуле "УправлениеЭлектроннойПочтой" в процедуре "УстановитьТекстПисьма" закомментировал кусок кода и вставил под ним строку для обхода:

//НовыйHTMLДокумент = Новый COMОбъект("HtmlFile");
//НовыйHTMLДокумент.open("text/html");
//НовыйHTMLДокумент.write(ХТМЛ_Текст);
//НовыйHTMLДокумент.close();
//ТегиКартинок = НовыйHTMLДокумент.all.tags("img");
//Для а = 0 По ТегиКартинок.length - 1 Цикл
//	ИсточникКартинки = ТегиКартинок.item(а).src;
//	Если Найти(ИсточникКартинки, "cid:") = 1 Тогда
//		ИсточникКартинки = Сред(ИсточникКартинки, 5);
//		ТегиКартинок.item(а).src = ИсточникКартинки;
//	КонецЕсли;
//КонецЦикла;
//ПисьмоОбъект.ТекстПисьма = НовыйHTMLДокумент.all.tags("html").item(0).outerHTML;
ПисьмоОбъект.ТекстПисьма = ХТМЛ_Текст;

На этом дело не закончилось. При попытке просмотра некоторых писем вываливалось аналогичное сообщение об ошибке:

{ОбщийМодуль.УправлениеЭлектроннойПочтой.Модуль(3095)}: Поле объекта не обнаружено (innerText)
    Возврат СтрЗаменить(НовыйHTMLДокумент.all.item(0).innerText, Символ(13), "");
 

Тут на помощь нам приходит более современная конфигурация УНФ, разработчикам которой есть дело до того как в ней работает встроенный почтовый клиент. Все в том же модуле "УправлениеЭлектроннойПочтой" в процедуре "ПреобразоватьТекстИзХТМЛФорматаВПростой" закомментировал кусок кода и вставил под ним строки для обхода:

//НовыйHTMLДокумент = Новый COMОбъект("HtmlFile");
//НовыйHTMLДокумент.open("text/html");
//НовыйHTMLДокумент.write(ТекстВФорматеХТМЛ);
//НовыйHTMLДокумент.close();
	
//Возврат СтрЗаменить(НовыйHTMLДокумент.all.item(0).innerText, Символ(13), "");

ПереводСтроки = Символы.ВК + Символы.ПС;

ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "</o:p>", "</o:p>" + ПереводСтроки);
ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "</o:p>" + ПереводСтроки + ПереводСтроки, "</o:p>" + ПереводСтроки);
ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "</p>", "</p>" + ПереводСтроки);
ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "</p>" + ПереводСтроки + ПереводСтроки, "</p>" + ПереводСтроки);
ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "</div>", "</div>" + ПереводСтроки);
ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "</div>" + ПереводСтроки + ПереводСтроки, "</div>" + ПереводСтроки);
ТекстВФорматеХТМЛ = СтрЗаменить(ТекстВФорматеХТМЛ, "<br>", ПереводСтроки + ПереводСтроки);

Построитель = Новый ПостроительDOM;
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстВФорматеХТМЛ);

ДокументHTML = Построитель.Прочитать(ЧтениеHTML);

УдалитьТегиИзЭлементаHTML(ДокументHTML, "style");

Если ДокументHTML.Тело = Неопределено Тогда
	Возврат "";
КонецЕсли;

Возврат ДокументHTML.Тело.ТекстовоеСодержимое;

И добавить процедуру:

Процедура УдалитьТегиИзЭлементаHTML(ЭлементHTML, Тег)
	
	Для каждого Узел Из ЭлементHTML.ДочерниеУзлы Цикл
		Если НРег(Узел.ИмяУзла) = НРег(Тег) Тогда
			ЭлементHTML.УдалитьДочерний(Узел);
		Иначе
			// Рекурсия
			УдалитьТегиИзЭлементаHTML(Узел, Тег);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Я же вообще вставил туда вызов функции "ПолучитьТекстИзHTML" из модуля "Гипертекст" из последних релизов УНФ. Подумалось что может еще что-нибудь оттуда пригодится. Правда придется немного обработать его "напильником" (дело в том что там активно используются новые функции "СтрШаблон" и "Найти").

Так как организация, для которой это делалось, активно использовала механизм событий (собственно из-за чего и начался весь сырбор с интеграцией почты в 1С) то само собой возник вопрос почему документ "Электронное письмо" не тождественен событию. Так например в той же УНФ разрабы реализовали электронное письмо как один из вариантов события (т.е. у них нет в принципе такой отдельной от события сущности как "Электронное письмо").

Вообщем в итоге решили генерировать документы "Событие" при отправке и получении электронных писем. Для создания документа "Событие" при отправки электронного письма все в том же модуле "УправлениеЭлектроннойПочтой" в процедуре "ПолучениеОтправкаПисем" добавил кусок кода:

НовоеСобытие = Документы.Событие.СоздатьДокумент();
Если (Письма <> Неопределено) И (Письма.Получить(Письмо) <> Неопределено) Тогда
	НовоеСобытие.Заполнить(Письма[Письмо].Ссылка);
Иначе
	НовоеСобытие.Заполнить(Письмо.Ссылка);
КонецЕсли;
НовоеСобытие.Дата				= ТекущаяДата();
НовоеСобытие.ТипСобытия			= Перечисления.ВходящееИсходящееСобытие.Исходящее;
НовоеСобытие.СостояниеСобытия	= Перечисления.СостоянияСобытий.Завершено;
НовоеСобытие.Записать(РежимЗаписиДокумента.Проведение);

Вставить его нужно сразу после кода отправки:

 

has been added to your cart:
Оформление заказа