Добрый день, Коллеги!
Допустим, есть задача, сформировать программное электронное письмо шаблон и в него вставлять какой-то свободно изменяемый текст в зависимости от ситуации а-ля официальный бланк на бумаге. Разберём на примере поздравления с новым годом наших горячо любимых клиентов! УРА! И сделаем мы это без помощи дизайнеров и верстальщиков! УРА!
1. Создаем шаблон HTML в виде строкового типа 1С
Допустим, у вас есть некий официальный или фирменный бланк в WORD (не реклама).
А если нет, то вы я думаю, легко его сможете в том же WORD создать. Для примера я создал:
Понял, что меня устраивает такой дизайн, делаю его пригодным для внутрипрограммного «парсинга». Т.е. раставляю метки, которые позже буду использовать.
Для себя нашел самый простой способ конвертировать его в HTML в том же WORDе. Просто сохраняем его в HTML и открываем с помощью браузера CHROME (не реклама).
А затем подготавливаем небольшую обработку. Чтобы легко и быстро конвертировать код HTML в строку 1С. Может можно иначе, но я решил так.
Создал внешнею обработку, на форме два реквизита оба строковые «Исходный» и «Конвертированный», одна команда «Конвертировать».
Код команды "Конвертировать":
&НаКлиенте
Процедура Конвертировать(Команда)
БуферКод = СтрЗаменить(Исходный,Символы.ПС,Символы.ПС + "|");
БуферКод = СтрЗаменить(БуферКод,"""","""""");
Конвертированный = БуферКод;
КонецПроцедуры
Теперь мы готовы и возвращаемся в CHROME к нашей заготовке. Правой кнопкой по самому полю страницы вызываем контекстное меню и выбираем пункт «Просмотреть код страницы».
Копируем его весь, не парьтесь вы же ни верстальщик и ни дизайнер, по этому просто пока бездумно всё забираем (но конечно можете блеснуть знанием HTML и сверстать так как вам угодно, но мне это не интересно пока), вставляем в нашу свежеиспеченную обработку и конвертируем ;)
Всё текст готов для вставки в код.
2. Создаем рассыльщик с поддержкой HTML
Теперь займёмся написанием процедуры отправки почты. В примере создадим обработку, через которую будет производиться отправка почты.
Реквизиты все строкового типа: Адреса, Должность, ЗаголовокПисьма, Подпись, ТекстПисьма, ТемаПисьма и ФИО.
Обработка готова, теперь нам нужно написать типовой код подключения к почте и отправке письма. В качестве электронной почты, с которой будет производиться рассылка, выступит YANDEX.RU (не реклама).
&НаКлиенте
Процедура ОтправитьПочту(Команда)
ТекстДляОтправки = СформироватьТекстПисьма();
//Настройки почты
АдресСервераSMTP = "smtp.yandex.ru";
ПортSMTP = "465";
Email = "ВАШАПОЧТА@yandex.ru";
Пароль = "ВАШПАРОЛЬ!!!";
//Создаем профиль подключения
//Тестировал, этого достаточно для работы с YANDEX.RU
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = АдресСервераSMTP;
Профиль.ПортSMTP = ПортSMTP;
Профиль.ПользовательSMTP = Email;
Профиль.ПарольSMTP = Пароль;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ИспользоватьSSLSMTP = Истина;
//Можно так определиться в каком форма слать письмо, мы конечно выберем HTML
HTML = ИСТИНА;
ТипТекста = ?(HTML,ТипТекстаПочтовогоСообщения.HTML,ТипТекстаПочтовогоСообщения.ПростойТекст);
//Создаем письмо
ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Тема = ТемаПисьма;
ПочтовоеСообщение.ИмяОтправителя="Дед Мороз";
ПочтовоеСообщение.Отправитель = Email;
АдресаСписком = СтрЗаменить(СокрЛП(Адреса),",",Символы.ПС);
//Участок кода ответственный за массовую рассылку.
//Если все адреса ввести через запятую!
//Есть минус, все получатели увидят других получателей.
//Если не хотите чтобы получатели видели весь список,
//отправляйте каждому индивидуально много раз вызывая данную процедуру.
Для Индекс = 1 По СтрЧислоСтрок(АдресаСписком) Цикл
ТекущийАдрес = СтрПолучитьСтроку(АдресаСписком, Индекс);
ПочтовоеСообщение.Получатели.Добавить(СокрЛП(ТекущийАдрес));
КонецЦикла;
ПочтовоеСообщение.Тексты.Добавить(ТекстДляОтправки,ТипТекста);
ПочтовоеСообщение.ОбработатьТексты();
Почта = Новый ИнтернетПочта;
//Подключаемся к почте
Попытка
Почта.Подключиться(Профиль);
ОшибкаПодключения = "";
Исключение
ОшибкаПодключения = ОписаниеОшибки();
КонецПопытки;
//Отправляем письмо
Попытка
Почта.Послать(ПочтовоеСообщение);
ОшибкаПриОтправке = "";
Исключение
ОшибкаПриОтправке = ОписаниеОшибки();
//Сообщить(ОшибкаПриОтправке);
КонецПопытки;
//Ведём лог при необходимости
Если ЛОЖЬ
ИЛИ ОшибкаПодключения <> ""
ИЛИ ОшибкаПриОтправке <> ""
Тогда
//Тут вы можете вести лог или отправлять себе почту, об нежданчиках
КонецЕсли;
//Закрываем письмо
Почта.Отключиться();
КонецПроцедуры
После проверки кода, конфигуратор выдаст ошибку: «Процедура или функция с указанным именем не определена (СформироватьТекстПисьма)». Вот и переходим к конечному пункту формированию самого письма.
Создаем новую функцию и одну текстовую переменную в ней для начала «Шаблон», которой присваиваем заранее скопированный из буфера конвертированной в обработке созданной нами выше текст, просто не задумывая с набор этих букв.
&НаКлиенте
Функция СформироватьТекстПисьма()
Шаблон = "
|<html>
|
|<head>
|<meta http-equiv=Content-Type content=""text/html; charset=windows-1251"">
|<meta name=Generator content=""Microsoft Word 14 (filtered)"">
|<style>
|<!--
| /* Font Definitions */
| @font-face
| {font-family:Calibri;
| panose-1:2 15 5 2 2 2 4 3 2 4;}
|@font-face
| {font-family:Tahoma;
| panose-1:2 11 6 4 3 5 4 4 2 4;}
| /* Style Definitions */
| p.MsoNormal, li.MsoNormal, div.MsoNormal
| {margin-top:0cm;
| margin-right:0cm;
| margin-bottom:10.0pt;
| margin-left:0cm;
| line-height:115%;
| font-size:11.0pt;
| font-family:""Calibri"",""sans-serif"";}
|p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
| {mso-style-link:""Текст выноски Знак"";
| margin:0cm;
| margin-bottom:.0001pt;
| font-size:8.0pt;
| font-family:""Tahoma"",""sans-serif"";}
|span.a
| {mso-style-name:""Текст выноски Знак"";
| mso-style-link:""Текст выноски"";
| font-family:""Tahoma"",""sans-serif"";}
|.MsoPapDefault
| {margin-bottom:10.0pt;
| line-height:115%;}
|@page WordSection1
| {size:595.3pt 841.9pt;
| margin:2.0cm 42.5pt 2.0cm 3.0cm;}
|div.WordSection1
| {page:WordSection1;}
|-->
|</style>
|
|</head>
|
|<body lang=RU>
|
|<div class=WordSection1>
|
|<table class=MsoTableGrid border=0 cellspacing=0 cellpadding=0 width=""100%""
| style='width:100.0%;border-collapse:collapse;border:none'>
| <tr>
| <td width=""36%"" valign=top style='width:36.68%;border:none;border-right:solid windowtext 1.0pt;
| padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'><img width=216 height=43 id=""Рисунок 1""
| src=""Информационно1.files/image001.png""></p>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'> </p>
| <p class=MsoNormal align=center style='margin-bottom:0cm;margin-bottom:.0001pt;
| text-align:center;line-height:normal'><span style='font-size:9.0pt'>Информационно-аналитический
| центр по автоматизации учета и управления</span></p>
| </td>
| <td width=""63%"" valign=top style='width:63.32%;border:none;padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'>Инфостарт — информационно-аналитический центр по автоматизации учета
| и управления на 1С 7.7, 1С 8.0, 1С 8.1, 1С 8.2, 1С 8.3.</p>
| </td>
| </tr>
|</table>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>Должность</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ФИО</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ТекущаяДата</p>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal align=center style='text-align:center'><span
|style='font-size:20.0pt;line-height:115%'>ЗаголовокПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>ТекстПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'> </span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>Подпись</span></p>
|
|</div>
|
|</body>
|
|</html>
|";
КонецФункции
Нужно главное не забыть! Что у нас есть картинка, и её придётся ручками под редактировать в коде… Сейчас путь указан «src=""Информационно1.files/image001.png""». Где это 1С не поймёт, по этому я создал папочку и положил картинку в неё и разместил все для примера на диске С.
Получил новый путь и вставлю его в тег SRC. Выходит «src="" C:\public\logo.jpg""».
ВНИМАНИЕ! Если папка шара, то путь указывается с одним слешем типа «src="" \192.168.1.1.\Bid\kotov\logo.jpg», 1С и это съест нормально. Почему один не знаю, но так работает у меня проверено ;)
Вот теперь после присвоения переменной «Шаблон», будем её изменять и редактировать программно всего одной функцией СтрЗаменить и идти к успеху! Вы же помните наши метки, по ним и будем ориентироваться. Готовая функция:
&НаКлиенте
Функция СформироватьТекстПисьма()
Шаблон = "
|<html>
|
|<head>
|<meta http-equiv=Content-Type content=""text/html; charset=windows-1251"">
|<meta name=Generator content=""Microsoft Word 14 (filtered)"">
|<style>
|<!--
| /* Font Definitions */
| @font-face
| {font-family:Calibri;
| panose-1:2 15 5 2 2 2 4 3 2 4;}
|@font-face
| {font-family:Tahoma;
| panose-1:2 11 6 4 3 5 4 4 2 4;}
| /* Style Definitions */
| p.MsoNormal, li.MsoNormal, div.MsoNormal
| {margin-top:0cm;
| margin-right:0cm;
| margin-bottom:10.0pt;
| margin-left:0cm;
| line-height:115%;
| font-size:11.0pt;
| font-family:""Calibri"",""sans-serif"";}
|p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
| {mso-style-link:""Текст выноски Знак"";
| margin:0cm;
| margin-bottom:.0001pt;
| font-size:8.0pt;
| font-family:""Tahoma"",""sans-serif"";}
|span.a
| {mso-style-name:""Текст выноски Знак"";
| mso-style-link:""Текст выноски"";
| font-family:""Tahoma"",""sans-serif"";}
|.MsoPapDefault
| {margin-bottom:10.0pt;
| line-height:115%;}
|@page WordSection1
| {size:595.3pt 841.9pt;
| margin:2.0cm 42.5pt 2.0cm 3.0cm;}
|div.WordSection1
| {page:WordSection1;}
|-->
|</style>
|
|</head>
|
|<body lang=RU>
|
|<div class=WordSection1>
|
|<table class=MsoTableGrid border=0 cellspacing=0 cellpadding=0 width=""100%""
| style='width:100.0%;border-collapse:collapse;border:none'>
| <tr>
| <td width=""36%"" valign=top style='width:36.68%;border:none;border-right:solid windowtext 1.0pt;
| padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'><img width=216 height=43 id=""Рисунок 1""
//КАРТИНКА КОТОРАЯ ТРЕБУЕТ ЗАМЕНЫ НА РЕАЛЬНО СУЩЕСТВУЮЩИЮ У ВАС
| src=""C:\public\logo.jpg""></p>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'> </p>
| <p class=MsoNormal align=center style='margin-bottom:0cm;margin-bottom:.0001pt;
| text-align:center;line-height:normal'><span style='font-size:9.0pt'>Информационно-аналитический
| центр по автоматизации учета и управления</span></p>
| </td>
| <td width=""63%"" valign=top style='width:63.32%;border:none;padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'>Инфостарт — информационно-аналитический центр по автоматизации учета
| и управления на 1С 7.7, 1С 8.0, 1С 8.1, 1С 8.2, 1С 8.3.</p>
| </td>
| </tr>
|</table>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>Должность</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ФИО</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ТекущаяДата</p>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal align=center style='text-align:center'><span
|style='font-size:20.0pt;line-height:115%'>ЗаголовокПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>ТекстПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'> </span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>Подпись</span></p>
|
|</div>
|
|</body>
|
|</html>
|";
ПисьмоДляОтправки = СтрЗаменить(Шаблон,"Должность",Должность);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ФИО",ФИО);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ТекущаяДата",Формат(ТекущаяДата(),"ДЛФ=Д"));
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ЗаголовокПисьма",ЗаголовокПисьма);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ТекстПисьма",ТекстПисьма);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"Подпись",Подпись);
Возврат ПисьмоДляОтправки;
КонецФункции
3. Проверка работы
Запускаем обработку, заполняем данными и отправляем поздравительный спам :)
Результат проверил на разных почтовых сервисах, программах и устройствах:
А вот в мобильной версии из меня не удачный верстальщик ;)
По этому смотрите сами, корректируйте и выстраивайте шаблон так в WORDе, чтобы он читабелен был везде ;)
Резюме
Мы имеем возможность создать свой универсальный шаблон, в который можно выводить отчет, вставлять разные картинки от ситуации, конечно потребуется минимальное понимание HTML (для динамического формирования таблицы и её заполнения), но это позволит создавать рассылку или уведомления более привлекательными. А это хороший шаг в Email-маркетинге иметь привлекательное письмо.
Можно развить шаблон до формата редактирования его прямо в 1С используя одну из многочисленных обработок:
//infostart.ru/public/all/?st=t&public-filter%5Bsearch%5D=%F0%E5%E4%E0%EA%F2%EE%F0+HTML
Но лично мне удобнее и проще показалось создать шаблон в ворде, чем ковыряться в html-редакторе.
Удачного кодинга! С наступающим Новым Годом!
ПС (добавим таблицу значений в официальное письмо):
Хочется отметить, что данная работа развилась в желание отправлять отчетность прямо в теле письма, по этому нужен был простой и удобный механизм трансформации таблицы значений в строковый тип 1С содержащий таблицу HTML. Вот тут вам и поможет моя функция в открытом доступе - //infostart.ru/public/717412/ функции можно передать структуру параметров, в которой указать ряду колонок своё выравнивание, задать цвет шапки, свои размеры колонкам, переименовать заголовки колонок, а так же вывести зачастую необходимый пункт по порядку. Т.е. выгружаем запрос в таблицу значений, передаем таблицу значений в функцию и получаем результат вставив строку в тело официального письма: