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

```1c
    //Функция отправляет документ по электронной почте, с случае обрыва интернета
    Функция ОтправитьДокументПоЭлектроннойПочте(ТабДокумент, Документ) Экспорт
    ТабДокумент.Автомасштаб = Истина;

    Если ТипЗнч(Документ) = Тип("ДокументОбъект.ПриемНаРаботуВОрганизацию") Тогда
    СтрДокНомер = "Документ №" + Документ.Номер;
    СтрДокНомерДата = СтрДокНомер + " от " + Формат(Документ.Дата,"ДФ=dd.MM.yyyy");
    СообщениеТекст = "Документ <Прием На Работу В Организацию> был проведен." + Символы.ПС;
    КонецЕсли;

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

    //формируем текст сообщения
    СообщениеТекст = СообщениеТекст + Символы.ПС;
    СообщениеТекст = СообщениеТекст + "Дата и время документа: " + Документ.Дата + Символы.ПС;
    СообщениеТекст = СообщениеТекст + "Номер документа: "+ Документ.Номер + Символы.ПС;
    СообщениеТекст = СообщениеТекст + Символы.ПС;
    СообщениеТекст = СообщениеТекст + "Сотрудник: " + Документ.Сотрудник + Символы.ПС;
    СообщениеТекст = СообщениеТекст + "Договор контрагента: " + Документ.ДоговорКонтрагента + Символы.ПС;
    СообщениеТекст = СообщениеТекст + "Провел: " + ПараметрыСеанса.ТекущийПользователь + Символы.ПС;
    СообщениеТекст = СообщениеТекст + Символы.ПС;

    //новый объект ИнтернетПочта и профиль
    Почта = Новый ИнтернетПочта;
    Профиль = СоздатьПрофиль();
    Попытка
    Почта.Подключиться(Профиль);
    Исключение
    //если не получилось подключиться (нет интернета)
    Сообщить(" - Ошибка при подключении" + ОписаниеОшибки());

    //добавляем строку в наш регистр сведений
    ДокументыНаПочту = РегистрыСведений.ДокументыНаПочту.СоздатьНаборЗаписей();
    НоваяЗаписьДокументы = ДокументыНаПочту.Добавить();
    НоваяЗаписьДокументы.ИмяФайла = ИмяФайла;
    НоваяЗаписьДокументы.СообщениеТекст = СообщениеТекст;
    НоваяЗаписьДокументы.ДокНомерДата = СтрДокНомерДата;
    НоваяЗаписьДокументы.Период = ТекущаяДата();
    ДокументыНаПочту.Записать(Ложь);

    Возврат Неопределено;
    КонецПопытки;

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

    Сообщение.Получатели.Добавить("Адрес");

    Попытка
    Почта.Послать(Сообщение);
    Сообщить("Проведенный документ отправлен на электронную почту!");
    Исключение
    Сообщить(" - Ошибка при передаче" + ОписаниеОшибки());
    Сообщить("Отключились от почты - " + ТекущаяДата());
    КонецПопытки;
    Почта.Отключиться();

    //возвращаем имя файла, чтобы его потом удалить вне этой процедуры
    Возврат ИмяФайла;
    КонецФункции

    Функция СоздатьПрофиль()
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    ПрофильАдресСервераSMTP = "СервераSMTP";
    Профиль.ПортSMTP = 2525;
    Профиль.АдресСервераPOP3 = "АдресСервераPOP3";
    Профиль.ПортPOP3 = 110;
    Профиль.Пароль = "password";
    Профиль.ПарольSMTP = "password";
    Профиль.Пользователь = "Пользователь";
    Профиль.ПользовательSMTP = "ПользовательSMTP";
    Профиль.ВремяОжидания = 50;
    Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;

    Возврат Профиль;
    КонецФункции

    //функция вызывается при каждом старте системы, если есть записи о неотправленных документах

    Функция ОтправитьПослеОбрыва(Результат) Экспорт
    Почта = Новый ИнтернетПочта;
    Профиль = СоздатьПрофиль();

    //создаем новую ТЗ
    ВременныеФайлы = Новый ТаблицаЗначений;
    ВременныеФайлы.Колонки.Добавить("ИмяФайла");

    Для каждого СтрРегСв Из Результат Цикл
    ИмяФайла = СтрРегСв.ИмяФайла;
    СтрДокНомер = Лев(СтрРегСв.ДокНомерДата, СтрДлина(СтрРегСв.ДокНомерДата) - 27);
    СтрДокНомерДата = СтрРегСв.ДокНомерДата;

    Попытка
    Почта.Подключиться(Профиль);
    Исключение
    Возврат Неопределено;
    КонецПопытки;

    СообщениеТекст = СтрРегСв.СообщениеТекст;

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

    Сообщение.Получатели.Добавить("Получатели");

    Попытка
    Почта.Послать(Сообщение);
    Сообщить("Проведенный документ отправлен на электронную почту!");
    Исключение
    Сообщить(" - Ошибка при передаче" + ОписаниеОшибки());
    Сообщить("Отключились от почты - " + ТекущаяДата());
    Возврат Неопределено;
    КонецПопытки;

    //удаление записи с регистра сведений
    ДокиРегСвд = РегистрыСведений.ДокументыНаПочту.СоздатьНаборЗаписей();
    ДокиРегСвд.Отбор.ИмяФайла.Установить(ИмяФайла);
    ДокиРегСвд.Прочитать();

    Для Каждого Док Из ДокиРегСвд Цикл
    ДокиРегСвд.Удалить(Док);
    КонецЦикла;
    ДокиРегСвд.Записать();

    НовВрФайл = ВременныеФайлы.Добавить();
    НовВрФайл.ИмяФайла = ИмяФайла;
    КонецЦикла;

    Почта.Отключиться();

    Возврат ВременныеФайлы;
    КонецФункции
```

3. В процедуру ПередНачаломРаботыСистемы() модуль обычного приложения добавил код:

```1c
    Процедура ПередНачаломРаботыСистемы(Отказ)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ДокументыНаПочту.ИмяФайла,
    | ДокументыНаПочту.СообщениеТекст,
    | ДокументыНаПочту.ДокНомерДата
    |ИЗ
    | РегистрСведений.ДокументыНаПочту КАК ДокументыНаПочту";
    Результат = Запрос.Выполнить().Выгрузить();

    ВременныеФайлы = общМодульДокПочта.ОтправитьПослеОбрыва(Результат);

    Если ВременныеФайлы <> Неопределено Тогда
    Для Каждого ВрФайл Из ВременныеФайлы Цикл
    Попытка
    УдалитьФайлы(ВрФайл.ИмяФайла);
    Исключение
    КонецПопытки;
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
```

4. В модуле документа добавил переменую

```1c
    Перем ОтправлятьНаПочту;
```

Что бы документ не отправлялся каждый раз, если он не был даже изменен вставил это в Процедура ПередЗаписью():

```1c
    Если ЭтотОбъект.Модифицированность() Тогда
    ОтправлятьНаПочту = Истина;
    Иначе
    ОтправлятьНаПочту = Ложь;
    КонецЕсли;
```

В Процедура ОбработкаПроведения() вставил это после Если Не Отказ Тогда:

```1c
    Если Проведен И ОтправлятьНаПочту Тогда
    //формируем печатную форму документа
    ТабДокумент = Печать();
    //передаем ее в функцию, где отправим на почту
    ВременныйФайл = ДокПочта.ОтправитьДокументПоЭлектроннойПочте(ТабДокумент, ЭтотОбъект);
    Попытка
    УдалитьФайлы(ВременныйФайл);
    Исключение
    КонецПопытки;
    КонецЕсли;
```

Так вот документ проводится, но не происходит ничего, не ошибку о том, что почта не отправилась, ни письмо не доходит. Кто может, подскажите в каком направлении копать...
---
1 Вариант: создается регистр сведений с одним измерением - документ. Подписка на событие "при проведении" пишет туда запись об этом документе.
Внешняя обработка по расписанию проверяет это регистр, создает и отправляет письмо , а запись в регистре стирает.
Все типовые объекты не тронуты, конфигурация обновляется легко, все довольны.

2. Внешняя обработка шерстит все приказы по расписанию и отправляет письма, на те приказы, по которым письма уже отправлены делает запись в специальный внешний файл, например текстовой или прямо в себя (в хранилище настроек).

Конфигурация остается вообще под замком, все просто счастливы.

А ваш вариант реализации никуда не годится: влезли в типовые модули, создали лишние реквизиты, лишнюю запись в базу сделали , вообщем вы поняли...
---
как вариант.
у меня все записано в регл. заданиях.

вот суть кода:

```1c
    Попытка
    Письмо = Новый COMОбъект("CDO.Message");
    Исключение
    ЗаписьЖурналаРегистрации("ПочтоваяПодсистема.Ошибка", УровеньЖурналаРегистрации.Ошибка,,,ОписаниеОшибки(),);
    Возврат;
    КонецПопытки;

    Письмо.to = СтруктураПолучателя.Кому;
    Письмо.from = СтруктураПолучателя.Отправитель;
    Письмо.cc = СтруктураПолучателя.Копия;
    Письмо.bcc = СтруктураПолучателя.СкрКопия;
    Письмо.BodyPart.Charset = "windows-1251";

    Если ЕстьВложения Тогда
    //МассивВложения = МассивИзСтроки(СтруктураПолучателя.Вложения,";");
    //Для Каждого Элемент Из МассивВложения Цикл
    //Письмо.AddAttachment(Элемент);
    //КонецЦикла;
    КонецЕсли;

    Письмо.Subject = СтруктураПолучателя.Тема;
    Письмо.TextBody = СтруктураПолучателя.Текст;

    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "****.***.kz";
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = ";
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 25;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
    Письмо.Configuration.Fields.Update();
    Попытка
    Письмо.Send();
    Исключение
    //ОписаниеОшибки()
    КонецПопытки;
```

вот про саму технологию:
https://infostart.ru/public/16585/
---
В режиме отладки весь код выполняется?
---
Да, весь код выполняется без ошибок.
---
если код весь выполняется то трабла скорее всего в smtp сервере
1с не очень хорошо работает с exchange серверами
у меня отправка начала идти только после того как на exchange сервере сделали добавление адреса с которого отправляю в исключения и отключили аунтификацию

вот текст обработки

```1c
    Функция ОтправитьНаЭлектроннуюПочту(Получатели, Тема, Текст, ДополнительныеПараметры = Неопределено, ИмяОтправителя = "1с-Зарплата и Управление Персоналом") Экспорт

    Если ДополнительныеПараметры = Неопределено Тогда
    ДополнительныеПараметры = Новый Структура;
    КонецЕсли;

    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
    Профиль.АдресСервераSMTP = "СЕРВЕР";
    Профиль.ПортSMTP = 25;
    Профиль.Пользователь = "Адрес@Домен";
    Профиль.ПользовательSMTP = "Адрес@Домен";

    ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
    ПочтовоеСообщение.Тема = Тема;
    ПочтовоеСообщение.Отправитель.Адрес = "Адрес@Домен";
    ПочтовоеСообщение.Отправитель.ОтображаемоеИмя = ИмяОтправителя;
    ПочтовоеСообщение.ИмяОтправителя = ИмяОтправителя;

    ПолучателиТип = ТипЗнч(Получатели);
    Если ТипЗнч(Получатели) = Тип("Массив") Тогда
    Для Каждого Адрес Из Получатели Цикл
    ПочтовоеСообщение.Получатели.Добавить(СокрЛП(Адрес));
    КонецЦикла;
    ИначеЕсли ПолучателиТип = Тип("Строка") Тогда
    ПочтовоеСообщение.Получатели.Добавить(СокрЛП(Получатели));
    Иначе
    Возврат Ложь;
    КонецЕсли;
    //
    //
    Если ДополнительныеПараметры.Свойство("Вложения") Тогда
    НомерФайла = 1;
    Для Каждого Файл из ДополнительныеПараметры.Вложения Цикл
    Если ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
    ПочтовоеСообщение.Вложения.Добавить(Файл, УниверсальныеМеханизмы.ПолучитьИмяФайлаИзПолногоПути(Файл)); //Файл, Наименование
    ИначеЕсли ТипЗнч(Файл) = Тип("Строка") Тогда
    ПочтовоеСообщение.Вложения.Добавить(Новый ДвоичныеДанные(Файл), УниверсальныеМеханизмы.ПолучитьИмяФайлаИзПолногоПути(Файл)); //Файл, Наименование
    Иначе
    Вложение = ПочтовоеСообщение.Вложения.Добавить(Файл.ДвоичныеДанные, ?(Файл.Свойство("НаименованиеВложения"), Файл.НаименованиеВложения, Неопределено));
    Файл.Свойство("CID" , Вложение.Идентификатор);
    Файл.Свойство("ТипСодержимого", Вложение.ТипСодержимого);
    КонецЕсли;
    НомерФайла = НомерФайла + 1;
    КонецЦикла;
    КонецЕсли;

    ПочтовоеСообщение.Тексты.Добавить(Текст, ?(Найти(Текст, "html") > 0, ТипТекстаПочтовогоСообщения.HTML, ТипТекстаПочтовогоСообщения.ПростойТекст));
    ПочтовоеСообщение.ОбработатьТексты();

    Попытка
    Почта = Новый ИнтернетПочта;
    Почта.Подключиться(Профиль);
    Почта.Послать(ПочтовоеСообщение);
    Почта.Отключиться();
    Возврат Истина;
    Исключение
    Комментарий = "Ошибка при отправке сообщения на электронную почту:" + Символы.ПС + ОписаниеОшибки();
    ЗаписьЖурналаРегистрации("Ошибка выполнения", УровеньЖурналаРегистрации.Ошибка, , , Комментарий);
    ОбщегоНазначения.СообщитьОбОшибке(Комментарий);
    КонецПопытки;

    Возврат Ложь;

    КонецФункции
```
---
Все можно было реализовать с помощью подписки на событие, 1 регистра сведений и внешней обработки. Типовые объекты можно было не трогать.

А для тех, кто не может снимать конфу с поддержки можно все реализовать с помощью внешней обработки вообще не трогая конфигурацию.
---
А можно немного подробнее, как это реализовать?
---
А можно немного подробнее, как это реализовать?
---
1 Вариант: создается регистр сведений с одним измерением - документ. Подписка на событие "при проведении" пишет туда запись об этом документе.
Внешняя обработка по расписанию проверяет это регистр, создает и отправляет письмо , а запись в регистре стирает.
Все типовые объекты не тронуты, конфигурация обновляется легко, все довольны.

2. Внешняя обработка шерстит все приказы по расписанию и отправляет письма, на те приказы, по которым письма уже отправлены делает запись в специальный внешний файл, например текстовой или прямо в себя (в хранилище настроек).

Конфигурация остается вообще под замком, все просто счастливы.

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