Расширение предоставляет возможности отправки и получения потовых сообщений. Сообщения можно отправлять пользователям как из какой-либо обработки, так и через регламент, по какому либо событию (событие каждый разработчик разрабатывает самостоятельно).
Возможности расширения:
- Отправка сообщения по регламенту.
- Отправка сообщений пользователем.
- Сохранение списка отправленных сообщений.
- Удаление старых сообщений.
- Чтение входящей почты.
Каталоги архива:
1. "Расширение для работы обработок", содержит файл с расширением "РасширениеСпамБОТ.cfe",
синоним "СПАМ БОТ" позволяет формировать и отправлять и получать почтовые уведомления. В основном расширение ориентирована на доставку уведомлений. Проект "Спам БОТ" призван облегчить
2. "Обработка отправки почтовых уведомлений", содержит файлы обработок:
а. "СОГ_РассылкаСообщенийПоРегистру.epf" - обработка выполняет роль регламентного задания по отправке почтовых сообщений, на базе БСП. У расширения нет возможности создавать свои собственные регламентные задания.
б. "СОГ_РазослатьКонтрагентамПечатнуюФормуПоСчету.epf" - пример отправки почты пользователем. Позволяет по документу "Счет покупателю" отправлять письма контрагентам с вложением печатных форм. (В примере рассмотрен вариант одной произвольной печатной формы документа, включая внешних)
в. "СОГ_ЧтенияПочтыПоЯщику_Пример.epf" - пример позволяет читать входящую почту, формировать сообщения для отправки по регламенту, работать с 7zip архивами и обрабатывать файлы EXCEL, средствами самого Excel-я.
г. "filedata_2022-09-04.7z" - файл необходим для демонстрации работоспособности обработки "СОГ_ЧтенияПочтыПоЯщику_Пример.epf". Файл архива содержит таблицу EXCEL в формате xml.
д. "СОГ_ТестоваяОтправкаСообщений.epf" - примеры вызова процедур и функций для отправки почтовых уведомлений.
1. Интерфейс расширения.

Диалог настройки расширения.
- вкладка "Настройка № 1"
"Настроить обработку для отправки сообщений (СПБ)" - Позволяет прописать список почтовых адресов, для отправок и приема почтовых сообщений.

- вкладка "Справочники и Регистры"
Содержит ссылки на справочники и другую информацию используемую в работе расширения.
Набор ссылок для быстрого доступа к элементам метаданных.

- вкладка "Внешние базы данных"
В перспективе может быть использована для настройки доступа к различным источникам информации.

- вкладка "Общие настройки"
общие настройки для расширения, в данном варианте это настройка списка адресов для получения уведомлений о ошибках.
Пример формирования сообщений о ошибках смотрите в обработке "СОГ_ТестоваяОтправкаСообщений.epf"

2. "Настроить обработку для отправки сообщений (СПБ)"
Форма настройки.

1) Общие настройки почтового сервера.
Настройки по умолчанию, для тех записей, где не указан сервер.

2) Настройка для удаления старых исходящих сообщений из базы данных.
Период хранения старых записей задается в днях. Дни рассчитываются от даты попытки отправить сообщение.

3) Флажок "Добавить подписи про отправителя" - используется только для отладки.
В конец письма дописывает строчка:
<Дата и время отправки письма> <Имя сервера 1С - (откуда было послано письмо)>.
4) Кнопки отправки и удаления сообщений в ручном режиме.

5) Кнопка
позволяет упростить воспоминание, когда-то указанного пароля. Кнопка доступна только пользователю с полными правами. (Но если вы за абсолютную безопасность и любите усложнять, удалите эту кнопку.)
6) Табличная часть.
В табличной части указывают настройки с логином и паролем, а так же с дополнительными настройками. Колонки в основном повторяют объект "ИнтернетПочтовыйПрофиль".
Колонки:
"Вкл." - Включает и выключает использование строчки настройки.
"Идентификатор настройки" - Это строка, содержащая 36 символов. Не обязательна к заполнению. Используется для группировок настроек, при отправки писем или чтения почты. Программист (Разработчик) используя этот идентификатор, может конкретно указать, какую настройку будет использовать обработка для отправки писем (или чтения).
"Только по идентификатору" - Ограничение использование строчки настройки. Для обработки сообщает, что данную запись можно использовать только по конкретному идентификатору. Если флажок не указан, то такая настройка может быть использована, как резервная при отправки сообщений.
7) "e-mail Отправителя" - Содержит почтовый адрес, от имени кого будет осуществляться отправка сообщения и получения ответов. Поля имеют второстепенный приоритет. Первичный приоритет указывается программистом, при формировании записи для отправки писем, т.е. если программист не укажет соответствующий параметр при формировании сообщения, то обработка использует поля "e-mail Отправителя", в качестве основного.
8) "Вкл SMTP", "Вкл POP3", "Вкл IMAP" - Соответственно указывают на то, как использовать данную строчку настройки, либо для отправки писем, либо для получения почты, либо отправлять и получать.
Если указать "Вкл POP3" и "Вкл IMAP" приоритет будет отдан для настройки "POP3". Следовательно "IMAP" уже не будет использован.
9) Остальные колонки взяты из объекта "ИнтернетПочтовыйПрофиль" и описание вы сможете прочитать в синтаксис-помощнике.
В обработке объект "ИнтернетПочтовыйПрофиль" вызывается в функции "ПолучитьПочтовыйПрофиль".
ИнтернетПочтовыйПрофиль (InternetMailProfile)
Свойства:
POP3ПередSMTP (POP3BeforeSMTP)АдресСервераIMAP (IMAPServerAddress)
АдресСервераPOP3 (POP3ServerAddress)
АдресСервераSMTP (SMTPServerAddress)
АутентификацияПоТокену (TokenAuthentication)
ИспользоватьSSLIMAP (IMAPUseSSL)
ИспользоватьSSLPOP3 (POP3UseSSL)
ИспользоватьSSLSMTP (SMTPUseSSL)
Пароль (Password)
ПарольIMAP (IMAPPassword)
ПарольSMTP (SMTPPassword)
Пользователь (User)
ПользовательIMAP (IMAPUser)
ПользовательSMTP (SMTPUser)
ПортIMAP (IMAPPort)
ПортPOP3 (POP3Port)
ПортSMTP (SMTPPort)
Таймаут (Timeout)
ТокенДоступа (AccessToken)
ТолькоЗащищеннаяАутентификацияIMAP (IMAPSecureAuthenticationOnly)
ТолькоЗащищеннаяАутентификацияPOP3 (POP3SecureAuthenticationOnly)
ТолькоЗащищеннаяАутентификацияSMTP (SMTPSecureAuthenticationOnly)
Конструкторы:
По умолчаниюОписание:
Набор свойств для соединения с сервером.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Сериализуется.
Пример:
| Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераPOP3 = POP3Сервер; Профиль.АдресСервераSMTP = SMTPСервер; Если ВремяОжиданияСервера > 0 Тогда Профиль.Таймаут = ВремяОжиданияСервера; КонецЕсли; Профиль.Пароль = Пароль; Профиль.Пользователь = Логин; Профиль.ПортPOP3 = ПортPOP3; Профиль.ПортSMTP = ПортSMTP; Если SMTPАутентификация Тогда Профиль.ПарольSMTP = ПарольSMTP; Профиль.ПользовательSMTP = ЛогинSMTP; КонецЕсли; ИнтернетПочта = Новый ИнтернетПочта; Попытка ИнтернетПочта.Подключиться(Профиль); Исключение Сообщить(ОписаниеОшибки()); Предупреждение("Произошли ошибки при проверке настроек учетной записи. |Описание ошибки приведено в окне сообщения."); Возврат; КонецПопытки; |
См. также:
ИнтернетПочтовыйПрофиль, свойство АдресСервераSMTPИнтернетПочтовыйПрофиль, свойство АдресСервераPOP3
ИнтернетПочтовыйПрофиль, свойство ПортSMTP
ИнтернетПочтовыйПрофиль, свойство ПортPOP3
ИнтернетПочтовыйПрофиль, свойство Пароль
ИнтернетПочта, метод Подключиться
Использование в версии:
Доступен, начиная с версии 8.0.
Для информации:
При отправке сообщений через регламент, могут возникать ошибки. Это может быть ошибка сервера, почтовый сервер может быть недоступен. Или Учетная запись может быть заблокирована, от имени которого отправляются уведомления.
На подобные случай был предусмотрен алгоритм - "Устаревание сообщения".
Алгоритм:
При возникновении ошибок при отправки сообщения, через 100 попыток (с ошибками) и 60 дней, сообщение отмечается, как неактивное и более не будет обрабатываться для отправки.
При этом при каждой ошибке, сообщение будет обработано через час, с момента попытки отправить сообщение.
(Администратор всегда может снять флаг "Не активное" и обнулить счетчики ошибок)
3. "Общие настройки формы (СБП)"
Это регистр сведений, значения которого задаются разработчиком, какой либо обработки. Хранит параметры используемые различными обработками.
Создавать записи в списке не предусмотрено, даже копированием, т.к. значение хранится в Хранилище значений. (нет смысла копировать настройку, которая предназначена для какой-то обработки)
Единственное, для чего он нужен список, это удалить настройку из базы, либо посмотреть, а кто и когда менял ту или иную настройку.
В диалоге "Общие настройки расширения (СПБ)" есть кнопки для копирования и загрузки содержимого регистра "общие настройки формы" (Экспорт/Импорт настроек форм)
Кнопка "Экспорт/Импорт настроек форм"

4. "Почтовое сообщение (СПБ)"
Регистр сведений, записи которые должны быть обработаны регламентным заданием, либо уже отправлены.

Небольшое описание полей:
"ID" - УИД в виде строки, всегда случайный.
"Дата создания" - Дата создания записи в регистре.
"Дата отправки" - Служебное поле, задающая тайминг отправки сообщения. Если не заполнено, то сообщение отправится сразу.
"Не активное" - Флажок указывающий на то, что сообщение было отправлено (либо обработано, и когда-то была попытка отправить сообщение)
"Ошибка" - Флажок указывающий на то, что при отправки была ошибка, и если при этом есть флажок "Не активное", то сообщение не было отправлено и попросту исчерпало все попытки. (по умолчанию задано 100 попыток)
Есть второй контроль, "Устаревание сообщения" фиксируется в момент возникновения ошибки и достижении 60-ти дней с момента "даты создания" до попытки по полю "Дата попытки". "Устаревшее сообщение" более не обрабатывается и помечается, как "Не активное".
"Код ошибки" - содержит последний код ошибки.
"Текст ошибки" - содержит текст последней ошибки.
"Количество попыток" - Количество попыток отправки сообщения. В обработки выставлен лимит попыток, он равен 100.
"Дата попытки" - содержит дату отправки сообщения. При ошибке, содержит дату попытки.
"Идентификатор отправителя" - В настройках обработки для отправки сообщений, это поле так же имеет название "Идентификатор настройки". Идентифицирует настройку отправителя.
"Только этот отправитель" - Флажок, указывает на то, что данное сообщение может быть обработано настройкой с определенным идентификатором. И более ни каким. Если настройка с идентификатором не будет создана, то сообщение отметится, как неактивное и более не будет обрабатываться для отправки. (Но администратор всегда может снять флаг "Не активное" и обнулить счетчик ошибок "Количество попыток", и повторить отправку сообщения)
Карточка сообщения.

Вкладки карточки сообщения доступны только для просмотра.
Вкладка "Письмо".
На вкладке можно посмотреть текст темы и текст письма.
Реквизиты в группе "Идентификатор FTP записи" - это служебные поля, и имеет узконаправленный смысл. Можно их не рассматривать и при желании даже удалить (скрыть).

Вкладка "Получателя".
Содержит список получателей сообщения.

Вкладка "Вложение"
Содержит перечень вложений в сообщение. Есть возможность открыть вложение или сохранить на диск. Менять список нельзя.

Вкладка "Отправители почты"
Содержит поля "Идентификатор отправителя" и флажок "Только этот отправитель"
Для информации выведен список отправителей, сформированный из настроек обработки "Отправка почтовых уведомлений по регламенту". Список заполняется полностью, без отбора настроек сообщения. (не пугайтесь)
У расширения отсутствует возможность создавать регламентные задания.
На базе БСП у обработок есть возможность выполнять команду "ВыполнитьКоманду", у которой можно задать периодичность запуска.
Установка обработки:
1. Добавляете обработку в раздел "Дополнительные отчеты и обработки", кнопкой
.
2. Выбрав обработку, нажимаете кнопку
(записать).
3. Настраиваете расписание в строке "(регламентное задание)"

4. Настройка штатная. Настройка: каждый день; каждые 600 секунд

5. По окончании настройки, нажимаете на кнопку
и на кнопку
.
В итоге получится вот так:
Для открытии формы обработки как внешнюю, надо выбрать размещение обработки.
Обычно стоит использовать раздел "Администрирование".
Форма обработки:

Как можно видеть, обработка содержит одну кнопку, по нажатию которой выполняется:
-
Отправка сообщений, которые записаны в регистр сведений "Почтовое сообщение (СПБ)" (без флага "Не активное").
-
Удаление старых сообщений, при условии, что в настройках включено удаление устаревших сообщений.
Пример отправки почты пользователем. Позволяет по документу "Счет покупателю" отправлять письма контрагентам с вложением печатных форм. (В примере рассмотрен вариант одной произвольной печатной формы документа, включая внешних)
Для информации:
В обработке есть пункт "Разослать контрагентам печатную форму по Счету (СПБ) (регламентное задание)", он добавлен, в качестве шаблона, обработчик автоматической рассылки не написан. Если вам нужна полная автоматизация, то вам придется дописывать самостоятельно.
К сожалению не любая печатная форма документа доступна из обработки.
Форма обработки.

Описание:
1) Указать период, для выбора документов по кнопке
.
2) Выбрать печатную форму из списка. Список заполняется при открытии обработки.

детально список можно посмотреть на вкладке "Печатные формы"

3) Указать e-mail отправителя. Не путать с логином на SMTP сервере, это могут быть разные учетные записи.
4) Флажок "Группировать получателей" - при отправке будет сформировано одно общее письмо, на всех получателей по счету.
Если флажок не указан, то будет сформировано столько писем, сколько указано получателей в карточке контрагента.

5) Если необходимо, то выбрать вариант отбора.

6) Если есть контрагенты, кто не получает уведомление, то Заполнить вкладку "Исключения". Возможно указать группу.
7) Заполнить
8) Выбрать нужных контрагентов и нажать кнопку 
Пример позволяет читать входящую почту, формировать сообщения для отправки по регламенту, работать с 7zip архивами и обрабатывать файлы EXCEL, средствами самого Excel-я.
Внимание! Нужно сформировать тестовое письмо для обработки.
Так же на сервере 1С должен быть установлен EXCEL.
У каждого свой почтовый сервер, следующее название настройки будем считать обобщенной формой: "bot1c@mail.ru"
1. Написать на адрес "bot1c@mail.ru" письмо с темой "Тестовый пример для обработки"
Прикрепить к файл "filedata_2022-09-04.7z" из архива "Расширение отправки и получения почтовых сообщений.7z"
2. Архив "filedata_2022-09-04.7z" содержит файл "filedata_2022-09-04.xml". Обработка настроена для обработки именно такие вложения.
3. Файл "filedata_2022-09-04.xml" редактируется в EXCEL. И содержит простую таблицу.

Вкладка "Входящая почта" - позволяет просмотреть входящие сообщения e-mail

Вкладка "Настройка" - просто настройка обработки, состоит из трех вкладок.
Настройка "Основная" - настраивается приложение для обработки вложенного архива. Устанавливается условие отбора входящей почты для обработки.

Настройка "Пересылка почты" - Указывается почтовый адрес имя которого будет подставлена в качестве отправителя почтового сообщения. (По задумке, обработка должна полученное письмо обработать, и переслать ответ на другой адрес)
Указывают списки получателей обработанного сообщения.
По окончании настройки нужно нажать кнопку 

Настройка "Ошибки" - Указывается настройка для отправки сообщения об ошибках программисту. Так же указывается e-mail программиста.

Вкладка "Настройка истории чтении писем" - На вкладке список обработанных ранее писем.
Обязательно надо заполнить:
-
поле "Последняя обработанная дата" - Указать начальную дату, к примеру начало года 01.01.2022.
-
поле "Количество дней хранения записей": 365 дней. (365 - для надежности)
По окончании настройки вкладки нажать кнопку
.

Вкладка "Настройка хранения ошибок" - На вкладке список ошибок, которые когда либо возникали при работе обработки.
Указать в поле "Количество дней хранения записей" 30 дней. (хотя тут по желанию, но без фанатизма, список ошибок хранится в хранилище значений)

Небольшой список команд, по пунктам: (детально смотрите в картинки - "Форма обработки...")
1. поле "Командная строка внешнего архиватора" - указать командную строку к вашему архиватору 7Zip х64: C:\Program Files\7-Zip\7z.exe e "#1" -p"#2" -o"#3"
Путь для архиватора х32 будет немного другим.
2. поле "Тип файла вложения" - Указать имя расширения архива: 7z
3. Список "Темы писем" - Указать имя тестового письма: Тестовый пример для обработки
Остальные настройки смотрите в многочисленных картинках и делайте, как указано там.
Диалог формы обработки, на картинке ниже. Для некоторых тестов, заполнять адрес получателя можно любым из способов, хоть в строке, хоть в табличной части.
Но основной адрес получателя должен быть указан.
При заполнении табличной части, обязательно так же указать галочки "e-mail"

Формирует письмо, которое содержит картинку с вложением этой же картинки.
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Процедура ОтправитьСообщение_1(Команда)
Обязательно к заполнению поле "АдресПолучателяСообщения". Пример заполнения: Adress@mail.ru
&НаКлиенте
Процедура ОтправитьСообщение_1(Команда)
Файл_АдресВХ = Неопределено;
Файл_ИмяФайла = Неопределено;
Если Не ПустаяСтрока(ПутьКартинки) Тогда
Файл = Новый Файл(ПутьКартинки);
Если Файл.Существует() Тогда
ДД = Новый ДвоичныеДанные(ПутьКартинки);
Файл_АдресВХ = ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор);
Файл_ИмяФайла = Файл.Имя;
КонецЕсли;
КонецЕсли;
ОтправитьСообщениеСервер_1(АдресПолучателяСообщения, Файл_АдресВХ, Файл_ИмяФайла);
КонецПроцедуры
Процедура ОтправитьСообщениеСервер_1(АдресПолучателяСообщения, Файл_АдресВХ, Файл_ИмяФайла)
Подготовка данных структуры для записи в регистр сведений "СОГ_ПочтовоеСообщение"
Формируется тело письма, формируется массив вложений.
//Отправка сообщения через регламент отправки сообщений с вложением файла (запись в регистр сведений "СОГ_ПочтовоеСообщение")
&НаСервереБезКонтекста
Процедура ОтправитьСообщениеСервер_1(АдресПолучателяСообщения, Файл_АдресВХ, Файл_ИмяФайла)
ЛОГ_ОбщийМодуль = ОбщегоНазначения.ОбщийМодуль("СОГ_ЛогОшибок"); //Общий модуль расширения "СПАМ БОТ"
ЛОГКС_ОбщийМодуль = ОбщегоНазначения.ОбщийМодуль("СОГ_ЛогОшибокКлиентСервер"); //Общий модуль расширения "СПАМ БОТ"
ТаблицаЛогов = ЛОГ_ОбщийМодуль.ПолучитьПустуюТаблицуЛогов(); //Таблица значения для записи лога сообщений и ошибок
Отказ = Ложь;
//Файл_АдресВХ
ДД = Неопределено;
Если ЭтоАдресВременногоХранилища(Файл_АдресВХ) Тогда
ДД = ПолучитьИзВременногоХранилища(Файл_АдресВХ);
Если ПустаяСтрока(Файл_ИмяФайла) Тогда
Файл_ИмяФайла = "ФайлВложения_Картинки.png";
КонецЕсли;
КонецЕсли;
ПочтовыйАдресОтправителя = "";
ПочтовыйАдресДляПолученияОтветов = "";
ГруппироватьПолучателей = Истина; //Все, будут видеть всех...
cid_ID_0 = Неопределено;
Вложение = Неопределено;
МенОбрОПС = Обработки["СОГ_ОтправкаПочтовыхСообщений"];
// Добавить Картинку во вложения, сперва добавляем как скрытую картинку (получатель её не увидит во вложении), но видимую в теле письма, а второе вложение будет видно получателю.
Если ДД <> Неопределено Тогда
cid_ID_0 = СокрЛП(Новый УникальныйИдентификатор());
стрПочтовогоВложения = МенОбрОПС.ПолучитьСтруктуруПочтовогоВложения(); //Данные,Идентификатор,Имя,ИмяФайла,Кодировка,СпособКодирования,ТипСодержимого - см. ИнтернетПочтовоеВложение (InternetMailAttachment)
стрПочтовогоВложения.ИмяФайла = Файл_ИмяФайла;
стрПочтовогоВложения.Идентификатор = cid_ID_0;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, стрПочтовогоВложения, Вложение, Ложь);
стрПочтовогоВложения = МенОбрОПС.ПолучитьСтруктуруПочтовогоВложения(); //Данные,Идентификатор,Имя,ИмяФайла,Кодировка,СпособКодирования,ТипСодержимого - см. ИнтернетПочтовоеВложение (InternetMailAttachment)
стрПочтовогоВложения.ИмяФайла = Файл_ИмяФайла;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, стрПочтовогоВложения, Вложение, Ложь);
КонецЕсли;
//Подготовка тела письма...
СсылкаНаСайт = "<a fr-original-style="""" href=""https://ya.ru/"" rel=""noopener noreferrer"" style=""user-select: auto;"" target=""_blank"">"+XMLСтрока("Яндекс")+"</a>";
ТекстСообщения_Файл = ЛОГ_ОбщийМодуль.ЗаменитьСпецСимволы001(Файл_ИмяФайла);
ТекстСообщения_текст1 = ЛОГ_ОбщийМодуль.ЗаменитьСпецСимволы001("<это скобки и другие символы>: [скобки] {Скобки} Символы: !@#$%^&*()_+<>.'"":;\|/?,!№*()/*-+");
ПолучателиСообщений = АдресПолучателяСообщения;
Письмо_Тема = "Тестовое письмо № 1";
Письмо_Тело = "";
Письмо_Тело = "Здравствуйте, я БОТ.<br/>
|Это тестовое сообщение от "+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy")+".<br/>
| «"+ТекстСообщения_Файл+"» картинка создана по нажатию клавиш ’Print Screen’.<br/>
|<br/>"+СсылкаНаСайт+"<br/>
|<br/>
|"+ТекстСообщения_текст1+"
|<br/>
|<br/>
|";
Если cid_ID_0 <> Неопределено Тогда
Письмо_Тело = Письмо_Тело + "
|<br/>
|Картинка '"+ТекстСообщения_Файл+"'<br/>
|<br/>
|<img height=""592"" src=""cid:"+cid_ID_0+""" style=""border:none;"" width=""1140""/>";
КонецЕсли;
стрПараметраОтправки = ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = Письмо_Тема;
стрПараметраОтправки.МассивТекста = Письмо_Тело;
стрПараметраОтправки.ПолучателиСообщений = СтрРазделить(ПолучателиСообщений,";",Ложь);
стрПараметраОтправки.Копии = Неопределено;
стрПараметраОтправки.СлепыеКопии = Неопределено;
стрПараметраОтправки.ИдентификаторОтправителя = "";
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
стрПараметраОтправки.EmailОтправителя = ПочтовыйАдресОтправителя;
стрПараметраОтправки.EmailОтправителяОтвета = ПочтовыйАдресДляПолученияОтветов;
//
стрПараметраОтправки.ГруппироватьПолучателей = ГруппироватьПолучателей;
//
стрПараметраОтправки.Вложение = Вложение;
ОтправитьТестовоеСообщениеНаСервере(стрПараметраОтправки, ТаблицаЛогов, Отказ);
//Сообщим о ошибках, если таковые встретились...
Если ТаблицаЛогов.Количество() > 0 Тогда
Для Каждого СтрокаОшибки Из ТаблицаЛогов Цикл
ЛОГКС_ОбщийМодуль.СообщитьОбОшибкеПользователю(СтрокаОшибки, "", Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСтруктуруДляОтправкиПисем(Команда)
Структура параметров для подготовки письма к отправки. Только для примера.
&НаСервереБезКонтекста
Функция ПолучитьСтруктуруДляОтправкиПисем()
ПараметрыСтруктуры = "ТемаПисьма,"+ //Тема письма
"МассивТекста,"+ //Тело письма - Текст или Массив из текста (текст в HTML или обычным - зависит от настройки отправки)
"ПолучателиСообщений,"+ //Получатели уведомлений - передавать массив адресов или строку одного адреса
"ИдентификаторОтправителя,"+ //Идентификатор отправителя - у механизма СПАМ БОТ есть перечень учёток для отправки сообщений. (Есть возможность выбрать, кем отправлять)
"ТолькоЭтотОтправитель,"+ //Только этот отправитель - призна того, что сообщение будет отправлено только от имени той учетной записи СПАМ БОТа, которая имеет соответствующее значение "ИдентификаторОтправителя"
"EmailОтправителя,"+ //mail отправителя - есть возможность подменить адрес отправителя на тот, какой будет указан в данном поле. Всё зависит от настроек учетной записи СПАМ БОТа.
"EmailОтправителяОтвета,"+ //mail получаетеля ответа, на ответное сообщение от получателя сообщения. Если не указано, то у получателя будет указан адрес из поля "EmailОтправителя"
"УведомитьОДоставке,"+ //Уведомление о доставке, имеет смысл, если указан адрес уведомления о доставки (Булево)
"УведомитьОПрочтении,"+ //Уведомление о прочтении, имеет смысл, если указан адрес уведомления о доставки (Булево)
"АдресаУведомленияОДоставке,"+ //Адрес уведомления о доставке - mail получателя уведомления (передать массив)
"АдресаУведомленияОПрочтении,"+ //Адрес уведомления о прочтении - mail получателя уведомления (передать массив)
"Копии,"+ //Массив mail адресов для копий писем
"СлепыеКопии,"+ //Массив mail адресов для скрытых копий писем (не видимы для получателей)
"ГруппироватьПолучателей,"+ //Признак того, что будет сформировано одно писмо, где указаны все получатели письма. (Если ЛОЖЬ, то для каждого получателя формируется индивидуальное письмо)
"Вложение"; //Массив вложений, имеет специфическую структуру.
Возврат Новый Структура(ПараметрыСтруктуры);
КонецФункции
Процедура ОтправитьТестовоеСообщениеНаСервере(стрПараметраОтправки, ТаблицаЛогов, Отказ)
Заполнение структуры данных для записи в регистр сведений "СОГ_ПочтовоеСообщение"
&НаСервереБезКонтекста
Процедура ОтправитьТестовоеСообщениеНаСервере(стрПараметраОтправки, ТаблицаЛогов, Отказ)
ТемаПисьма = стрПараметраОтправки.ТемаПисьма;
МассивТекста = стрПараметраОтправки.МассивТекста;
ПолучателиСообщений = стрПараметраОтправки.ПолучателиСообщений;
ИдентификаторОтправителя = стрПараметраОтправки.ИдентификаторОтправителя;
ТолькоЭтотОтправитель = стрПараметраОтправки.ТолькоЭтотОтправитель;
EmailОтправителя = стрПараметраОтправки.EmailОтправителя;
EmailОтправителяОтвета = стрПараметраОтправки.EmailОтправителяОтвета;
//
//"УведомитьОДоставке,УведомитьОПрочтении, АдресаУведомленияОДоставке,АдресаУведомленияОПрочтении,"+
УведомитьОДоставке = стрПараметраОтправки.УведомитьОДоставке;
УведомитьОПрочтении = стрПараметраОтправки.УведомитьОПрочтении;
АдресаУведомленияОДоставке = стрПараметраОтправки.АдресаУведомленияОДоставке;
АдресаУведомленияОПрочтении = стрПараметраОтправки.АдресаУведомленияОПрочтении;
//"Важность, Копии,СлепыеКопии";
Копии = стрПараметраОтправки.Копии;
СлепыеКопии = стрПараметраОтправки.СлепыеКопии;
//
ГруппироватьПолучателей = стрПараметраОтправки.ГруппироватьПолучателей;
//Вложение
Вложение = стрПараметраОтправки.Вложение;
Если ТолькоЭтотОтправитель = Неопределено Тогда
ТолькоЭтотОтправитель = Истина;
КонецЕсли;
Если ИдентификаторОтправителя <> Неопределено и ПустаяСтрока(ИдентификаторОтправителя) Тогда
ИдентификаторОтправителя = Неопределено;
ТолькоЭтотОтправитель = Неопределено;
КонецЕсли;
//Тестовая отправка сообщения...
Попытка
Если ТипЗнч(МассивТекста) = Тип("Массив") Тогда
ТекстПисьма = СтрСоединить(МассивТекста,Символы.ПС);
Иначе
ТекстПисьма = МассивТекста;
КонецЕсли;
//Подготовим Структуру письма...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"]; //Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать(); Можно из обработки, можно через менеджер...
//Тело письма...
СтрСообщения = ОбработкаСообщений.ПолучитьСтруктуруСообщения();
СтрСообщения.Тема = ТемаПисьма;
СтрСообщения.Текст = ТекстПисьма;
СтрСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
СтрСообщения.Организация = "Компания";
Если EmailОтправителя <> Неопределено Тогда
СтрСообщения.EmailОтправителя = EmailОтправителя;
КонецЕсли;
Если EmailОтправителяОтвета <> Неопределено Тогда
СтрСообщения.EmailОтправителяОтвета = EmailОтправителяОтвета;
КонецЕсли;
//
Если УведомитьОДоставке = Истина Тогда
СтрСообщения.УведомитьОДоставке = Истина;
КонецЕсли;
Если УведомитьОПрочтении = Истина Тогда
СтрСообщения.УведомитьОПрочтении = Истина;
КонецЕсли;
СтрСообщения.АдресаУведомленияОДоставке = АдресаУведомленияОДоставке;
СтрСообщения.АдресаУведомленияОПрочтении = АдресаУведомленияОПрочтении;
//
СтрСообщения.Копии = Копии;
СтрСообщения.СлепыеКопии = СлепыеКопии;
//
СтрСообщения.ГруппироватьПолучателей = ГруппироватьПолучателей;
//Сообщение, Вложение, Получатели, ID,ДатаПолучения
СтрПисьмо = ОбработкаСообщений.ПолучитьСтруктуруЗаписиСообщения();
СтрПисьмо.ID = "";
СтрПисьмо.ДатаПолучения = Неопределено;
СтрПисьмо.Сообщение = СтрСообщения;
СтрПисьмо.Вложение = Вложение;
СтрПисьмо.Получатели = ОбработкаСообщений.ПолучитьМассивПолучателейСообщений(ПолучателиСообщений);
//Добавим запись для отправки сообщения...
пДатаОтправки = Дата(1,1,1);
пТемаПисьма = СокрЛП(СтрПисьмо.Сообщение.Тема);
ОбработкаСообщений.ДобавитьНовуюЗаписьДляОтправкиСообщений(СтрПисьмо, пТемаПисьма, пДатаОтправки, ИдентификаторОтправителя, ТолькоЭтотОтправитель);
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
СОГ_ЛогОшибок.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ИнфОбОшибке, "", -11, Истина, Отказ);
КонецПопытки;
КонецПроцедуры

Формирует письмо, которое содержит картинку с вложением этой же картинки. Аналогично тесту № 1.
Но при этом сообщение отправляется сразу, под пользователем. Без участия регламента по отправки сообщений.
Процедура ОтправитьСообщение_2(Команда)
Обязательно к заполнению поле "АдресПолучателяСообщения". Пример заполнения: Adress@mail.ru
&НаКлиенте
Процедура ОтправитьСообщение_2(Команда)
Файл_АдресВХ = Неопределено;
Файл_ИмяФайла = Неопределено;
Если Не ПустаяСтрока(ПутьКартинки) Тогда
Файл = Новый Файл(ПутьКартинки);
Если Файл.Существует() Тогда
ДД = Новый ДвоичныеДанные(ПутьКартинки);
Файл_АдресВХ = ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор);
Файл_ИмяФайла = Файл.Имя;
КонецЕсли;
КонецЕсли;
ОтправитьСообщениеСервер_2(АдресПолучателяСообщения, Файл_АдресВХ, Файл_ИмяФайла);
КонецПроцедуры
Процедура ОтправитьСообщениеСервер_2(АдресПолучателяСообщения, Файл_АдресВХ, Файл_ИмяФайла)
Подготовка данных структуры для отправки сообщения получателю.
Формируется тело письма, формируется массив вложений.
//Отправка сообщения пользователем с вложением файла (запись в регистр сведений "СОГ_ПочтовоеСообщение")
&НаСервереБезКонтекста
Процедура ОтправитьСообщениеСервер_2(АдресПолучателяСообщения, Файл_АдресВХ, Файл_ИмяФайла)
ЛОГ_ОбщийМодуль = ОбщегоНазначения.ОбщийМодуль("СОГ_ЛогОшибок"); //Общий модуль расширения "СПАМ БОТ"
ЛОГКС_ОбщийМодуль = ОбщегоНазначения.ОбщийМодуль("СОГ_ЛогОшибокКлиентСервер"); //Общий модуль расширения "СПАМ БОТ"
ТаблицаЛогов = ЛОГ_ОбщийМодуль.ПолучитьПустуюТаблицуЛогов(); //Таблица значения для записи лога сообщений и ошибок
Отказ = Ложь;
//Файл_АдресВХ
ДД = Неопределено;
Если ЭтоАдресВременногоХранилища(Файл_АдресВХ) Тогда
ДД = ПолучитьИзВременногоХранилища(Файл_АдресВХ);
Если ПустаяСтрока(Файл_ИмяФайла) Тогда
Файл_ИмяФайла = "ФайлВложения_Картинки.png";
КонецЕсли;
КонецЕсли;
ПочтовыйАдресОтправителя = "";
ПочтовыйАдресДляПолученияОтветов = "";
ГруппироватьПолучателей = Истина; //Все, будут видеть всех...
cid_ID_0 = Неопределено;
Вложение = Неопределено;
МенОбрОПС = Обработки["СОГ_ОтправкаПочтовыхСообщений"];
// Добавить Картинку во вложения, сперва добавляем как скрытую картинку (получатель её не увидит во вложении), но видимую в теле письма, а второе вложение будет видно получателю.
Если ДД <> Неопределено Тогда
cid_ID_0 = СокрЛП(Новый УникальныйИдентификатор());
стрПочтовогоВложения = МенОбрОПС.ПолучитьСтруктуруПочтовогоВложения(); //Данные,Идентификатор,Имя,ИмяФайла,Кодировка,СпособКодирования,ТипСодержимого - см. ИнтернетПочтовоеВложение (InternetMailAttachment)
стрПочтовогоВложения.ИмяФайла = Файл_ИмяФайла;
стрПочтовогоВложения.Идентификатор = cid_ID_0;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, стрПочтовогоВложения, Вложение, Ложь);
стрПочтовогоВложения = МенОбрОПС.ПолучитьСтруктуруПочтовогоВложения(); //Данные,Идентификатор,Имя,ИмяФайла,Кодировка,СпособКодирования,ТипСодержимого - см. ИнтернетПочтовоеВложение (InternetMailAttachment)
стрПочтовогоВложения.ИмяФайла = Файл_ИмяФайла;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, стрПочтовогоВложения, Вложение, Ложь);
КонецЕсли;
//Подготовка тела письма...
СсылкаНаСайт = "<a fr-original-style="""" href=""https://ya.ru/"" rel=""noopener noreferrer"" style=""user-select: auto;"" target=""_blank"">"+XMLСтрока("Яндекс")+"</a>";
ТекстСообщения_Файл = ЛОГ_ОбщийМодуль.ЗаменитьСпецСимволы001(Файл_ИмяФайла);
ТекстСообщения_текст1 = ЛОГ_ОбщийМодуль.ЗаменитьСпецСимволы001("<это скобки и другие символы>: [скобки] {Скобки} Символы: !@#$%^&*()_+<>.'"":;\|/?,!№*()/*-+");
ПолучателиСообщений = АдресПолучателяСообщения;
Письмо_Тема = "Тестовое письмо № 2";
Письмо_Тело = "";
Письмо_Тело = "Здравствуйте, я БОТ.<br/>
|Это тестовое сообщение от "+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy")+".<br/>
| «"+ТекстСообщения_Файл+"» картинка создана по нажатию клавиш ’Print Screen’.<br/>
|<br/>"+СсылкаНаСайт+"<br/>
|<br/>
|"+ТекстСообщения_текст1+"
|<br/>
|<br/>
|";
Если cid_ID_0 <> Неопределено Тогда
Письмо_Тело = Письмо_Тело + "
|<br/>
|Картинка '"+ТекстСообщения_Файл+"'<br/>
|<br/>
|<img height=""592"" src=""cid:"+cid_ID_0+""" style=""border:none;"" width=""1140""/>";
КонецЕсли;
стрПараметраОтправки = ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = Письмо_Тема;
стрПараметраОтправки.МассивТекста = Письмо_Тело;
стрПараметраОтправки.ПолучателиСообщений = СтрРазделить(ПолучателиСообщений,";",Ложь);
стрПараметраОтправки.Копии = Неопределено;
стрПараметраОтправки.СлепыеКопии = Неопределено;
стрПараметраОтправки.ИдентификаторОтправителя = "";
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
стрПараметраОтправки.EmailОтправителя = ПочтовыйАдресОтправителя;
стрПараметраОтправки.EmailОтправителяОтвета = ПочтовыйАдресДляПолученияОтветов;
//
стрПараметраОтправки.ГруппироватьПолучателей = ГруппироватьПолучателей;
//
стрПараметраОтправки.Вложение = Вложение;
ОтправитьТестовоеСообщениеПользователемНаСервере(стрПараметраОтправки, ТаблицаЛогов, Отказ);
//Сообщим о ошибках, если таковые встретились...
Если ТаблицаЛогов.Количество() > 0 Тогда
Для Каждого СтрокаОшибки Из ТаблицаЛогов Цикл
ЛОГКС_ОбщийМодуль.СообщитьОбОшибкеПользователю(СтрокаОшибки, "", Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСтруктуруДляОтправкиПисем(Команда)
Структура параметров для подготовки письма к отправки. Только для примера.
&НаСервереБезКонтекста
Функция ПолучитьСтруктуруДляОтправкиПисем()
ПараметрыСтруктуры = "ТемаПисьма,"+ //Тема письма
"МассивТекста,"+ //Тело письма - Текст или Массив из текста (текст в HTML или обычным - зависит от настройки отправки)
"ПолучателиСообщений,"+ //Получатели уведомлений - передавать массив адресов или строку одного адреса
"ИдентификаторОтправителя,"+ //Идентификатор отправителя - у механизма СПАМ БОТ есть перечень учёток для отправки сообщений. (Есть возможность выбрать, кем отправлять)
"ТолькоЭтотОтправитель,"+ //Только этот отправитель - призна того, что сообщение будет отправлено только от имени той учетной записи СПАМ БОТа, которая имеет соответствующее значение "ИдентификаторОтправителя"
"EmailОтправителя,"+ //mail отправителя - есть возможность подменить адрес отправителя на тот, какой будет указан в данном поле. Всё зависит от настроек учетной записи СПАМ БОТа.
"EmailОтправителяОтвета,"+ //mail получаетеля ответа, на ответное сообщение от получателя сообщения. Если не указано, то у получателя будет указан адрес из поля "EmailОтправителя"
"УведомитьОДоставке,"+ //Уведомление о доставке, имеет смысл, если указан адрес уведомления о доставки (Булево)
"УведомитьОПрочтении,"+ //Уведомление о прочтении, имеет смысл, если указан адрес уведомления о доставки (Булево)
"АдресаУведомленияОДоставке,"+ //Адрес уведомления о доставке - mail получателя уведомления (передать массив)
"АдресаУведомленияОПрочтении,"+ //Адрес уведомления о прочтении - mail получателя уведомления (передать массив)
"Копии,"+ //Массив mail адресов для копий писем
"СлепыеКопии,"+ //Массив mail адресов для скрытых копий писем (не видимы для получателей)
"ГруппироватьПолучателей,"+ //Признак того, что будет сформировано одно писмо, где указаны все получатели письма. (Если ЛОЖЬ, то для каждого получателя формируется индивидуальное письмо)
"Вложение"; //Массив вложений, имеет специфическую структуру.
Возврат Новый Структура(ПараметрыСтруктуры);
КонецФункции
Процедура ОтправитьТестовоеСообщениеПользователемНаСервере(стрПараметраОтправки, ТаблицаЛогов, Отказ)
Заполнение структуры данных нужного формата для отправки уведомлений
&НаСервереБезКонтекста
Процедура ОтправитьТестовоеСообщениеПользователемНаСервере(стрПараметраОтправки, ТаблицаЛогов, Отказ)
//Отключим всякого рода проверки безопасности от 1С... оно тут лишнее...
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
ТемаПисьма = стрПараметраОтправки.ТемаПисьма;
МассивТекста = стрПараметраОтправки.МассивТекста;
ПолучателиСообщений = стрПараметраОтправки.ПолучателиСообщений;
ИдентификаторОтправителя = стрПараметраОтправки.ИдентификаторОтправителя;
ТолькоЭтотОтправитель = стрПараметраОтправки.ТолькоЭтотОтправитель;
EmailОтправителя = стрПараметраОтправки.EmailОтправителя;
EmailОтправителяОтвета = стрПараметраОтправки.EmailОтправителяОтвета;
//
//"УведомитьОДоставке,УведомитьОПрочтении, АдресаУведомленияОДоставке,АдресаУведомленияОПрочтении,"+
УведомитьОДоставке = стрПараметраОтправки.УведомитьОДоставке;
УведомитьОПрочтении = стрПараметраОтправки.УведомитьОПрочтении;
АдресаУведомленияОДоставке = стрПараметраОтправки.АдресаУведомленияОДоставке;
АдресаУведомленияОПрочтении = стрПараметраОтправки.АдресаУведомленияОПрочтении;
//"Важность, Копии,СлепыеКопии";
Копии = стрПараметраОтправки.Копии;
СлепыеКопии = стрПараметраОтправки.СлепыеКопии;
//
ГруппироватьПолучателей = стрПараметраОтправки.ГруппироватьПолучателей;
//Вложение
Вложение = стрПараметраОтправки.Вложение;
Если ТолькоЭтотОтправитель = Неопределено Тогда
ТолькоЭтотОтправитель = Истина;
КонецЕсли;
Если ИдентификаторОтправителя <> Неопределено и ПустаяСтрока(ИдентификаторОтправителя) Тогда
ИдентификаторОтправителя = Неопределено;
ТолькоЭтотОтправитель = Неопределено;
КонецЕсли;
//Тестовая отправка сообщения...
Попытка
Если ТипЗнч(МассивТекста) = Тип("Массив") Тогда
ТекстПисьма = СтрСоединить(МассивТекста,Символы.ПС);
Иначе
ТекстПисьма = МассивТекста;
КонецЕсли;
//Подготовим Структуру письма...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать(); //Если нужно отправить сразу, то только напрямую.
//Тело письма...
СтрСообщения = ОбработкаСообщений.ПолучитьСтруктуруСообщения();
СтрСообщения.Тема = ТемаПисьма;
СтрСообщения.Текст = ТекстПисьма;
СтрСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
СтрСообщения.Организация = "Компания";
Если EmailОтправителя <> Неопределено Тогда
СтрСообщения.EmailОтправителя = EmailОтправителя;
КонецЕсли;
Если EmailОтправителяОтвета <> Неопределено Тогда
СтрСообщения.EmailОтправителяОтвета = EmailОтправителяОтвета;
КонецЕсли;
//
Если УведомитьОДоставке = Истина Тогда
СтрСообщения.УведомитьОДоставке = Истина;
КонецЕсли;
Если УведомитьОПрочтении = Истина Тогда
СтрСообщения.УведомитьОПрочтении = Истина;
КонецЕсли;
СтрСообщения.АдресаУведомленияОДоставке = АдресаУведомленияОДоставке;
СтрСообщения.АдресаУведомленияОПрочтении = АдресаУведомленияОПрочтении;
//
СтрСообщения.Копии = Копии;
СтрСообщения.СлепыеКопии = СлепыеКопии;
//
СтрСообщения.ГруппироватьПолучателей = ГруппироватьПолучателей;
//Сообщение, Вложение, Получатели, ID,ДатаПолучения
СтрПисьмо = ОбработкаСообщений.ПолучитьСтруктуруЗаписиСообщения();
СтрПисьмо.ID = "";
СтрПисьмо.ДатаПолучения = Неопределено;
СтрПисьмо.Сообщение = СтрСообщения;
СтрПисьмо.Вложение = Вложение;
СтрПисьмо.Получатели = ОбработкаСообщений.ПолучитьМассивПолучателейСообщений(ПолучателиСообщений);
СтрПисьмо.Вставить("СохранитьСообщениеВРегистре", Истина); //Признак того, что нужно добавить запись в Регистр сведений "СОГ_ПочтовоеСообщение", если не указан, то запись не будет записана.
//Отправить сообщение Пользователем из обработки...
пКодОшибки = 0;
пТекстОшибки = "";
ОбработкаСообщений.ОтправитьСообщения_Пользователем(СтрПисьмо, Отказ, пКодОшибки, пТекстОшибки);
Если Отказ = Истина Тогда
ТекстСообщения = "Не удалось отправить сообщение через e-mail. Ошибка № "+Строка(пКодОшибки)+", "+пТекстОшибки;
СОГ_ЛогОшибок.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ТекстСообщения, "", -11, Истина, Отказ);
КонецЕсли;
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
СОГ_ЛогОшибок.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ИнфОбОшибке, "", -11, Истина, Отказ);
КонецПопытки;
КонецПроцедуры

Формирует письмо отчет об ошибках выполнения кода. Письмо сразу не отправляется, а формируется запись в регистре сведений "СОГ_ПочтовоеСообщение"
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Процедура ОтправитьСообщение_3(Команда)
Поле "АдресПолучателяСообщения" необходимо заполнить, если не указан получатель в настройке расширения, для получения уведомления. Пример заполнения: Adress@mail.ru
Так же для теста, обязательно, необходимо указать галочку "Отправлять лог ошибок по e-mail". Без галочки "Отправлять лог ошибок по e-mail", перечень ошибок будет записан в журнале регистрации 1С.
Картинка настройки.

&НаКлиенте
Процедура ОтправитьСообщение_3(Команда)
Отказ = Ложь;
СгенерироватьОтправкуОшибок(АдресПолучателяСообщения, Отказ);
Если Отказ = Истина Тогда
ТекстСообщения = "Ошибки сгенерированы, выполните регламент отправки уведомлений.
|Сообщения о ошибках отправляются только по регламенту.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
Процедура СгенерироватьОтправкуОшибок(АдресПолучателяСообщения, Отказ)
Генерация ошибок для тестовой отправки. По сути это шаблон для отправки уведомлений об ошибках.
Формирование тела письма, выполняется в общем модуле "СОГ_ЛогОшибок". Структура письма предопределено модулем.
Разработчик может только указать: Заголовок, краткое описание (тело письма), приложить вложения. В качестве данных для передачи информации используется Таблица значений.
По умолчанию таблица значений должна быть определенной структуры. Но при желании можно передать любую таблицу структуры, такие примеры описаны ниже.
Лог ошибок на прямую не отправляется, выполняется запись в регистр сведений "СОГ_ПочтовоеСообщение".
//Генератор уведомлений о ошибках выполнения кода. (используется для получения информации о ошибках из различных источниках)
&НаСервереБезКонтекста
Процедура СгенерироватьОтправкуОшибок(АдресПолучателяСообщения, Отказ)
Если Отказ = Неопределено Тогда
Отказ = Ложь;
КонецЕсли;
//---------------------------------------------------
обрИмяСобытия = "Основное описание регламента";
ТаблицаЛогов = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
// Получение параметров обработки...
Попытка
ИмяСобытия = "Получение настройки обработки";
стрНастройкиОбщие = СОГ_ОбщиеНастройкиРасширенияВызовСервера.ПолучитьНастройкиОбработки_Общие(); //Для логов ошибок
ОшибкаРеквизита = (ТаблицаЛогов.Корень = Ложь); // Генератор ошибки
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
СОГ_ЛогОшибок.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ИнфОбОшибке, ИмяСобытия, -11, Ложь, Отказ);
КонецПопытки;
СОГ_ЛогОшибок.ДописатьВЛогИмяСобытия(ИмяСобытия, ТаблицаЛогов);
// Выполнения еще одного события...
Попытка
ИмяСобытия = обрИмяСобытия;
ДелениеНаНоль = 100 / 0; //Деление на ноль
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
СОГ_ЛогОшибок.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ИнфОбОшибке, ИмяСобытия, -11, Ложь, Отказ);
КонецПопытки;
СОГ_ЛогОшибок.ДописатьВЛогИмяСобытия(ИмяСобытия, ТаблицаЛогов);
//Лог ошибок...
//Отправим ошибки, если это возможно...
Общ_ОтправлятьЛогОшибокПоПочте = СОГ_ДопФункции.ПолучитьЗначениеСтруктуры("Общ_ОтправлятьЛогОшибокПоПочте",стрНастройкиОбщие,Ложь);
Если Общ_ОтправлятьЛогОшибокПоПочте <> Истина Тогда
Если ТаблицаЛогов <> Неопределено и ТаблицаЛогов.Количество() > 0 и СОГ_ЛогОшибок.ЕстьОшибкиПредупреждения(ТаблицаЛогов, Ложь) = Истина Тогда
ИмяСобытия = Строка(обрИмяСобытия);
СОГ_ЛогОшибок.ЗаписатьПереченьОшибокЖурналРегистрации(ИмяСобытия, ТаблицаЛогов);
КонецЕсли;
ИначеЕсли ТаблицаЛогов <> Неопределено и ТаблицаЛогов.Количество() > 0 и СОГ_ЛогОшибок.ЕстьОшибкиПредупреждения(ТаблицаЛогов, Ложь) = Истина Тогда
ИмяСобытия = Строка(обрИмяСобытия);
СОГ_ЛогОшибок.ЗаписатьПереченьОшибокЖурналРегистрации(ИмяСобытия, ТаблицаЛогов);
ИдентификаторОтправителя = "";
ПолучателиСообщений = СОГ_ДопФункции.ПолучитьЗначениеСтруктуры("Общ_СписокПочтовыхАдресов",стрНастройкиОбщие,Неопределено);
Если ТипЗнч(ПолучателиСообщений) = Тип("СписокЗначений") Тогда //Получаем массив...
ПолучателиСообщений = ПолучателиСообщений.ВыгрузитьЗначения();
КонецЕсли;
Если ПолучателиСообщений = Неопределено Или Не ЗначениеЗаполнено(ПолучателиСообщений) Тогда
ПолучателиСообщений = ""+АдресПолучателяСообщения; // Тут пожно прописать адрес по умолчанию, если вдруг настройки не указаны...
КонецЕсли;
//стрНастройки = ПолучитьНастройкиОбменов();
ТаблицаЛогов_Отправки = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
стрПараметраОтправки = СОГ_ЛогОшибок.ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = "Лог ошибок обработки - "+Строка(обрИмяСобытия);
стрПараметраОтправки.ОсновноеЗаголовок = "Лог ошибок и предупреждений";
стрПараметраОтправки.ОсновнаяНужнаяСтраница = "";
стрПараметраОтправки.ПолучателиСообщений = ПолучателиСообщений;
стрПараметраОтправки.ИдентификаторОтправителя = ИдентификаторОтправителя;
//стрПараметраОтправки.ГруппироватьПолучателей = Ложь; //Одним письмом, если сможет...
//
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
//стрПараметраОтправки.ЗаголовкиТаблицы = Неопределено;
пОтказ = Ложь;
СОГ_ЛогОшибок.ОтправкаНепрочитанныйЛогОшибок(ТаблицаЛогов, стрПараметраОтправки, ТаблицаЛогов_Отправки, пОтказ);
Если ТаблицаЛогов_Отправки <> Неопределено и ТаблицаЛогов_Отправки.Количество() > 0 Тогда
ИмяСобытия = Строка(обрИмяСобытия); //"Загрузка основных средств";
СОГ_ЛогОшибок.ЗаписатьПереченьОшибокЖурналРегистрации(ИмяСобытия, ТаблицаЛогов_Отправки);
КонецЕсли;
КонецЕсли;
//Комментарий к тестовой обработке, в рабочем варианте, данный код не имеет смысла
Если Общ_ОтправлятьЛогОшибокПоПочте <> Истина Тогда
ТекстСообщения = "В настройках расширения, не включена отправка сообщений о ошибках. Смотрите описание ошибки в журнале регистрации.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры

Формирует письмо отчет об ошибках выполнения кода. Письмо сразу не отправляется, а формируется запись в регистре сведений "СОГ_ПочтовоеСообщение"
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Процедура ОтправитьСообщение_4(Команда)
Поле "АдресПолучателяСообщения" необходимо заполнить, если не указан получатель в настройке расширения, для получения уведомления. Пример заполнения: Adress@mail.ru
Так же для теста, обязательно, необходимо указать галочку "Отправлять лог ошибок по e-mail". Без галочки "Отправлять лог ошибок по e-mail", перечень ошибок будет записан в журнале регистрации 1С.
Картинка настройки.

//Генератор уведомлений на стороне клиента. (отправка с клиента на сервер, по регламенту)
&НаКлиенте
Процедура ОтправитьСообщение_4(Команда)
обрИмяСобытия = "Тест ошибок на Клиенте";
ТаблицаЛогов = Новый Массив; //СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
Попытка
ИмяСобытия = "Генератор ошибки - начало";
ТекстСообщения = "Сейчас поделим на ноль, и получим ошибку.";
СОГ_ЛогОшибокКлиентСервер.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ТекстСообщения, "", 0, Ложь, Ложь);
ДелениеНаНоль = 100 / 0; //Деление на ноль
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
СОГ_ЛогОшибокКлиентСервер.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ИнфОбОшибке, ИмяСобытия, -11, Ложь, Ложь);
КонецПопытки;
СОГ_ЛогОшибокКлиентСервер.ДописатьВЛогИмяСобытия(ИмяСобытия, ТаблицаЛогов);
Попытка
ИмяСобытия = обрИмяСобытия;
ТекстСообщения = "И на последок, просто обратимся к несуществующему параметру.";
СОГ_ЛогОшибокКлиентСервер.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ТекстСообщения, "", 0, Ложь, Ложь);
НетТакогоСвойства = ТаблицаЛогов.СерединаПустоты; //У массива нет такого
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
СОГ_ЛогОшибокКлиентСервер.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ИнфОбОшибке, ИмяСобытия, -11, Ложь, Ложь);
ИмяФайлаПриемника = Неопределено;
КонецПопытки;
СОГ_ЛогОшибокКлиентСервер.ДописатьВЛогИмяСобытия(ИмяСобытия, ТаблицаЛогов);
Попытка
ОтправитьЛогОшибокПоПочтеНаКиленте(ТаблицаЛогов,Неопределено,обрИмяСобытия, АдресПолучателяСообщения, ЭтотОбъект);
Исключение
ОписОшиб = ОписаниеОшибки();
ТекстСообщения = "Ошибка при отправки уведомления об ошибках, ошибки не доставлены. Описание: "+ОписОшиб;
СОГ_ДопФункции.ЗаписатьОшибкуВЖурнал(ОписОшиб, "Тест ошибок на Клиенте", Истина);
КонецПопытки;
КонецПроцедуры
Процедура ОтправитьЛогОшибокПоПочтеНаКиленте(ТаблицаЛогов,стрНастройкиОбщие,обрИмяСобытия, АдресПолучателяСообщения=Неопределено)
Генерация ошибок для тестовой отправки. По сути это шаблон для отправки уведомлений об ошибках, но с клиента.
Формирование тела письма, выполняется в общем модуле "СОГ_ЛогОшибок". Структура письма предопределено модулем.
Разработчик может только указать: Заголовок, краткое описание (тело письма) и передать вложение в качестве списка значения, через временное хранилище значений. В качестве данных для передачи информации используется массив с определённой структуры.
&НаКлиентеНаСервереБезКонтекста
Процедура ОтправитьЛогОшибокПоПочтеНаКиленте(ТаблицаЛогов,стрНастройкиОбщие,обрИмяСобытия, АдресПолучателяСообщения=Неопределено, ЭтотОбъект_=Неопределено)
//Попробуем добавить вложения...
Вложение = Неопределено;
Если ЭтотОбъект_ <> Неопределено Тогда
Форма = ЭтотОбъект_.ЭтаФорма;
Если не ПустаяСтрока(Форма.ПутьКартинки) Тогда
Файл = Новый Файл(Форма.ПутьКартинки);
Если Файл.Существует() И Файл.ЭтоФайл() Тогда
Вложение = Новый СписокЗначений();
ДД = Новый ДвоичныеДанные(Форма.ПутьКартинки);
Вложение.Добавить(ПоместитьВоВременноеХранилище(ДД, Форма.УникальныйИдентификатор),Файл.Имя);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИдентификаторОтправителя = "";
Письмо_Тело = "Информация об компьютере: "+СОГ_ДопФункцииКлиентСервер.ПолучитьИнформациюПК();
Письмо_Тело_Доп = "
|
|(перешлите это сообщение Системному администратору, с пояснениями)
|";
стрПараметраОтправки = СОГ_ЛогОшибокВызовСервера.ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = "Лог ошибок обработки - "+Строка(обрИмяСобытия);
стрПараметраОтправки.ОсновноеЗаголовок = "Лог ошибок и предупреждений";
стрПараметраОтправки.ОсновнаяНужнаяСтраница = "";
стрПараметраОтправки.ПолучателиСообщений = АдресПолучателяСообщения;
стрПараметраОтправки.ИдентификаторОтправителя = ИдентификаторОтправителя;
//стрПараметраОтправки.ГруппироватьПолучателей = Ложь; //Одним письмом, если сможет...
стрПараметраОтправки.ТекстПоясненияПисьму_HTML = "";
стрПараметраОтправки.ТекстПоясненияПисьму = ""+Письмо_Тело+Письмо_Тело_Доп;
//
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
//
стрПараметраОтправки.Вложение = Вложение;
Отказ = Ложь;
СОГ_ЛогОшибокВызовСервера.ОтправитьЛогОшибокПоПочтеНаКлиентеПоРегламенту(ТаблицаЛогов, стрНастройкиОбщие, обрИмяСобытия, стрПараметраОтправки, Отказ);
Если Отказ = Истина Тогда
ТекстСообщения = "Лог ошибок не отправлен получателю.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры

На основе модуля "СОГ_ЛогОшибок" формирует обычное сообщение и записывает его регистре сведений "СОГ_ПочтовоеСообщение"
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Процедура ОтправитьСообщение_5(Команда)
Поле "АдресПолучателяСообщения" необходимо заполнить или указать получателя в табличном поле "ТЗ_Получателей". Пример заполнения: Adress@mail.ru
&НаКлиенте
Процедура ОтправитьСообщение_5(Команда)
Отказ = Ложь;
СгенерироватьОтправкуСообщения(АдресПолучателяСообщения, ТЗ_Получателей, Отказ);
Если Отказ <> Истина Тогда
ТекстСообщения = "Сообщения сгенерированы, выполните регламент отправки уведомлений.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
Процедура СгенерироватьОтправкуСообщения(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Отказ)
//Формирование сообщения на основе модуля "СОГ_ЛогОшибок", с несколькими табличными частями и отчетом в виде вложения
&НаСервереБезКонтекста
Процедура СгенерироватьОтправкуСообщения(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Отказ)
ТЗ_Получателей = ТЗ_Получателей_Формы.Выгрузить();
Если ТЗ_Получателей.Количество() = 0 И Не ПустаяСтрока(АдресПолучателяСообщения) Тогда
СтрокаДанных = ТЗ_Получателей.Добавить();
СтрокаДанных.Пользователь = АдресПолучателяСообщения;
СтрокаДанных.email = Истина;
КонецЕсли;
ТЗ_ПолучателиУведомлений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].ПолучитьПолучателейУведомлений(ТЗ_Получателей);
Если ТЗ_ПолучателиУведомлений = Неопределено или Не ЗначениеЗаполнено(ТЗ_ПолучателиУведомлений) Тогда
ТекстСообщения = "Не заданы получатели списка сотрудников, сообщение не сформировано";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
ТЗ_Данные1 = СгенеритьНаборДаныхДляПримера_5_1(400);
ТЗ_Данные2 = СгенеритьНаборДаныхДляПримера_5_2(10);
//push
// Пример использования уведомления от типовых конфигураций, но для них нужна доработка.
// описание доработки в комментариях.
МассивPush = ТЗ_ПолучателиУведомлений.НайтиСтроки(Новый Структура("push",Истина));
Если МассивPush <> Неопределено И ЗначениеЗаполнено(МассивPush) Тогда
Попытка
ОМ_НапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный");
Документ = Неопределено;
ТекстСообщения = "Для ВАС подготовлен отчет, посмотрите в почте.";
Для Каждого СтрокаПолучателя Из МассивPush Цикл
ПараметрыНапоминания = Новый Структура;
ПараметрыНапоминания.Вставить("Описание", ТекстСообщения);
ПараметрыНапоминания.Вставить("ВремяСобытия", ТекущаяДата());
ПараметрыНапоминания.Вставить("ИнтервалВремениНапоминания", 0);
ПараметрыНапоминания.Вставить("Источник", Документ);
ПараметрыНапоминания.Вставить("Идентификатор", "НовыйОтчет");
ПараметрыНапоминания.Вставить("Пользователь", СтрокаПолучателя.Пользователь);
//Для работы надо создать функцию "СОГ_СоздатьНапоминание" в общем модуле "НапоминанияПользователяСлужебный", которая вызывает функцию "СоздатьНапоминание(ПараметрыНапоминания)", с перечадей параметров.
// В типовой конфигурации "СоздатьНапоминание" не экспортная.
// Пример:
// Функция СОГ_СоздатьНапоминание(ПараметрыНапоминания) Экспорт
// Возврат СоздатьНапоминание(ПараметрыНапоминания);
// КонецФункции
Напоминание = ОМ_НапоминанияПользователяСлужебный.СОГ_СоздатьНапоминание(ПараметрыНапоминания); //Вызов "НапоминанияПользователяСлужебный.СоздатьНапоминание" - Это не экспортная функция, так что через расширение можно подредактировать
ОМ_НапоминанияПользователяСлужебный.ПодключитьНапоминание(Напоминание);
КонецЦикла;
Исключение
ИнфОшиб = ИнформацияОбОшибке();
ИнфОшиб_Кратко = КраткоеПредставлениеОшибки(ИнфОшиб);
ТекстСообщения = "Нет возможности создать уведомление... Описание: "+ИнфОшиб_Кратко;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецПопытки;
КонецЕсли;
//email
МассивEmail = ТЗ_ПолучателиУведомлений.НайтиСтроки(Новый Структура("email",Истина));
//Проверить... есть ли вообще адреса получатели...
ЕстьАдрес = Ложь;
Для Каждого АдресПочта Из МассивEmail Цикл
Если Не ПустаяСтрока(АдресПочта) Тогда
ЕстьАдрес = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьАдрес <> Истина Тогда
ТекстСообщения = "Не заданы получатели сообщений по e-mail, сообщение не отправлено.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
ИдентификаторОтправителя = "";
ТЗ_ПолучателиУведомлений_Копия = ТЗ_ПолучателиУведомлений.Скопировать(МассивEmail);
ПолучателиСообщений = ТЗ_ПолучателиУведомлений_Копия.ВыгрузитьКолонку("АдресПочты");
ТекстПоясненияПисьму = "Это тестовое сообщение в качестве примера возможности модуля ""СОГ_ЛогОшибок"" и обработки ""СОГ_ОтправкаПочтовыхСообщений"".";
стрПараметраОтправки = СОГ_ЛогОшибок.ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = "Пример сообщения минимум ("+Строка(ТЗ_Данные2.Количество())+") от "+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
стрПараметраОтправки.ОсновноеЗаголовок = "В примере создано записей: "+Строка(ТЗ_Данные1.Количество());
стрПараметраОтправки.ТекстПоясненияПисьму_HTML = "";
стрПараметраОтправки.ТекстПоясненияПисьму = ТекстПоясненияПисьму;
стрПараметраОтправки.ОсновнаяНужнаяСтраница = "";
стрПараметраОтправки.ПолучателиСообщений = ПолучателиСообщений;
стрПараметраОтправки.ИдентификаторОтправителя = ИдентификаторОтправителя;
стрПараметраОтправки.ГруппироватьПолучателей = Истина; //Одним письмом, если сможет...
//
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
//
стрПараметраОтправки.ЗаголовкиТаблицы = СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные2, Неопределено);
ЗаголовкиТаблицы_ТаблДок = СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные1);
МассивЗаголовка = Новый Массив;
МассивЗаголовка.Добавить(стрПараметраОтправки.ТемаПисьма);
МассивЗаголовка.Добавить(стрПараметраОтправки.ОсновноеЗаголовок);
//ПараметрыСтруктуры = "ТабличныйДокумент,СинонимМакета,ИмяМакета,";
КоллекцияПечатныхФорм = Новый Массив;
стрПечати = СОГ_ЛогОшибок.ПолучитьПустуюСтруктуруПечати();
стрПечати.ТабличныйДокумент = СОГ_ЛогОшибок.СформироватьОтчетПоРезультату(ТЗ_Данные1,МассивЗаголовка,ЗаголовкиТаблицы_ТаблДок);
стрПечати.СинонимМакета = "Генератор_Данных_5_от_"+Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH-mm-ss'");
КоллекцияПечатныхФорм.Добавить(стрПечати);
//Получить Список значений - его тоже можно передать во вложение, но мы так же выполним через "ДобавитьВложениеДляОтправки_Массив"
спсВложение = СОГ_ЛогОшибок.ПолучитьСписокЗначенийВложений(КоллекцияПечатныхФорм, ТипФайлаТабличногоДокумента.XLSX);
Вложение = Неопределено;
МенОбрОПС = Обработки["СОГ_ОтправкаПочтовыхСообщений"];
//
Если спсВложение.Количество() > 0 Тогда
Для Каждого ЗначСпс Из спсВложение Цикл
ИмяФайла = ЗначСпс.Представление;
ДД = ЗначСпс.Значение;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, ИмяФайла, Вложение, Ложь);
КонецЦикла;
КонецЕсли;
стрПараметраОтправки.Вложение = Вложение;
ТаблицаЛогов = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
пОтказ = Ложь;
СОГ_ЛогОшибок.ОтправкаНепрочитанныйЛогОшибок(ТЗ_Данные2, стрПараметраОтправки, ТаблицаЛогов, пОтказ);
Если пОтказ = Истина Тогда
Отказ = Истина;
КонецЕсли;
//Сообщим о ошибках, если таковые встретились...
Если ТаблицаЛогов.Количество() > 0 Тогда
Для Каждого СтрокаОшибки Из ТаблицаЛогов Цикл
СОГ_ЛогОшибокКлиентСервер.СообщитьОбОшибкеПользователю(СтрокаОшибки, "", Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СгенеритьНаборДаныхДляПримера_5_1(Количество)
Генератор таблицы значения для тестовой отправки.
&НаСервереБезКонтекста
Функция СгенеритьНаборДаныхДляПримера_5_1(Количество)
ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("ИмяСобытия", Новый ОписаниеТипов("Строка")); //Служебное поле, обязательное в любой таблице значений!!!
//
ТЗ_Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"), "Наименование поля");
ТЗ_Данные.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"), "Дата значения");
ТЗ_Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма сумм");
ТЗ_Данные.Колонки.Добавить("Описание", Новый ОписаниеТипов("Строка"), "Строка описания");
Для Сч = 1 По Количество Цикл
СтрокаДанных = ТЗ_Данные.Добавить();
СтрокаДанных.Наименование = "Наименование № "+Строка(Сч);
СтрокаДанных.Дата = ТекущаяДата();
Случайный = Новый ГенераторСлучайныхЧисел(Сч);
Число_ = Случайный.СлучайноеЧисло(0,Сч);
СтрокаДанных.Сумма = Сч*Число_;
СтрокаДанных.Описание = ""+СтрокаДанных.Наименование+" от "+Строка(СтрокаДанных.Дата)+" = "+Строка(СтрокаДанных.Сумма);
КонецЦикла;
Возврат ТЗ_Данные;
КонецФункции
Процедура СгенеритьНаборДаныхДляПримера_5_2(Количество)
Генератор таблицы значения для тестовой отправки.
&НаСервереБезКонтекста
Функция СгенеритьНаборДаныхДляПримера_5_2(Количество)
ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("ИмяСобытия", Новый ОписаниеТипов("Строка")); //Служебное поле, обязательное в любой таблице значений!!!
//
ТЗ_Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"), "Наименование поля");
ТЗ_Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма сумм");
Для Сч = 1 По Количество Цикл
СтрокаДанных = ТЗ_Данные.Добавить();
СтрокаДанных.Наименование = "Наименование видимо № "+Строка(Сч);
Случайный = Новый ГенераторСлучайныхЧисел(Сч);
Число_ = Случайный.СлучайноеЧисло(0,Сч);
СтрокаДанных.Сумма = Сч*Число_;
КонецЦикла;
Возврат ТЗ_Данные;
КонецФункции

На основе модуля "СОГ_ЛогОшибок" формирует обычное сообщение и записывает его регистре сведений "СОГ_ПочтовоеСообщение"
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Тест демонстрирует возможность помещать таблицы значений в массив и выводить их в печатную форму.
Помните, вес письма считается не только вложениями, но так же само содержимое письма входит в размер письма (т.е. тело письма + заголовок). Не злоупотребляйте добротой почтового сервера.
Процедура ОтправитьСообщение_5(Команда)
Поле "АдресПолучателяСообщения" необходимо заполнить или указать получателя в табличном поле "ТЗ_Получателей". Пример заполнения: Adress@mail.ru
&НаКлиенте
Процедура ОтправитьСообщение_6(Команда)
Файл_АдресВХ = Неопределено;
Файл_ИмяФайла = Неопределено;
Если Не ПустаяСтрока(ПутьКартинки) Тогда
Файл = Новый Файл(ПутьКартинки);
Если Файл.Существует() Тогда
ДД = Новый ДвоичныеДанные(ПутьКартинки);
Файл_АдресВХ = ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор);
Файл_ИмяФайла = Файл.Имя;
КонецЕсли;
КонецЕсли;
Отказ = Ложь;
СгенерироватьОтправкуСообщения_2(АдресПолучателяСообщения, ТЗ_Получателей, Файл_АдресВХ,Файл_ИмяФайла, Отказ);
Если Отказ <> Истина Тогда
ТекстСообщения = "Сообщения сгенерированы, выполните регламент отправки уведомлений.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
Процедура СгенерироватьОтправкуСообщения_2(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Файл_АдресВХ,Файл_ИмяФайла, Отказ)
//Формирование сообщения на основе модуля "СОГ_ЛогОшибок", с несколькими табличными частями и отчетом в виде вложения
&НаСервереБезКонтекста
Процедура СгенерироватьОтправкуСообщения_2(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Файл_АдресВХ,Файл_ИмяФайла, Отказ)
//Файл_АдресВХ
ДД_Файл = Неопределено;
Если ЭтоАдресВременногоХранилища(Файл_АдресВХ) Тогда
ДД_Файл = ПолучитьИзВременногоХранилища(Файл_АдресВХ);
Если ПустаяСтрока(Файл_ИмяФайла) Тогда
Файл_ИмяФайла = "ФайлВложения_Картинки.png";
КонецЕсли;
КонецЕсли;
ТЗ_Получателей = ТЗ_Получателей_Формы.Выгрузить();
Если ТЗ_Получателей.Количество() = 0 И Не ПустаяСтрока(АдресПолучателяСообщения) Тогда
СтрокаДанных = ТЗ_Получателей.Добавить();
СтрокаДанных.Пользователь = АдресПолучателяСообщения;
СтрокаДанных.email = Истина;
КонецЕсли;
ТЗ_ПолучателиУведомлений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].ПолучитьПолучателейУведомлений(ТЗ_Получателей);
Если ТЗ_ПолучателиУведомлений = Неопределено или Не ЗначениеЗаполнено(ТЗ_ПолучателиУведомлений) Тогда
ТекстСообщения = "Не заданы получатели списка сотрудников, сообщение не сформировано";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
//Создадим разные таблицы значений, с разными колонками.
ТЗ_Данные1 = СгенеритьНаборДаныхДляПримера_5_1(50);
ТЗ_Данные2 = СгенеритьНаборДаныхДляПримера_5_2(20);
//email
МассивEmail = ТЗ_ПолучателиУведомлений.НайтиСтроки(Новый Структура("email",Истина));
//Проверить... есть ли вообще адреса получатели...
ЕстьАдрес = Ложь;
Для Каждого АдресПочта Из МассивEmail Цикл
Если Не ПустаяСтрока(АдресПочта) Тогда
ЕстьАдрес = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьАдрес <> Истина Тогда
ТекстСообщения = "Не заданы получатели сообщений по e-mail, сообщение не отправлено.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
ИдентификаторОтправителя = "";
ТЗ_ПолучателиУведомлений_Копия = ТЗ_ПолучателиУведомлений.Скопировать(МассивEmail);
ПолучателиСообщений = ТЗ_ПолучателиУведомлений_Копия.ВыгрузитьКолонку("АдресПочты");
ТекстПоясненияПисьму = "Это тестовое сообщение в качестве примера возможности модуля ""СОГ_ЛогОшибок"" и обработки ""СОГ_ОтправкаПочтовыхСообщений"".";
стрПараметраОтправки = СОГ_ЛогОшибок.ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = "Пример сообщения № 2 минимум ("+Строка(ТЗ_Данные1.Количество())+" и "+Строка(ТЗ_Данные2.Количество())+") от "+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
стрПараметраОтправки.ОсновноеЗаголовок = "В примере создано записей: "+Строка(ТЗ_Данные1.Количество())+" и "+Строка(ТЗ_Данные2.Количество());
стрПараметраОтправки.ТекстПоясненияПисьму_HTML = "";
стрПараметраОтправки.ТекстПоясненияПисьму = ТекстПоясненияПисьму;
стрПараметраОтправки.ОсновнаяНужнаяСтраница = "";
стрПараметраОтправки.ПолучателиСообщений = ПолучателиСообщений;
стрПараметраОтправки.ИдентификаторОтправителя = ИдентификаторОтправителя;
стрПараметраОтправки.ГруппироватьПолучателей = Истина; //Одним письмом, если сможет...
//
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
//
//Поместим заголовки в массив, последовательнось массива "Массив_ТЗ" должно совпадать с последовательностью зоголовков.
МассивЗаголовок = Новый Массив();
ЗаголовкиТаблицы_ТаблДок_1 = СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные1);
МассивЗаголовок.Добавить(ЗаголовкиТаблицы_ТаблДок_1);
ЗаголовкиТаблицы_ТаблДок_2 = СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные2);
МассивЗаголовок.Добавить(ЗаголовкиТаблицы_ТаблДок_2);
стрПараметраОтправки.ЗаголовкиТаблицы = МассивЗаголовок;
//Заголовки для печатных форм.
МассивЗаголовка = Новый Массив;
МассивЗаголовка.Добавить(стрПараметраОтправки.ТемаПисьма);
МассивЗаголовка.Добавить(стрПараметраОтправки.ОсновноеЗаголовок);
//Создадим ексельки из таблиц значений.
//ПараметрыСтруктуры = "ТабличныйДокумент,СинонимМакета,ИмяМакета,";
КоллекцияПечатныхФорм = Новый Массив;
стрПечати = СОГ_ЛогОшибок.ПолучитьПустуюСтруктуруПечати();
стрПечати.ТабличныйДокумент = СОГ_ЛогОшибок.СформироватьОтчетПоРезультату(ТЗ_Данные1,МассивЗаголовка,ЗаголовкиТаблицы_ТаблДок_1);
стрПечати.СинонимМакета = "Генератор_Данных_6_1_от_"+Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH-mm-ss'");
КоллекцияПечатныхФорм.Добавить(стрПечати);
стрПечати = СОГ_ЛогОшибок.ПолучитьПустуюСтруктуруПечати();
стрПечати.ТабличныйДокумент = СОГ_ЛогОшибок.СформироватьОтчетПоРезультату(ТЗ_Данные2,МассивЗаголовка,ЗаголовкиТаблицы_ТаблДок_2);
стрПечати.СинонимМакета = "Генератор_Данных_6_2_от_"+Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH-mm-ss'");
КоллекцияПечатныхФорм.Добавить(стрПечати);
//Получить Список значений - его тоже можно передать во вложение, но мы так же выполним через "ДобавитьВложениеДляОтправки_Массив"
спсВложение = СОГ_ЛогОшибок.ПолучитьСписокЗначенийВложений(КоллекцияПечатныхФорм, ТипФайлаТабличногоДокумента.XLSX);
//Добавим в виде вложения
Вложение = Неопределено;
МенОбрОПС = Обработки["СОГ_ОтправкаПочтовыхСообщений"];
//
Если спсВложение.Количество() > 0 Тогда
Для Каждого ЗначСпс Из спсВложение Цикл
ИмяФайла = ЗначСпс.Представление;
ДД = ЗначСпс.Значение;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, ИмяФайла, Вложение, Ложь);
КонецЦикла;
КонецЕсли;
//Добавим картинку во вложение
Если ДД_Файл <> Неопределено Тогда
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД_Файл, Файл_ИмяФайла, Вложение, Ложь);
КонецЕсли;
стрПараметраОтправки.Вложение = Вложение;
ТаблицаЛогов = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
//Массив Таблиц значений для вывода в виде тела в письмо.
// Помните, что у модуля "СОГ_ЛогОшибок" по умолчанию ограничение табличной части на одно письмо выставлено в 100 строк.
// Для подсчета ограничения, строки от неолькольких таблиц значений суммируются
// Ограничение редактируется параметром "КоличествоСтрокВПисьме" (переменная: стрПараметраОтправки)
Массив_ТЗ = Новый Массив;
Массив_ТЗ.Добавить(ТЗ_Данные1);
Массив_ТЗ.Добавить(ТЗ_Данные2);
пОтказ = Ложь;
СОГ_ЛогОшибок.ОтправкаНепрочитанныйЛогОшибок(Массив_ТЗ, стрПараметраОтправки, ТаблицаЛогов, пОтказ);
Если пОтказ = Истина Тогда
Отказ = Истина;
КонецЕсли;
//Сообщим о ошибках, если таковые встретились...
Если ТаблицаЛогов.Количество() > 0 Тогда
Для Каждого СтрокаОшибки Из ТаблицаЛогов Цикл
СОГ_ЛогОшибокКлиентСервер.СообщитьОбОшибкеПользователю(СтрокаОшибки, "", Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СгенеритьНаборДаныхДляПримера_5_1(Количество)
Генератор таблицы значения для тестовой отправки.
&НаСервереБезКонтекста
Функция СгенеритьНаборДаныхДляПримера_5_1(Количество)
ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("ИмяСобытия", Новый ОписаниеТипов("Строка")); //Служебное поле, обязательное в любой таблице значений!!!
//
ТЗ_Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"), "Наименование поля");
ТЗ_Данные.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"), "Дата значения");
ТЗ_Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма сумм");
ТЗ_Данные.Колонки.Добавить("Описание", Новый ОписаниеТипов("Строка"), "Строка описания");
Для Сч = 1 По Количество Цикл
СтрокаДанных = ТЗ_Данные.Добавить();
СтрокаДанных.Наименование = "Наименование № "+Строка(Сч);
СтрокаДанных.Дата = ТекущаяДата();
Случайный = Новый ГенераторСлучайныхЧисел(Сч);
Число_ = Случайный.СлучайноеЧисло(0,Сч);
СтрокаДанных.Сумма = Сч*Число_;
СтрокаДанных.Описание = ""+СтрокаДанных.Наименование+" от "+Строка(СтрокаДанных.Дата)+" = "+Строка(СтрокаДанных.Сумма);
КонецЦикла;
Возврат ТЗ_Данные;
КонецФункции
Процедура СгенеритьНаборДаныхДляПримера_5_2(Количество)
Генератор таблицы значения для тестовой отправки.
&НаСервереБезКонтекста
Функция СгенеритьНаборДаныхДляПримера_5_2(Количество)
ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("ИмяСобытия", Новый ОписаниеТипов("Строка")); //Служебное поле, обязательное в любой таблице значений!!!
//
ТЗ_Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"), "Наименование поля");
ТЗ_Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма сумм");
Для Сч = 1 По Количество Цикл
СтрокаДанных = ТЗ_Данные.Добавить();
СтрокаДанных.Наименование = "Наименование видимо № "+Строка(Сч);
Случайный = Новый ГенераторСлучайныхЧисел(Сч);
Число_ = Случайный.СлучайноеЧисло(0,Сч);
СтрокаДанных.Сумма = Сч*Число_;
КонецЦикла;
Возврат ТЗ_Данные;
КонецФункции


На основе модуля "СОГ_ЛогОшибок" формирует обычное сообщение и записывает его регистре сведений "СОГ_ПочтовоеСообщение"
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Тест демонстрирует возможность выводить большие таблицы значений в письме.
Есть ограничение в выводимых строках. По умолчанию выставлено ограничение в 100 строк. Ограничение можно указать самостоятельно через параметр "КоличествоСтрокВПисьме"
Если будет превышен размер выводимой в письме таблицы значений, то будет создано следующее письмо содержащее 100 строк. И так будут создаваться письма, пока не обработаются все строки из таблицы значения.
Приложенное вложение будет доступно в каждом письме. (Если вас интересует другая логика, то придется переписать под себя, т.е. другой настройки нет)
Будьте аккуратны, а то повесите свой почтовый сервер выводом мусора из таблицы в пару млн. строк.
Процедура ОтправитьСообщение_7(Команда)
Поле "АдресПолучателяСообщения" необходимо заполнить или указать получателя в табличном поле "ТЗ_Получателей". Пример заполнения: Adress@mail.ru
&НаКлиенте
Процедура ОтправитьСообщение_7(Команда)
Отказ = Ложь;
СгенерироватьОтправкуСообщения_3(АдресПолучателяСообщения, ТЗ_Получателей, Отказ);
Если Отказ <> Истина Тогда
ТекстСообщения = "Сообщения сгенерированы, выполните регламент отправки уведомлений.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
Процедура СгенерироватьОтправкуСообщения_3(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Отказ)
//Формирование сообщения на основе модуля "СОГ_ЛогОшибок", с несколькими табличными частями и отчетом в виде вложения
&НаСервереБезКонтекста
Процедура СгенерироватьОтправкуСообщения_3(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Отказ)
ТЗ_Получателей = ТЗ_Получателей_Формы.Выгрузить();
Если ТЗ_Получателей.Количество() = 0 И Не ПустаяСтрока(АдресПолучателяСообщения) Тогда
СтрокаДанных = ТЗ_Получателей.Добавить();
СтрокаДанных.Пользователь = АдресПолучателяСообщения;
СтрокаДанных.email = Истина;
КонецЕсли;
ТЗ_ПолучателиУведомлений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].ПолучитьПолучателейУведомлений(ТЗ_Получателей);
Если ТЗ_ПолучателиУведомлений = Неопределено или Не ЗначениеЗаполнено(ТЗ_ПолучателиУведомлений) Тогда
ТекстСообщения = "Не заданы получатели списка сотрудников, сообщение не сформировано";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
//Создадим большую таблицу значения.
ТЗ_Данные1 = СгенеритьНаборДаныхДляПримера_5_1(400);
//email
МассивEmail = ТЗ_ПолучателиУведомлений.НайтиСтроки(Новый Структура("email",Истина));
//Проверить... есть ли вообще адреса получатели...
ЕстьАдрес = Ложь;
Для Каждого АдресПочта Из МассивEmail Цикл
Если Не ПустаяСтрока(АдресПочта) Тогда
ЕстьАдрес = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьАдрес <> Истина Тогда
ТекстСообщения = "Не заданы получатели сообщений по e-mail, сообщение не отправлено.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
ИдентификаторОтправителя = "";
ТЗ_ПолучателиУведомлений_Копия = ТЗ_ПолучателиУведомлений.Скопировать(МассивEmail);
ПолучателиСообщений = ТЗ_ПолучателиУведомлений_Копия.ВыгрузитьКолонку("АдресПочты");
ТекстПоясненияПисьму = "Это тестовое сообщение в качестве примера возможности модуля ""СОГ_ЛогОшибок"" и обработки ""СОГ_ОтправкаПочтовыхСообщений"".
|
|И максимальное количество для сообщений 100 записей, было создано 4 письма.";
стрПараметраОтправки = СОГ_ЛогОшибок.ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = "Пример сообщения № 3 минимум ("+Строка(ТЗ_Данные1.Количество())+") от "+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
стрПараметраОтправки.ОсновноеЗаголовок = "В примере создано записей: "+Строка(ТЗ_Данные1.Количество());
стрПараметраОтправки.ТекстПоясненияПисьму_HTML = "";
стрПараметраОтправки.ТекстПоясненияПисьму = ТекстПоясненияПисьму;
стрПараметраОтправки.ОсновнаяНужнаяСтраница = "";
стрПараметраОтправки.ПолучателиСообщений = ПолучателиСообщений;
стрПараметраОтправки.ИдентификаторОтправителя = ИдентификаторОтправителя;
стрПараметраОтправки.ГруппироватьПолучателей = Истина; //Одним письмом, если сможет...
//
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
//
//стрПараметраОтправки.КоличествоСтрокВПисьме = 100; //Максимальное количество записей из таблицы значения, по умолчанию 100
стрПараметраОтправки.ЗаголовкиТаблицы = СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные1);
МассивЗаголовка = Новый Массив;
МассивЗаголовка.Добавить(стрПараметраОтправки.ТемаПисьма);
МассивЗаголовка.Добавить(стрПараметраОтправки.ОсновноеЗаголовок);
//Сформируем на основе таблицы значения отчет.
//ПараметрыСтруктуры = "ТабличныйДокумент,СинонимМакета,ИмяМакета,";
КоллекцияПечатныхФорм = Новый Массив;
стрПечати = СОГ_ЛогОшибок.ПолучитьПустуюСтруктуруПечати();
стрПечати.ТабличныйДокумент = СОГ_ЛогОшибок.СформироватьОтчетПоРезультату(ТЗ_Данные1,МассивЗаголовка,стрПараметраОтправки.ЗаголовкиТаблицы);
стрПечати.СинонимМакета = "Генератор_Данных_7_1_от_"+Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH-mm-ss'");
КоллекцияПечатныхФорм.Добавить(стрПечати);
//Получить Список значений - его тоже можно передать во вложение, но мы так же выполним через "ДобавитьВложениеДляОтправки_Массив"
спсВложение = СОГ_ЛогОшибок.ПолучитьСписокЗначенийВложений(КоллекцияПечатныхФорм, ТипФайлаТабличногоДокумента.XLSX);
Вложение = Неопределено;
МенОбрОПС = Обработки["СОГ_ОтправкаПочтовыхСообщений"];
//
Если спсВложение.Количество() > 0 Тогда
Для Каждого ЗначСпс Из спсВложение Цикл
ИмяФайла = ЗначСпс.Представление;
ДД = ЗначСпс.Значение;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, ИмяФайла, Вложение, Ложь);
КонецЦикла;
КонецЕсли;
стрПараметраОтправки.Вложение = Вложение;
ТаблицаЛогов = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
пОтказ = Ложь;
СОГ_ЛогОшибок.ОтправкаНепрочитанныйЛогОшибок(ТЗ_Данные1, стрПараметраОтправки, ТаблицаЛогов, пОтказ);
Если пОтказ = Истина Тогда
Отказ = Истина;
КонецЕсли;
//Сообщим о ошибках, если таковые встретились...
Если ТаблицаЛогов.Количество() > 0 Тогда
Для Каждого СтрокаОшибки Из ТаблицаЛогов Цикл
СОГ_ЛогОшибокКлиентСервер.СообщитьОбОшибкеПользователю(СтрокаОшибки, "", Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СгенеритьНаборДаныхДляПримера_5_1(Количество)
Генератор таблицы значения для тестовой отправки.
&НаСервереБезКонтекста
Функция СгенеритьНаборДаныхДляПримера_5_1(Количество)
ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("ИмяСобытия", Новый ОписаниеТипов("Строка")); //Служебное поле, обязательное в любой таблице значений!!!
//
ТЗ_Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"), "Наименование поля");
ТЗ_Данные.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"), "Дата значения");
ТЗ_Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма сумм");
ТЗ_Данные.Колонки.Добавить("Описание", Новый ОписаниеТипов("Строка"), "Строка описания");
Для Сч = 1 По Количество Цикл
СтрокаДанных = ТЗ_Данные.Добавить();
СтрокаДанных.Наименование = "Наименование № "+Строка(Сч);
СтрокаДанных.Дата = ТекущаяДата();
Случайный = Новый ГенераторСлучайныхЧисел(Сч);
Число_ = Случайный.СлучайноеЧисло(0,Сч);
СтрокаДанных.Сумма = Сч*Число_;
СтрокаДанных.Описание = ""+СтрокаДанных.Наименование+" от "+Строка(СтрокаДанных.Дата)+" = "+Строка(СтрокаДанных.Сумма);
КонецЦикла;
Возврат ТЗ_Данные;
КонецФункции
На картинках только первое два письма. Остальные письма однотипны.
Первое письмо:

Второе письмо:

На основе модуля "СОГ_ЛогОшибок" формирует обычное сообщение и записывает его регистре сведений "СОГ_ПочтовоеСообщение"
Само сообщение будет отправлено только при выполнении регламента из обработки "СОГ_РассылкаСообщенийПоРегистру.epf"
Тест демонстрирует возможность вывести в тело письма только маленькую часть от большой таблицы значения.
Процедура ОтправитьСообщение_8(Команда)
Поле "АдресПолучателяСообщения" необходимо заполнить или указать получателя в табличном поле "ТЗ_Получателей". Пример заполнения: Adress@mail.ru
&НаКлиенте
Процедура ОтправитьСообщение_8(Команда)
Отказ = Ложь;
СгенерироватьОтправкуСообщения_4(АдресПолучателяСообщения, ТЗ_Получателей, Отказ);
Если Отказ <> Истина Тогда
ТекстСообщения = "Сообщения сгенерированы, выполните регламент отправки уведомлений.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
Процедура СгенерироватьОтправкуСообщения_4(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Отказ)
//Формирование сообщения на основе модуля "СОГ_ЛогОшибок", с несколькими табличными частями и отчетом в виде вложения
&НаСервереБезКонтекста
Процедура СгенерироватьОтправкуСообщения_4(АдресПолучателяСообщения, Знач ТЗ_Получателей_Формы, Отказ)
ТЗ_Получателей = ТЗ_Получателей_Формы.Выгрузить();
Если ТЗ_Получателей.Количество() = 0 И Не ПустаяСтрока(АдресПолучателяСообщения) Тогда
СтрокаДанных = ТЗ_Получателей.Добавить();
СтрокаДанных.Пользователь = АдресПолучателяСообщения;
СтрокаДанных.email = Истина;
КонецЕсли;
ТЗ_ПолучателиУведомлений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].ПолучитьПолучателейУведомлений(ТЗ_Получателей);
Если ТЗ_ПолучателиУведомлений = Неопределено или Не ЗначениеЗаполнено(ТЗ_ПолучателиУведомлений) Тогда
ТекстСообщения = "Не заданы получатели списка сотрудников, сообщение не сформировано";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
//Создадим большую таблицу значения.
// И поместим её копию в виде 10-и строк.
ТЗ_Данные1 = СгенеритьНаборДаныхДляПримера_5_1(400);
ТЗ_Данные2 = ТЗ_Данные1.СкопироватьКолонки();
Для Сч = 1 По 10 Цикл
СтрокаДанных = ТЗ_Данные1[Сч-1];
НоваяСтрока = ТЗ_Данные2.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаДанных);
КонецЦикла;
//email
МассивEmail = ТЗ_ПолучателиУведомлений.НайтиСтроки(Новый Структура("email",Истина));
//Проверить... есть ли вообще адреса получатели...
ЕстьАдрес = Ложь;
Для Каждого АдресПочта Из МассивEmail Цикл
Если Не ПустаяСтрока(АдресПочта) Тогда
ЕстьАдрес = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьАдрес <> Истина Тогда
ТекстСообщения = "Не заданы получатели сообщений по e-mail, сообщение не отправлено.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);
Возврат;
КонецЕсли;
ИдентификаторОтправителя = "";
ТЗ_ПолучателиУведомлений_Копия = ТЗ_ПолучателиУведомлений.Скопировать(МассивEmail);
ПолучателиСообщений = ТЗ_ПолучателиУведомлений_Копия.ВыгрузитьКолонку("АдресПочты");
ТекстПоясненияПисьму = "Это тестовое сообщение в качестве примера возможности модуля ""СОГ_ЛогОшибок"" и обработки ""СОГ_ОтправкаПочтовыхСообщений"".";
стрПараметраОтправки = СОГ_ЛогОшибок.ПолучитьСтруктуруДляОтправкиПисем();
стрПараметраОтправки.ТемаПисьма = "Пример сообщения № 4 минимум ("+Строка(ТЗ_Данные2.Количество())+" из "+Строка(ТЗ_Данные1.Количество())+") от "+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
стрПараметраОтправки.ОсновноеЗаголовок = "В примере создано записей: "+Строка(ТЗ_Данные1.Количество());
стрПараметраОтправки.ТекстПоясненияПисьму_HTML = "";
стрПараметраОтправки.ТекстПоясненияПисьму = ТекстПоясненияПисьму;
стрПараметраОтправки.ОсновнаяНужнаяСтраница = "";
стрПараметраОтправки.ПолучателиСообщений = ПолучателиСообщений;
стрПараметраОтправки.ИдентификаторОтправителя = ИдентификаторОтправителя;
стрПараметраОтправки.ГруппироватьПолучателей = Истина; //Одним письмом, если сможет...
//
стрПараметраОтправки.ТолькоЭтотОтправитель = Ложь;
//
//стрПараметраОтправки.КоличествоСтрокВПисьме = 100; //Максимальное количество записей из таблицы значения, по умолчанию 100
//Заголовок только для таблицы с 10-тью строками.
стрПараметраОтправки.ЗаголовкиТаблицы = СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные2);
МассивЗаголовка = Новый Массив;
МассивЗаголовка.Добавить(стрПараметраОтправки.ТемаПисьма);
МассивЗаголовка.Добавить(стрПараметраОтправки.ОсновноеЗаголовок);
//Сформируем на основе таблицы значения отчет.
//ПараметрыСтруктуры = "ТабличныйДокумент,СинонимМакета,ИмяМакета,";
КоллекцияПечатныхФорм = Новый Массив;
стрПечати = СОГ_ЛогОшибок.ПолучитьПустуюСтруктуруПечати();
стрПечати.ТабличныйДокумент = СОГ_ЛогОшибок.СформироватьОтчетПоРезультату(ТЗ_Данные1,МассивЗаголовка,СОГ_ЛогОшибок.ПолучитьЗаголокиИзТаблицыЗначений(ТЗ_Данные1));
стрПечати.СинонимМакета = "Генератор_Данных_8_1_от_"+Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH-mm-ss'");
КоллекцияПечатныхФорм.Добавить(стрПечати);
//Получить Список значений - его тоже можно передать во вложение, но мы так же выполним через "ДобавитьВложениеДляОтправки_Массив"
спсВложение = СОГ_ЛогОшибок.ПолучитьСписокЗначенийВложений(КоллекцияПечатныхФорм, ТипФайлаТабличногоДокумента.XLSX);
//Поместим отчет во вложение
Вложение = Неопределено;
МенОбрОПС = Обработки["СОГ_ОтправкаПочтовыхСообщений"];
//
Если спсВложение.Количество() > 0 Тогда
Для Каждого ЗначСпс Из спсВложение Цикл
ИмяФайла = ЗначСпс.Представление;
ДД = ЗначСпс.Значение;
МенОбрОПС.ДобавитьВложениеДляОтправки_Массив(ДД, ИмяФайла, Вложение, Ложь);
КонецЦикла;
КонецЕсли;
стрПараметраОтправки.Вложение = Вложение;
ТаблицаЛогов = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
//В письмо выводим только таблицу с 10-тью строками.
пОтказ = Ложь;
СОГ_ЛогОшибок.ОтправкаНепрочитанныйЛогОшибок(ТЗ_Данные2, стрПараметраОтправки, ТаблицаЛогов, пОтказ);
Если пОтказ = Истина Тогда
Отказ = Истина;
КонецЕсли;
//Сообщим о ошибках, если таковые встретились...
Если ТаблицаЛогов.Количество() > 0 Тогда
Для Каждого СтрокаОшибки Из ТаблицаЛогов Цикл
СОГ_ЛогОшибокКлиентСервер.СообщитьОбОшибкеПользователю(СтрокаОшибки, "", Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СгенеритьНаборДаныхДляПримера_5_1(Количество)
Генератор таблицы значения для тестовой отправки.
&НаСервереБезКонтекста
Функция СгенеритьНаборДаныхДляПримера_5_1(Количество)
ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("ИмяСобытия", Новый ОписаниеТипов("Строка")); //Служебное поле, обязательное в любой таблице значений!!!
//
ТЗ_Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"), "Наименование поля");
ТЗ_Данные.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"), "Дата значения");
ТЗ_Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма сумм");
ТЗ_Данные.Колонки.Добавить("Описание", Новый ОписаниеТипов("Строка"), "Строка описания");
Для Сч = 1 По Количество Цикл
СтрокаДанных = ТЗ_Данные.Добавить();
СтрокаДанных.Наименование = "Наименование № "+Строка(Сч);
СтрокаДанных.Дата = ТекущаяДата();
Случайный = Новый ГенераторСлучайныхЧисел(Сч);
Число_ = Случайный.СлучайноеЧисло(0,Сч);
СтрокаДанных.Сумма = Сч*Число_;
СтрокаДанных.Описание = ""+СтрокаДанных.Наименование+" от "+Строка(СтрокаДанных.Дата)+" = "+Строка(СтрокаДанных.Сумма);
КонецЦикла;
Возврат ТЗ_Данные;
КонецФункции

В табличной части формы "Получатели писем" можно задать следующие типы значений (в зависимости от вашей конфигурации):
Строка, СправочникСсылка.ГруппыПользователей, СправочникСсылка.Пользователи
Где соответственно указывается:
- Строкой указать почтовый адрес или адреса (обработка сможет их пережевать. В качестве разделителя указываются: запятые, пробелы, точка с запятой),
- Группа пользователей позволяет получать почтовые адреса всех пользователей, которые входят в данную группу (и содержат почтовый адрес),
- Пользователи - выбор пользователя, который участвует в рассылке (и содержат почтовый адрес).

Где колонки:
"Пользователь" - редактируемое поле, указывают: Пользователя, Группу пользователей, Почтовый адрес.
"email" - флаг, признак того, что данному пользователю отправлять почтовые уведомления.
"push" - флаг, признак того, что данному пользователю отправлять PUSH уведомления. (Штатный механизм БСП - НапоминанияПользователя)
"ПочтаПользователя" - информационная колонка, куда выводится информация о Группе или Пользователе.
ТекущиеДанные.ПочтаПользователя = ПолучитьПредставлениеПочтовогоЯщика(ТекущиеДанные.Пользователь);
Процедура ПолучитьПредставлениеПочтовогоЯщика(Знач Пользователь)
&НаСервереБезКонтекста
Функция ПолучитьПредставлениеПочтовогоЯщика(Знач Пользователь)
Если Пользователь = Неопределено или Не ЗначениеЗаполнено(Пользователь) Тогда
Возврат "";
КонецЕсли;
Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда
Возврат ПолучитьПочтовыйАдресПользователя(Пользователь);
ИначеЕсли ТипЗнч(Пользователь) = Тип("СправочникСсылка.ГруппыПользователей") Тогда
Возврат ПолучитьПредставленияПочтовыхАдресовПользователей(Пользователь);
Иначе
Возврат "";
КонецЕсли;
КонецФункции
Процедура ПолучитьПочтовыйАдресПользователя(Пользователь)
&НаСервереБезКонтекста
Функция ПолучитьПочтовыйАдресПользователя(Пользователь)
ПочтовыйАдресДляПолученияОтветов = "";
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.EmailПользователя);
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПользователиКонтактнаяИнформация.Ссылка КАК Ссылка,
| ПользователиКонтактнаяИнформация.Тип КАК Тип,
| ПользователиКонтактнаяИнформация.Вид КАК Вид,
| ПользователиКонтактнаяИнформация.Значение КАК Значение,
| ПользователиКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
|ГДЕ
| ПользователиКонтактнаяИнформация.Ссылка = &Пользователь
| И ПользователиКонтактнаяИнформация.Тип = &Тип
| И ПользователиКонтактнаяИнформация.Вид = &Вид
| И ПользователиКонтактнаяИнформация.Представление <> """"";
РезЗапроса = Запрос.Выполнить();
Если Не РезЗапроса.Пустой() Тогда
Выборка = РезЗапроса.Выбрать();
Выборка.Следующий();
ПочтовыйАдресДляПолученияОтветов = СокрЛП(Выборка.Представление);
КонецЕсли;
Возврат ПочтовыйАдресДляПолученияОтветов;
КонецФункции
Процедура ПолучитьПредставленияПочтовыхАдресовПользователей(ГруппаПользователей)
&НаСервереБезКонтекста
Функция ПолучитьПредставленияПочтовыхАдресовПользователей(ГруппаПользователей)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаПользователей);
Запрос.УстановитьПараметр("Вид", Справочники["ВидыКонтактнойИнформации"].EmailПользователя);
Запрос.УстановитьПараметр("Тип", Перечисления["ТипыКонтактнойИнформации"].АдресЭлектроннойПочты);
ПустойУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
Запрос.УстановитьПараметр("ПустойУИД", ПустойУИД);
Запрос.Текст =
"ВЫБРАТЬ
| СпрГруппыПользователей.Ссылка КАК Ссылка,
| ГруппыПользователейСостав.Пользователь КАК Пользователь,
| ЕСТЬNULL(ПользователиКонтактнаяИнформация.Представление, """") КАК Email,
| ЕСТЬNULL(СпрПользователи.ИдентификаторПользователяИБ, НЕОПРЕДЕЛЕНО) КАК ИдентификаторПользователяИБ
|ИЗ
| Справочник.ГруппыПользователей КАК СпрГруппыПользователей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
| ПО СпрГруппыПользователей.Ссылка = ГруппыПользователейСостав.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
| ПО (ГруппыПользователейСостав.Пользователь = ПользователиКонтактнаяИнформация.Ссылка)
| И (ПользователиКонтактнаяИнформация.Тип = &Тип)
| И (ПользователиКонтактнаяИнформация.Вид = &Вид)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК СпрПользователи
| ПО (ГруппыПользователейСостав.Пользователь = СпрПользователи.Ссылка)
| И (СпрПользователи.Недействителен <> ИСТИНА)
| И (СпрПользователи.ИдентификаторПользователяИБ <> &ПустойУИД)
|ГДЕ
| СпрГруппыПользователей.Ссылка = &ГруппаПользователей
| И НЕ ГруппыПользователейСостав.Пользователь.Ссылка ЕСТЬ NULL
| И ГруппыПользователейСостав.Пользователь.Недействителен <> ИСТИНА
| И ГруппыПользователейСостав.Пользователь.ПометкаУдаления <> ИСТИНА";
РезЗапроса = Запрос.Выполнить();
Если РезЗапроса.Пустой() Тогда
Возврат "<Нет пользователей>";
КонецЕсли;
Всего_Почты = 0;
Всего_Польз = 0;
Выборка = РезЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не ПустаяСтрока(Выборка.Email) Тогда
Всего_Почты = Всего_Почты + 1;
КонецЕсли;
ИДПольз = Выборка.ИдентификаторПользователяИБ;
Если ИДПольз = Неопределено или ИДПольз = ПустойУИД Тогда
Продолжить;
КонецЕсли;
//ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИДПольз);
//Если ПользовательИБ = Неопределено Тогда Продолжить; КонецЕсли;
Если Пользователи.ВходВПрограммуРазрешен(ИДПольз) = Истина Тогда
Всего_Польз = Всего_Польз + 1;
КонецЕсли;
КонецЦикла;
Возврат "e-mail: "+Строка(Всего_Почты)+" / пользователей: "+Строка(Всего_Польз);
КонецФункции
Примеры использования расширения "Отправка почтовых уведомлений по регламенту"
Содержит два примера подготовки сообщения для регламентного задания.
Полный набор параметров:
//Снимем ограничение на обработку...
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
//Настройка идентификации отправителя, по настройкам (в обработке нет ограничения в количестве настроек)
//Если указан идентификатор, то сперва ищется настройка с идентификатором.
// Затем уже в список настроек дополнительно включаются другие настройки,
// которые удовлетворяют условию отбора. (т.е. могут отправлять сообщения по SMTP)
ИдентификаторОтправителя = "<Указать идентификатор настройки>"; //Может быть пуст, чувствителен к регистру, т.е. указать точное наименование настройки.
//Если "Истина" - то для отправки сообщения будет использована настройка с указанным идентификатором.
ТолькоЭтотОтправитель = Ложь; //Ограничивает использование настройки для отправки сообщений.
//Обозначим значения переменных...
ТемаПисьма = "Тема письма, заголовок";
ТекстПисьма = "Текст письма, содержание";
EmailОтправителя = "Mail@mail.ru"; //Можно указать почтовый ящик, который не относится к настройке. Т.е. Получатель будет видеть тот e-mail, какой надо.
EmailОтправителяОтвета = "Mail@mail.ru"; //Можно указать другой почтовый адрес. Отправлять ответ третьему лицу.
//В качестве значений можно указывать:
// Строку, где через ";" перечислены все получатели уведомлений.
// СписокЗначений - где "Значение" - e-mail, "Представление" - Представление получателя)
// Массив - Массив может содержать: Строки адресов, Структуру(вида: "ПолучитьСтруктуруАдресаПолучателя"))
АдресаУведомленияОДоставке = Неопределено; //Пример по Структуре: ОбработкаСообщений.ПолучитьСтруктуруАдресаПолучателя(); //В структуре указывать только один адрес.
АдресаУведомленияОПрочтении = Неопределено; //Строчки адресов можно перечислять через разделители, к примеру символ ";" (точка с запятой)
//В качестве значений можно указывать:
// Массив - из строк, с полным путем к файлу на диске.
// "Таблицу значений" с колонками: "ИмяФайла" и "Значение"(содержит тип: Двоичные данные, Адрес временного хранилища, Путь к файлу).
// СписокЗначений - где "Значение"(содержит тип: Двоичные данные, Адрес временного хранилища, Путь к файлу), "Представление" - Имя файла
// Соответствие - где "Значение"(содержит тип: Двоичные данные, Адрес временного хранилища, Путь к файлу), Ключ - Имя файла
Вложение = Неопределено;
//В качестве значений можно указывать:
// Строку, где через ";" перечислены все получатели сообщения.
// СписокЗначений - где "Значение" - e-mail, Представление - Представление получателя)
// Массив - Массив может содержать: Строки адресов, Структуру(вида: "ПолучитьСтруктуруАдресаПолучателя"))
ПолучателиСообщений = "<Указать почтовый адрес получателя>";
Копии = Неопределено; //Может содержать тип такой же как и "ПолучателиСообщений"
СлепыеКопии = Неопределено; //Может содержать тип такой же как и "ПолучателиСообщений"
//Отправим сообщение по регламентному заданию...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать();
//Данные для сообщения...
стрСообщение = ОбработкаСообщений.ПолучитьСтруктуруСообщения();
стрСообщение.Тема = ТемаПисьма; //Строка
стрСообщение.Текст = ТекстПисьма; //Строка
стрСообщение.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; //"ТипТекстаПочтовогоСообщения" или Строка значений: "HTML", "ПроизвольныйТекст", "ПростойТекст", "РазмеченныйТекст"
стрСообщение.Организация = "Компания"; //Строка
стрСообщение.EmailОтправителя = EmailОтправителя; //Строка
стрСообщение.EmailОтправителяОтвета = EmailОтправителяОтвета; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//
стрСообщение.УведомитьОДоставке = Ложь; //Булево
стрСообщение.УведомитьОПрочтении = Ложь; //Булево
стрСообщение.АдресаУведомленияОДоставке = АдресаУведомленияОДоставке; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
стрСообщение.АдресаУведомленияОПрочтении = АдресаУведомленияОПрочтении; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//
//Установить приоритет (важность письма)
стрСообщение.Важность = 0; //Число: от 0 до 5 - Значение из "ПолучитьВажностьСообщения"
//Список получателей Копий писем
стрСообщение.Копии = Копии; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//Список получателей Скрытых Копий писем
стрСообщение.СлепыеКопии = СлепыеКопии; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//
//Параметр группирует получателей в одном сообщении
// Отправляет всем получателям (e-mail) одним письмом (в случаи ошибки в адресе получателя, пробует отправить письмо каждому получателю из списка)
// В противном случаи (Ложь), на каждый адрес отправляется отдельное письмо
стрСообщение.ГруппироватьПолучателей = Ложь; //Булево
//
//Параметры не влияют на обработку сообщения, при отправки через регламент.
// И их можно не заполнять...
//
стрСообщение.ДатаСоздания = ТекущаяДата(); //Дата - По умолчанию всегда текущая дата
//
стрСообщение.Ошибка = Ложь; //Булево
стрСообщение.КодОшибки = 0; //Число - как правило ошибка отрицательная
стрСообщение.КоличествоПопыток = 0; //Число
стрСообщение.ДатаПопытки = Дата(1,1,1); //Дата
//
стрСообщение.ИдентификаторОтправителя = ""; //Строка
стрСообщение.ТолькоЭтотОтправитель = Ложь; //Булево
//Конец перечисления служебных параметров
//Структура письма...
стрПисьмо = ОбработкаСообщений.ПолучитьСтруктуруЗаписиСообщения();
стрПисьмо.Сообщение = стрСообщение; //Структура вида "ПолучитьСтруктуруСообщения"
стрПисьмо.Вложение = Вложение; //Массив(Полный путь к файлу на диске), "Таблица значений"(с колонками: "ИмяФайла" и "Значение"), "Список значений", Соответствие.
стрПисьмо.Получатели = ОбработкаСообщений.ПолучитьМассивПолучателейСообщений(ПолучателиСообщений); //Строка, Массив, "Список значений"
//Параметры не влияют на обработку сообщения, при отправки через регламент.
// И их можно не заполнять...
//
//Регистрирует отправленное сообщение в регистре, для отчетности.
// При отправки сообщения пользователем, в Регистре сведений "СОГ_ПочтовоеСообщение", будет зафиксирована запись для информации. (Сохраняет письмо, у записи устанавливает флаг "Не активное")
стрПисьмо.СохранитьСообщениеВРегистре = Ложь; //Только для отправки сообщений пользователем, для регламента игнорируется.
//Конец перечисления служебных параметров
//Добавим запись для отправки сообщения...
ДатаОтправки = Дата(1,1,1); //Отправить сообщение, при первой возможности, без задержки.
ОбработкаСообщений.ДобавитьНовуюЗаписьДляОтправкиСообщений(стрПисьмо, ТемаПисьма, ДатаОтправки, ИдентификаторОтправителя, ТолькоЭтотОтправитель);
Минимальный набор параметров:
//Снимем ограничение на обработку...
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
//Настройка идентификации отправителя, по настройкам
ИдентификаторОтправителя = "<Указать идентификатор настройки>";
ТолькоЭтотОтправитель = Ложь;
//Обозначим значения переменных...
ТемаПисьма = "Тема письма, заголовок";
ТекстПисьма = "Текст письма, содержание";
//В качестве значений можно указывать:
// Строку, где через ";" перечислены все получатели сообщения.
// СписокЗначений - где "Значение" - e-mail, Представление - Представление получателя)
// Массив - Массив может содержать: Строки адресов, Структуру(вида: "ПолучитьСтруктуруАдресаПолучателя"))
ПолучателиСообщений = "<Указать почтовый адрес получателя>";
//Отправим сообщение по регламентному заданию...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать();
//Данные для сообщения...
стрСообщение = ОбработкаСообщений.ПолучитьСтруктуруСообщения();
стрСообщение.Тема = ТемаПисьма; //Строка
стрСообщение.Текст = ТекстПисьма; //Строка
//Параметр "ТипТекста" по умолчанию заполнен значением "HTML".
//стрСообщение.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; //"ТипТекстаПочтовогоСообщения" или Строка значений: "HTML", "ПроизвольныйТекст", "ПростойТекст", "РазмеченныйТекст"
//Структура письма...
стрПисьмо = ОбработкаСообщений.ПолучитьСтруктуруЗаписиСообщения();
стрПисьмо.Сообщение = стрСообщение; //Структура вида "ПолучитьСтруктуруСообщения"
стрПисьмо.Получатели = ОбработкаСообщений.ПолучитьМассивПолучателейСообщений(ПолучателиСообщений); //Строка, Массив, "Список значений"
//Добавим запись для отправки сообщения...
ОбработкаСообщений.ДобавитьНовуюЗаписьДляОтправкиСообщений(стрПисьмо, Неопределено, Неопределено, ИдентификаторОтправителя, ТолькоЭтотОтправитель);
Содержит два примера отправки сообщения пользователем.
Полный набор параметров:
//Снимем ограничение на обработку...
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
//Настройка идентификации отправителя, по настройкам (в обработке нет ограничения в количестве настроек)
//Если указан идентификатор, то сперва ищется настройка с идентификатором.
// Затем уже в список настроек дополнительно включаются другие настройки,
// которые удовлетворяют условию отбора. (т.е. могут отправлять сообщения по SMTP)
ИдентификаторОтправителя = "<Указать идентификатор настройки>"; //Может быть пуст, чувствителен к регистру, т.е. указать точное наименование настройки.
//Если "Истина" - то для отправки сообщения будет использована настройка с указанным идентификатором.
ТолькоЭтотОтправитель = Ложь; //Ограничивает использование настройки для отправки сообщений.
//Обозначим значения переменных...
ТемаПисьма = "Тема письма, заголовок";
ТекстПисьма = "Текст письма, содержание";
EmailОтправителя = "Mail@mail.ru"; //Можно указать почтовый ящик, который не относится к настройке. Т.е. Получатель будет видеть тот e-mail, какой надо.
EmailОтправителяОтвета = "Mail@mail.ru"; //Можно указать другой почтовый адрес. Отправлять ответ третьему лицу.
//В качестве значений можно указывать:
// Строку, где через ";" перечислены все получатели уведомлений.
// СписокЗначений - где "Значение" - e-mail, "Представление" - Представление получателя)
// Массив - Массив может содержать: Строки адресов, Структуру(вида: "ПолучитьСтруктуруАдресаПолучателя"))
АдресаУведомленияОДоставке = Неопределено; //Пример по Структуре: ОбработкаСообщений.ПолучитьСтруктуруАдресаПолучателя(); //В структуре указывать только один адрес.
АдресаУведомленияОПрочтении = Неопределено; //Строчки адресов можно перечислять через разделители, к примеру символ ";" (точка с запятой)
//В качестве значений можно указывать:
// Массив - из строк, с полным путем к файлу на диске.
// "Таблицу значений" с колонками: "ИмяФайла" и "Значение"(содержит тип: Двоичные данные, Адрес временного хранилища, Путь к файлу).
// СписокЗначений - где "Значение"(содержит тип: Двоичные данные, Адрес временного хранилища, Путь к файлу), "Представление" - Имя файла
// Соответствие - где "Значение"(содержит тип: Двоичные данные, Адрес временного хранилища, Путь к файлу), Ключ - Имя файла
Вложение = Неопределено;
//В качестве значений можно указывать:
// Строку, где через ";" перечислены все получатели сообщения.
// СписокЗначений - где "Значение" - e-mail, Представление - Представление получателя)
// Массив - Массив может содержать: Строки адресов, Структуру(вида: "ПолучитьСтруктуруАдресаПолучателя"))
ПолучателиСообщений = "<Указать почтовый адрес получателя>";
Копии = Неопределено; //Может содержать тип такой же как и "ПолучателиСообщений"
СлепыеКопии = Неопределено; //Может содержать тип такой же как и "ПолучателиСообщений"
//Отправить сообщение Пользователем из обработки...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать();
//Данные для сообщения...
стрСообщение = ОбработкаСообщений.ПолучитьСтруктуруСообщения();
стрСообщение.Тема = ТемаПисьма; //Строка
стрСообщение.Текст = ТекстПисьма; //Строка
стрСообщение.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; //"ТипТекстаПочтовогоСообщения" или Строка значений: "HTML", "ПроизвольныйТекст", "ПростойТекст", "РазмеченныйТекст"
стрСообщение.Организация = "Компания"; //Строка
стрСообщение.EmailОтправителя = EmailОтправителя; //Строка
стрСообщение.EmailОтправителяОтвета = EmailОтправителяОтвета; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//
стрСообщение.УведомитьОДоставке = Ложь; //Булево
стрСообщение.УведомитьОПрочтении = Ложь; //Булево
стрСообщение.АдресаУведомленияОДоставке = АдресаУведомленияОДоставке; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
стрСообщение.АдресаУведомленияОПрочтении = АдресаУведомленияОПрочтении; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//
//Установить приоритет (важность письма)
стрСообщение.Важность = 0; //Число: от 0 до 5 - Значение из "ПолучитьВажностьСообщения"
//Список получателей Копии писем
стрСообщение.Копии = Копии; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//Список получателей Скрытых Копии писем
стрСообщение.СлепыеКопии = СлепыеКопии; //Строка, СписокЗначений(Значение: e-mail, Представление: ФИО), Массив(Строк,Структуры(вида: "ПолучитьСтруктуруАдресаПолучателя"))
//
//Параметр группирует получателей в одном сообщении
// Отправляет всем получателям (e-mail) одним письмом (в случаи ошибки в адресе получателя, пробует отправить письмо каждому получателю из списка)
// В противном случаи (Ложь), на каждый адрес отправляется отдельное письмо
стрСообщение.ГруппироватьПолучателей = Истина; //Булево
//
//Указывается идентификатор настройки, от имени кого будет осуществлена отправка сообщения
стрСообщение.ИдентификаторОтправителя = ИдентификаторОтправителя; //Строка
стрСообщение.ТолькоЭтотОтправитель = ТолькоЭтотОтправитель; //Булево
//Параметры не влияют на обработку сообщения, при отправки пользователем.
// И их можно не заполнять...
//
стрСообщение.ДатаСоздания = ТекущаяДата(); //Дата - По умолчанию всегда текущая дата
//
стрСообщение.Ошибка = Ложь; //Булево
стрСообщение.КодОшибки = 0; //Число - как правило ошибка отрицательная
стрСообщение.КоличествоПопыток = 0; //Число
стрСообщение.ДатаПопытки = Дата(1,1,1); //Дата
//Конец перечисления служебных параметров
//Структура письма...
стрПисьмо = ОбработкаСообщений.ПолучитьСтруктуруЗаписиСообщения();
стрПисьмо.Сообщение = стрСообщение; //Структура вида "ПолучитьСтруктуруСообщения"
стрПисьмо.Вложение = Вложение; //Массив(Полный путь к файлу на диске), "Таблица значений"(с колонками: "ИмяФайла" и "Значение"), "Список значений", Соответствие.
стрПисьмо.Получатели = ОбработкаСообщений.ПолучитьМассивПолучателейСообщений(ПолучателиСообщений); //Строка, Массив, "Список значений"
//
//Регистрирует отправленное сообщение в регистре, для отчетности.
// При отправки сообщения пользователем, в Регистре сведений "СОГ_ПочтовоеСообщение", будет зафиксирована запись для информации. (Сохраняет все письмо, у записи устанавливает флаг "Не активное")
стрПисьмо.СохранитьСообщениеВРегистре = Истина; //Только для отправки сообщений пользователем, для регламента игнорируется.
//Сама отправка сообщения...
Отказ = Ложь;
КодОшибки = 0;
ТекстОшибки = "";
ОбработкаСообщений.ОтправитьСообщения_Пользователем(стрПисьмо, Отказ, КодОшибки, ТекстОшибки);
Если Отказ = Истина Тогда
ТекстСообщения = "Не удалось отправить сообщение через e-mail. Ошибка № "+Строка(КодОшибки)+", "+ТекстОшибки;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
Минимальный набор параметров:
//Снимем ограничение на обработку...
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
//Настройка идентификации отправителя, по настройкам
ИдентификаторОтправителя = "<Указать идентификатор настройки>";
ТолькоЭтотОтправитель = Ложь;
//Обозначим значения переменных...
ТемаПисьма = "Тема письма, заголовок";
ТекстПисьма = "Текст письма, содержание";
//В качестве значений можно указывать:
// Строку, где через ";" перечислены все получатели сообщения.
// СписокЗначений - где "Значение" - e-mail, Представление - Представление получателя)
// Массив - Массив может содержать: Строки адресов, Структуру(вида: "ПолучитьСтруктуруАдресаПолучателя"))
ПолучателиСообщений = "<Указать почтовый адрес получателя>";
//Отправим сообщение по регламентному заданию...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать();
//Данные для сообщения...
стрСообщение = ОбработкаСообщений.ПолучитьСтруктуруСообщения();
стрСообщение.Тема = ТемаПисьма; //Строка
стрСообщение.Текст = ТекстПисьма; //Строка
//
//Указывается идентификатор настройки, от имени кого будет осуществлена отправка сообщения
стрСообщение.ИдентификаторОтправителя = ИдентификаторОтправителя; //Строка
стрСообщение.ТолькоЭтотОтправитель = ТолькоЭтотОтправитель; //Булево
//Параметр "ТипТекста" по умолчанию заполнен значением "HTML".
//стрСообщение.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; //"ТипТекстаПочтовогоСообщения" или Строка значений: "HTML", "ПроизвольныйТекст", "ПростойТекст", "РазмеченныйТекст"
//Структура письма...
стрПисьмо = ОбработкаСообщений.ПолучитьСтруктуруЗаписиСообщения();
стрПисьмо.Сообщение = стрСообщение; //Структура вида "ПолучитьСтруктуруСообщения"
стрПисьмо.Получатели = ОбработкаСообщений.ПолучитьМассивПолучателейСообщений(ПолучателиСообщений); //Строка, Массив, "Список значений"
стрПисьмо.СохранитьСообщениеВРегистре = Истина; //Регистрирует отправленное сообщение в регистре, для отчетности.
//Сама отправка сообщения...
Отказ = Ложь;
КодОшибки = 0;
ТекстОшибки = "";
ОбработкаСообщений.ОтправитьСообщения_Пользователем(стрПисьмо, Отказ, КодОшибки, ТекстОшибки);
Если Отказ = Истина Тогда
ТекстСообщения = "Не удалось отправить сообщение через e-mail. Ошибка № "+Строка(КодОшибки)+", "+ТекстОшибки;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
//Снимем ограничение на обработку...
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
//Для чтения входящей почты в настройках должны быть указаны соответствующие "Идентификаторы настроек"
ИдентификаторПолучателя = "<Указать идентификатор настройки>";
ПараметрыСтруктуры = "УстановитьФлагПрочтен, ПоказатьВложения, ИспользоватьОтбор, ОтборБезВложений, УИДФормы, "+
"КоличествоДнейГлубины, РазмерВложения, ТипФайлаВложения, КоличествоВложений, МассивОтправителейОтчета, МассивТемПисем, ПоследняяИсторияЧтенияПисем";
стрНастройки = Новый Структура(ПараметрыСтруктуры);
стрНастройки.УстановитьФлагПрочтен = Ложь; //Для "POP3" всегда Истина. Актуален только для IMAP, для протокола POP3 единственное допустимое значение - Истина.
стрНастройки.ПоказатьВложения = Истина; //При получении письма получаем еще и вложения. Если "Ложь" - фиксируется только количество приложенных файлов.
стрНастройки.ИспользоватьОтбор = Истина; //При чтения письма использовать параметр "Отбор".
стрНастройки.ОтборБезВложений = Ложь; //При использовании "обора", не используется обор по вложению. (Письма отбираются только по заголовку и отправителю)
стрНастройки.УИДФормы = Неопределено; //При использовании параметра "ИспользоватьВХ", вложения помещаются во временное хранилище по указанному УИД-у.
//Настройка для отбора - Если отбор не используется, то не заполнять.
стрНастройки.КоличествоДнейГлубины = 14; //Количество дней в прошлом от текущей даты. Используется для отбора писем по дате отправления входящего сообщения.
стрНастройки.РазмерВложения = 0; //Отбор письма по размеру вложения. Размер в Кб. ("Размер вложения" * 1024)
стрНастройки.ТипФайлаВложения = ""; //Тип допустимого вложения. (Указывать тип, без точки. Нельзя указать не сколько типов)
стрНастройки.КоличествоВложений = 0; //0 - количество вложений не анализируется, иначе выполняет проверку на равное количество вложений в письме.
стрНастройки.МассивОтправителейОтчета = Неопределено; //Массив строк с почтовыми адресами разрешенной входящей почты.
стрНастройки.МассивТемПисем = Неопределено; //Строка или Массив строк разрешенных заголовков писем. (Поиск по части текста)
стрНастройки.ПоследняяИсторияЧтенияПисем = Неопределено; //Таблица значений исключений уже обработанных писем. Пустую таблицу получить из функции: "ПолучитьПустуюТаблицуИсторияЧтенияПисем"
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать();
ОбработкаСообщений.ОбновитьНастройкиДляВсехНаСервере();
ОбработкаСообщений.СброситьСостояниеОшибок();
стрПолучателя = ОбработкаСообщений.ПолучитьСтруктуруСообщенияПолучателя();
стрПолучателя.ИдентификаторОтправителя = ИдентификаторПолучателя;
стрПолучателя.ТолькоЭтотОтправитель = Истина; //Для чтения почты, параметр всегда имеет значение "Истина".
ТЗ_Получателей = ОбработкаСообщений.ПолучитьТаблицу_ПочтовыеАдресаПолучателей(стрПолучателя);
ИспользоватьОтбор = Истина; //Использовать отбор или нет.
ОтборБезВложений = Истина; //Если "Истина" - то вложения не анализируются и в отборе не участвуют..
стрНастройкиЧтенияПочты = ОбработкаСообщений.ПолучитьНастройкуЧтенияПочты(стрНастройки);
стрНастройкиЧтенияПочты.ПоказатьВложения = Истина;
стрНастройкиЧтенияПочты.ИспользоватьОтбор = ИспользоватьОтбор;
стрНастройкиЧтенияПочты.ОтборБезВложений = ОтборБезВложений;
стрНастройкиЧтенияПочты.ИспользоватьВХ = Истина; //Для Клиента, используется Временное хранилище
//Для отключения отбора по дате отправленного, нужно...
// Код отключает отбор по дате отправления и позволяет получить все письма за весь период
//стрНастройкиЧтенияПочты.Отбор.ПослеДатыОтправления = Неопределено;
//Таблица для логов ошибок...
ТаблицаЛогов = ОбработкаСообщений.ПолучитьПустуюТаблицуЛогов();
ТЗ_НаборыПисем = ОбработкаСообщений.ПрочитатьПисьмаПочты(ТЗ_Получателей, стрНастройкиЧтенияПочты, ТаблицаЛогов, Отказ);
Если ТЗ_НаборыПисем = Неопределено или ТЗ_НаборыПисем.Количество() = 0 Тогда Возврат; КонецЕсли;
//Получим пустую результирующую "Таблицу значений"...
ТЗ_ВходящейПочты = ОбработкаСообщений.ПолучитьПустуюТаблицуВходящейПочты();
Для Каждого СтрокаНП Из ТЗ_НаборыПисем Цикл
ЯщикОпроса = СтрокаНП.ЯщикОпроса;
МассивПисем = СтрокаНП.МассивПисем;
Если МассивПисем = Неопределено Тогда Продолжить; КонецЕсли;
Для Каждого стрПисьма Из МассивПисем Цикл
НоваяСтрока = ТЗ_ВходящейПочты.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,стрПисьма);
НоваяСтрока.ЯщикОпроса = ЯщикОпроса;
Если стрПисьма.Вложения <> Неопределено Тогда
ВложенияВХ = ПоместитьВоВременноеХранилище(стрПисьма.Вложения, ЭтаФорма.УникальныйИдентификатор);
НоваяСтрока.ВложенияВХ = ВложенияВХ;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//Порядок...
ТЗ_ВходящейПочты.Сортировать("ДатаОтправления Убыв, Идентификатор Убыв");
//Заголовок
КоличествоЗаписейВходящейПочты = ТЗ_ВходящейПочты.Количество();
Пример формирования текста для лога ошибок.
//Инициализация обработки...
ОбработкаСообщений = Обработки["СОГ_ОтправкаПочтовыхСообщений"].Создать();
//Таблица для логов ошибок...
ТаблицаЛогов = ОбработкаСообщений.ПолучитьПустуюТаблицуЛогов();
//ТаблицаЛогов - заполняется какими-то данными при выполнении кода в обработках.
// Тут он представлен, как пустая Таблица значений, для понимания, что и откуда взялось.
//Сформируем массив строчек для текста исходящего письма...
МассивТекста = Новый Массив;
ТекстЗаголовка = "Лог ошибок ("+Строка(ТаблицаЛогов.Количество())+")";
//Заголовок...
МассивТекста.Добавить("<h3>"+XMLСтрока(ТекстЗаголовка)+"</h3>");
ТекстТаблицы = "<table border=""1"">";
//Шапка таблицы.
//<th>Ячейка 1</th>
ТекстШапка = "<th></th><th><strong>Дата записи</strong></th><th><strong>Ошибка</strong></th><th><strong>Описание</strong></th>";
ТекстТаблицы = ТекстТаблицы + "
|<tr>
|"+ТекстШапка+"
|</tr>";
СчСтрок = 0;
Для Каждого СтрокаЛога Из ТаблицаЛогов Цикл
СчСтрок = СчСтрок + 1;
ТекстСтрок = "<td>"+XMLСтрока(СчСтрок)+"</td><td align=""left"">"+XMLСтрока(Строка(СтрокаЛога.ДатаЗаписи))+"</td>"+
"<td align=""center"">"+XMLСтрока(?(СтрокаЛога.Ошибка,"V",""))+"</td>"+
"<td align=""left"">"+XMLСтрока(Строка(СтрокаЛога.Описание))+"</td>";
ТекстТаблицы = ТекстТаблицы + "
|<tr>
|"+ТекстСтрок+"
|</tr>";
КонецЦикла;
ТекстТаблицы = ТекстТаблицы + "
|</table>";
//Все одной таблицей...
МассивТекста.Добавить(ТекстТаблицы);
//Перенос строки...
МассивТекста.Добавить("<br/>");
//Отправка письма...
Если МассивТекста.Количество() > 0 Тогда
НаименованиеСервиса_ = "Чтение почты - 'e-mail'";
НаименованиеСервиса = "Лог ошибок обработки - " + НаименованиеСервиса_;
НужнаяСтраница = ""; //Указывается ссылка на страницу
НаименованиеСтраницы = НаименованиеСервиса_;
ЗначениеЯчейки = "<a fr-original-style="""" href="""+НужнаяСтраница+""" rel=""noopener noreferrer"" style=""user-select: auto;"" target=""_blank"">"+XMLСтрока(Строка(НаименованиеСтраницы))+"</a>";
ТекстПисьма = "<h2>"+XMLСтрока(ЗначениеЯчейки)+"</h2>
|<br/>";
МассивТекста.Вставить(0,ТекстПисьма);
//Пример получения темы письма
ТемаПисьма = ""+НаименованиеСервиса;
//Пример получения текста письма в формате HTML
ТекстПисьма = СтрСоединить(МассивТекста,Символы.ПС);
КонецЕсли;
В результате получим письмо:

Модуль предназначен для подключения к удаленной базе данных.
Ниже приведен краткий пример использования расширения.
(к отправке уведомления модуль значения не имеет, но он вошёл в состав расширения)
//Для записи лога ошибок...
ТаблицаЛогов = СОГ_ЛогОшибок.ПолучитьПустуюТаблицуЛогов();
//Получить Логин и пароль из настроек расширения....
стрОснПарамОбр = СОГ_ОбщиеНастройкиРасширенияВызовСервера.ПолучитьНастройкиОбработкиИС();
стрПараметрыПодключения = СОГ_СоединениеБД.ПолучитьСтруктуруПодключения();
СОГ_СоединениеБД.ЗаполнитьПараметрыЗначением(стрПараметрыПодключения, стрОснПарамОбр, "ИС_");
//Это тестовое подключение, просто тест...
// Переменные функции "УстановитьCOM_Соединение":
// стрОснПарамОбр - Параметр для подключения, структура вида: "Сервер,БазаДанных,Пользователь,Пароль,МестоположениеWSDL"
// ТаблицаЛогов, - Таблица значений для регистрации ошибок
// Отказ, - флаг, что произошла ошибка, или успех (Подключились или нет). Если ИСТИНА, то это ошибка.
// V83_ComConnector, - Флаг, ИСТИНА использовать COM соединение, ЛОЖЬ использовать WEB сервисы.
// обрИмяСобытия=Неопределено, - Строка, содержащая имя события, для лога ошибок.
// Знач ВыводитьСообщение=Неопределено - Флаг, если ЛОЖЬ, то сообщение не будут видны пользователю. По умолчанию "ИСТИНА", сообщения выводятся.
СОМ_Подключение = СОГ_СоединениеБД.УстановитьCOM_Соединение(стрПараметрыПодключения, ТаблицаЛогов, Ложь, Ложь);
Если СОМ_Подключение = Неопределено Тогда
ТекстОшибки = НСтр("ru='Ошибка подключения'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
Иначе
ТекстОшибки = НСтр("ru='ОК - подключено.'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
СОГ_СоединениеБД.РазорватьCOM_Соединение(СОМ_Подключение);
КонецЕсли;
//Рабочий запрос, выполнен через "стрРезультатаNET", т.е.
стрРезультатаNET = Новый Структура("СОМ_Подключение, ПараметрыПодключения, ОтборЗапроса, РезультатаNET,");
стрРезультатаNET.ОтборЗапроса = ТекущаяДата();
стрРезультатаNET.ПараметрыПодключения = стрПараметрыПодключения;
//В модуле Или в процедуре получения данных выполняется вот такой код.
// В котором при отсутствии соединения, выполняется подключение, если подключение есть, то пробуем проверить связь.
СОМ_Подключение = стрРезультатаNET.СОМ_Подключение;
ПараметрыПодключения = стрРезультатаNET.ПараметрыПодключения;
ОтборЗапроса = стрРезультатаNET.ОтборЗапроса;
Если СОМ_Подключение = Неопределено Тогда
СОМ_Подключение = СОГ_СоединениеБД.УстановитьCOM_Соединение(ПараметрыПодключения, ТаблицаЛогов, Отказ, Ложь, , Ложь);
Если Отказ = Истина Тогда Возврат; КонецЕсли;
стрРезультатаNET.СОМ_Подключение = СОМ_Подключение;
Иначе
//Проверить связь, и переподключиться...
стрПараметрыПодключения = СОГ_СоединениеБД.ПолучитьСтруктуруПодключения();
ЗаполнитьЗначенияСвойств(стрПараметрыПодключения,ПараметрыПодключения);
стрПараметрыПодключения.Вставить("СОМ_Подключение",СОМ_Подключение);
СОМ_Подключение = СОГ_СоединениеБД.ВыполнитьПодключениеСоединения(стрПараметрыПодключения, ТаблицаЛогов, Отказ);
Если Отказ = Истина Тогда Возврат; КонецЕсли;
стрРезультатаNET.СОМ_Подключение = СОМ_Подключение;
КонецЕсли;
//Абстрактный пример запроса по WEB сервису для 1С, т.е. База 1С к базе 1С.
//Обычно он вызывается из процедуры.
//Получить Информацию По Ссылке Для БД№1
//Get Information By Link For BD2 - GetInformationByLinkForBD2
ОтборЗапроса_ХЗ = Новый ХранилищеЗначения(ОтборЗапроса, Новый СжатиеДанных(9));
РезультатЗапроса = Неопределено;
COM_РезЗапроса = СОМ_Подключение.GetInformationByLinkForBD2(ОтборЗапроса_ХЗ, РезультатЗапроса);
Если СОГ_ДопФункции.ЭтоНеопределено(COM_РезЗапроса) = Истина Тогда
ТекстОшибки = НСтр("ru='Нет связи с удаленным ресурсом: %1'");
ТекстОшибки = СтрШаблон(ТекстОшибки, СокрЛП(ПараметрыПодключения.МестоположениеWSDL));
СОГ_ЛогОшибок.ДобавитьСообщениеВЛог(ТаблицаЛогов, ТекущаяДата(), ТекстОшибки, "", -12, Ложь, Отказ);
Возврат;
ИначеЕсли COM_РезЗапроса <> Истина Тогда
Возврат;
КонецЕсли;
Если СОГ_ДопФункции.ЭтоНеопределено(РезультатЗапроса) = Истина Тогда
Возврат;
КонецЕсли;
стрРезультат = РезультатЗапроса.Получить();
Если ТипЗнч(стрРезультат) = Тип("Структура") Тогда
стрРезультатаNET.РезультатаNET = стрРезультат;
КонецЕсли;
Тестирование проводилось:
Компонента протестирована на базе конфигурации Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.185.24), релиз 1С:Предприятие 8.3 (8.3.24.1586).
Вступайте в нашу телеграмм-группу Инфостарт
