Вдохнем вторую жизнь во встроенный почтовый клиент из 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С) то само собой возник вопрос почему документ "Электронное письмо" не тождественен событию. Так например в той же УНФ разрабы реализовали электронное письмо как один из вариантов события (т.е. у них нет в принципе такой отдельной от события сущности как "Электронное письмо").
Вообщем в итоге решили генерировать документы "Событие" при отправке и получении электронных писем. Для создания документа "Событие" при отправки электронного письма все в том же модуле "УправлениеЭлектроннойПочтой" в процедуре "ПолучениеОтправкаПисем" добавил кусок кода:
НовоеСобытие = Документы.Событие.СоздатьДокумент();
Если (Письма <> Неопределено) И (Письма.Получить(Письмо) <> Неопределено) Тогда
НовоеСобытие.Заполнить(Письма[Письмо].Ссылка);
Иначе
НовоеСобытие.Заполнить(Письмо.Ссылка);
КонецЕсли;
НовоеСобытие.Дата = ТекущаяДата();
НовоеСобытие.ТипСобытия = Перечисления.ВходящееИсходящееСобытие.Исходящее;
НовоеСобытие.СостояниеСобытия = Перечисления.СостоянияСобытий.Завершено;
НовоеСобытие.Записать(РежимЗаписиДокумента.Проведение);Вставить его нужно сразу после кода отправки:
