Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 дек 2024, 22:19

Отправка писем при смене статусов

Автор Vitalik54, 04 мар 2015, 23:16

0 Пользователей и 1 гость просматривают эту тему.

Vitalik54

Всем доброго времени суток. Ситуация следующая: есть задача дописать отправку писем с информации о смене статуса заказа клиента при сохранении самого заказа.
Возник вопрос, достаточно ли на для отправки вставить следующий код из стандартных механизмов 1С?

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

ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая();

Попытка
НачатьТранзакцию();
Письмо = Документы.ЭлектронноеПисьмоИсходящее.СоздатьДокумент();

Письмо.Автор                    = Пользователи.ТекущийПользователь();
Письмо.Ответственный            = Пользователи.ТекущийПользователь();
Письмо.Дата                     = ТекущаяДатаСеанса();
Письмо.Важность                 = Перечисления.ВариантыВажностиВзаимодействия.Обычная;
Письмо.Кодировка                = КодировкаТекста.UTF8;
Письмо.ОтправительПредставление = Объект.ОтправительПредставление;

Если Объект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст Тогда

Письмо.Текст = Объект.ТекстСообщенияПисьма;

Иначе

ТаблицаСоответствийИменВложенийИдентификаторам.Очистить();

СтруктураВложений = Новый Структура;
ТекстСообщенияПисьмоФорматированныйДокумент.ПолучитьHTML(Письмо.ТекстHTML, СтруктураВложений);
Для каждого Вложение Из СтруктураВложений Цикл

НоваяСтрока = ТаблицаСоответствийИменВложенийИдентификаторам.Добавить();
НоваяСтрока.ИмяФайла                  = Вложение.Ключ;
НоваяСтрока.ИдентификаторФайлаДляHTML = Новый УникальныйИдентификатор;
НоваяСтрока.Картинка                  = Вложение.Значение;

КонецЦикла;

Если ТаблицаСоответствийИменВложенийИдентификаторам.Количество() > 0 Тогда

ДокументHTML = Взаимодействия.ПолучитьОбъектДокументHTMLИзТекстаHTML(Письмо.ТекстHTML);
Взаимодействия.ЗаменитьИменаКартинокНаИдентификаторыПочтовыхВложенийВHTML(
ДокументHTML, ТаблицаСоответствийИменВложенийИдентификаторам.Выгрузить());

Письмо.ТекстHTML = Взаимодействия.ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML);
Письмо.Текст     = Взаимодействия.ПолучитьОбычныйТекстИзHTML(Письмо.ТекстHTML);

КонецЕсли;

КонецЕсли;

Письмо.Тема = Объект.ТемаПисьма;
Письмо.ТипТекста = ?(Объект.ТипТекстаПисьма  = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML,
Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками,
Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст);
Письмо.УчетнаяЗапись = Объект.УчетнаяЗапись;
Письмо.ВзаимодействиеОснование = Неопределено;

//Заполним реквизиты ВключатьТелоИсходногоПисьма, ОтображатьТелоИсходногоПисьма, УведомитьОДоставке и УведомитьОПрочтении
НастройкиПользователя = Взаимодействия.ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
                           Объект.УчетнаяЗапись,
                           Объект.ТипТекстаПисьма,
                           Истина);
ЗаполнитьЗначенияСвойств(Письмо, НастройкиПользователя);

НайденныеСтроки = ДоступныеДляОтправкиУчетныеЗаписи.НайтиСтроки(Новый Структура("УчетнаяЗапись", Объект.УчетнаяЗапись));
Если НайденныеСтроки.Количество() = 0 Тогда
Письмо.УдалятьПослеОтправки = Ложь;
Иначе
Письмо.УдалятьПослеОтправки = НайденныеСтроки[0].УдалятьПослеОтправки;
КонецЕсли;

Письмо.Комментарий = КомментарийПоНаименованиюШаблона();

Для Каждого ПолучательПисьма Из Объект.АдресатыПочта Цикл

Если Не ПолучательПисьма.ПолучательВыбран Тогда
Продолжить;
КонецЕсли;

Если ПолучательПисьма.Группа = "Кому" Тогда
ИмяТаблицы = "ПолучателиПисьма";
ИначеЕсли ПолучательПисьма.Группа = "Скрытые" Тогда
ИмяТаблицы = "ПолучателиСкрытыхКопий";
ИначеЕсли ПолучательПисьма.Группа = "Копии" Тогда
ИмяТаблицы = "ПолучателиКопий";
ИначеЕсли ПолучательПисьма.Группа = "Получатели" Тогда
ИмяТаблицы = "ПолучателиОтвета";
Иначе
Продолжить;
КонецЕсли;

НоваяСтрока = Письмо[ИмяТаблицы].Добавить();
НоваяСтрока.Адрес         = ПолучательПисьма.Адрес;
НоваяСтрока.Представление = ПолучательПисьма.Представление;
НоваяСтрока.Контакт       = ПолучательПисьма.Контакт;

КонецЦикла;

Письмо.СписокПолучателейПисьма        = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(
                                                                      Письмо.ПолучателиПисьма, Ложь);
Письмо.СписокПолучателейКопий         = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(
                                                                      Письмо.ПолучателиКопий, Ложь);
Письмо.СписокПолучателейСкрытыхКопий  = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(
                                                                      Письмо.ПолучателиСкрытыхКопий, Ложь);
Если ИнформационнаяБазаФайловая Тогда
Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик;
Иначе
Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее;
КонецЕсли;

Если Вложения.Количество() > 0 ИЛИ ТаблицаСоответствийИменВложенийИдентификаторам.Количество() > 0 Тогда
Письмо.ЕстьВложения = Истина;
КонецЕсли;

Письмо.Размер = ОценитьРазмерПисьма(Письмо);

Письмо.Записать();

//Добавим вложения
Для Каждого СтрокаТаблицыВложений Из Вложения Цикл

Размер = 0;
ИмяФайла = СтрокаТаблицыВложений.ИмяФайла;

УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
Письмо.Ссылка, СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере, ИмяФайла, Размер);

КонецЦикла;

Если Объект.ТипТекстаПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда

Для каждого Вложение Из ТаблицаСоответствийИменВложенийИдентификаторам Цикл

ДвоичныеДанныеКартинки = Вложение.Картинка.ПолучитьДвоичныеДанные();
АдресКартинкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
ПрисоединенныйФайл = УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
Письмо.Ссылка,
АдресКартинкиВоВременномХранилище,
"_" + СтрЗаменить(Вложение.ИдентификаторФайлаДляHTML, "-", "_"),
ДвоичныеДанныеКартинки.Размер());

Если ПрисоединенныйФайл <> Неопределено Тогда
ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект();
ПрисоединенныйФайлОбъект.ИДФайлаЭлектронногоПисьма = Вложение.ИдентификаторФайлаДляHTML;
ПрисоединенныйФайлОбъект.Записать();
КонецЕсли;

КонецЦикла;

КонецЕсли;

Предмет = ?(ЗначениеЗаполнено(Объект.Предмет), Объект.Предмет, Письмо.Ссылка);
Реквизиты = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(,Предмет,Истина,);
ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Письмо.Ссылка, Реквизиты);
ЗафиксироватьТранзакцию();

Исключение
ОтменитьТранзакцию();
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании письма %1'"),КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;

Попытка
ИдентификаторПисьма = Взаимодействия.ВыполнитьОтправкуПисьма(Письмо);
Исключение
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при отправке письма %1'"),КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;

Если НЕ Письмо.УдалятьПослеОтправки Тогда

Попытка
Письмо.ИдентификаторСообщения = ИдентификаторПисьма;
Письмо.СтатусПисьма          = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено;
Письмо.ДатаОтправления       = ТекущаяДатаСеанса();
Письмо.Записать(РежимЗаписиДокумента.Запись);

ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(
Письмо.Ссылка, Взаимодействия.ОпределитьПапкуДляПисьма(Письмо.Ссылка));
Исключение
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                    НСтр("ru = 'Ошибка при записи письма после успешной отправки %1'"),
                    КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Иначе

Письмо.Прочитать();
Письмо.Удалить();

КонецЕсли;

КонецПроцедуры


Если так, то в каком виде указывать получателя(Имею в виду вопрос с типом данных. Я вытаскиваю адрес из карточки конрагента, а в Письмо.ПолучателиПисьма через отладчик показывается некая таблица значений. Как в итоге указывать получателя не совсем понимаю.)?

Если это все по другому делается, то в каком направлении мне нужно идти?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск