Имя: Пароль:
1C
1С v8
Некорректная привязка файла
,
0 prilforreal
 
05.09.17
14:24
Доброго всем времени суток, настроил рассылку отчета, отправляется всем контрагентам, но иногда процедура путает файлы и отправляет контрагенту письмо с файлом предназначенным другому человеку, будьте добры, помогите разобраться в чем дело.

    Если ТипЗнч(ТаблицаОтправки)=Тип("ТабличныйДокумент") или ТипЗнч(ТаблицаОтправки)=Тип("ПолеТабличногоДокумента") тогда
//        ИмяФайла=КаталогПользователя()+"Отчет"+СтрЗаменить(СокрЛП(ТекущаяДата()),".","")+"_"+СтрЗаменить(СокрЛП(ТекущееВремя()),":","")+".xls";
        ИмяФайла=КаталогВременныхФайлов()+"Отчет"+Формат(ТекущаяДата(),"ДФ=""ддммгггг'_'ЧЧммсс""")+".xls";
//        ТаблицаОтправки.Записать(ИмяФайла,1);
        ТаблицаОтправки.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS);
    //иначеесли ТипЗначенияСтр(ТаблицаОтправки)="Строка" тогда
    ИначеЕсли ТипЗнч(ТаблицаОтправки)=Тип("Строка") тогда
//        поз=Найти(ТаблицаОтправки,";");
        поз=СтрНайти(ТаблицаОтправки,";");
        ИмяФайла=Новый Массив;//"";
        
        пока поз<>0 цикл
            тестфайла=Лев(ТаблицаОтправки,поз-1);
            фс=Новый Файл(тестфайла);
//            если фс.СуществуетФайл(тестфайла)=1 тогда
            Если фс.Существует() тогда
            //    если Пустоезначение(ИмяФайла)=0 тогда
            //        ИмяФайла=ИмяФайла+";";    
            //    конецесли;
            //    ИмяФайла=ИмяФайла+тестфайла;
                ИмяФайла.Добавить(фс);
            конецесли;
            ТаблицаОтправки=Сред(ТаблицаОтправки,поз+1);
            поз=Найти(ТаблицаОтправки,";");
        конеццикла;
//
        фс=Новый Файл(ТаблицаОтправки);
//        если фс.СуществуетФайл(ТаблицаОтправки)=1 тогда
        Если фс.Существует() тогда
            //если Пустоезначение(ИмяФайла)=0 тогда
            //    ИмяФайла=ИмяФайла+";";    
            //конецесли;
            //ИмяФайла=ИмяФайла+ТаблицаОтправки;
            ИмяФайла.Добавить(фс);
        конецесли;
    иначе
        ИмяФайла="";    
    конецесли;
//    
    АдресЭл=Константы.ЭлПочта.Получить();
    Профиль=Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP=АдресЭл.Сервер;
    Профиль.АдресСервераPOP3=АдресЭл.Сервер;
    Профиль.Таймаут=60;
    Профиль.ПортSMTP=?(НЕ ЗначениеЗаполнено(АдресЭл.Порт),"25",Строка(АдресЭл.Порт));
    Профиль.ПортPOP3=110;
    Профиль.ПользовательSMTP=АдресЭл.Логин;
    Профиль.ПарольSMTP=АдресЭл.Пароль;
    Профиль.Пользователь=АдресЭл.Логин;
    Профиль.Пароль=АдресЭл.Пароль;
    Профиль.АутентификацияSMTP=СпособSMTPАутентификации.Login;
    Сообщение=Новый ИнтернетПочтовоеСообщение;
    Сообщение.Отправитель=АдресЭл.АдресОтправителя;
    Сообщение.ИмяОтправителя=АдресЭл.Отправитель;
    Сообщение.Получатели.Добавить(СокрЛП(Получатель.ЭлПочта));
    Сообщение.Тема=ТемаПисьма;
    Если НЕ ЗначениеЗаполнено(ТелоПисьма) тогда
        Сообщение.Тексты.Добавить(ТемаПисьма,ТипТекстаПочтовогоСообщения.ПростойТекст);
    ИначеЕсли лев(ТелоПисьма,5)="file:" тогда
    //    ВК.ЗагрузитьИзФайла(СокрЛП(сред(ТелоПисьма,6)));
        ТекстСообщения="";
        ФайлТекстаСообщения=Новый ТекстовыйДокумент;
        ФайлТекстаСообщения.Прочитать(СокрЛП(сред(ТелоПисьма,6)));
        ТекстСообщения=ФайлТекстаСообщения.ПолучитьТекст();
        Сообщение.Тексты.Добавить(ТекстСообщения,ТипТекстаПочтовогоСообщения.HTML);
        
    Иначе
        Сообщение.Тексты.Добавить(ТелоПисьма,ТипТекстаПочтовогоСообщения.ПростойТекст);
    КонецЕсли;
    Если ТипЗНЧ(ИмяФайла)=Тип("Строка") и ЗначениеЗаполнено(ИмяФайла) тогда
        ФайлСообщения=Новый Файл(ИмяФайла);
        Сообщение.Вложения.Добавить(ИмяФайла,ФайлСообщения.Имя);
    ИначеЕсли ТипЗнч(ИмяФайла)=Тип("Массив") тогда
        Для каждого МЗнач из ИмяФайла Цикл
            Сообщение.Вложения.Добавить(ИмяФайла.ПолноеИмя,ИмяФайла.Имя);
        КонецЦикла;    
    КонецЕсли;    
    Почта=Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
    Исключение
        Сообщить("Ошибка отправки файла: "+ИмяФайла);
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Попытка
        //Почта.Послать(Сообщение,ОбработкаТекстаИнтернетПочтовогоСообщения.НеОбрабатывать,ПротоколИнтернетПочты.SMTP);
        СообщенияОтправки=Почта.Послать(Сообщение,ОбработкаТекстаИнтернетПочтовогоСообщения.НеОбрабатывать,ПротоколИнтернетПочты.SMTP);
    Исключение
        Сообщить(Получатель.ЭлПочта);
        Сообщить(ОписаниеОшибки());
    КонецПопытки;    
    Почта.Отключиться();
1 Fedor-1971
 
05.09.17
14:33
(0) проблема тут "Получатель.ЭлПочта" у тебя отсылается один или несколько файлов получателю, в приведённом куске кода определения "Собственно кому отправим письмо" нет. Значит проверяй мэйлы в справочнике на предмет "зарегистрирован мэйл не того получателя"
2 prilforreal
 
05.09.17
14:52
(1) Почтовые ящики в справочнике проверял в первую очередь, они соответствуют ящикам получателей, потому и решил что не те файлы пришиваются
3 Fedor-1971
 
05.09.17
14:59
(2) и какой алгоритм определения Что и Кому отправить? в коде этого то же нет - просто некие файлы привязываются к сообщению
4 prilforreal
 
05.09.17
15:43
(3) Получатель определяется при формировании отчета


Перем Запрос, ТекстЗапроса;
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    РасчетыОстатки.Контрагент,
                 |    РасчетыОстатки.Контрагент.ЭлПочта,
                 |    СУММА(РасчетыОстатки.БалансОстаток) КАК БалансКонОст
                 |ИЗ
                 |    РегистрНакопления.Расчеты.Остатки(
                 |            &НаДату,
                 |            Контрагент.ЭлПочта <> """"
                 |                И Контрагент.Наименование <> """") КАК РасчетыОстатки
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    РасчетыОстатки.Контрагент,
                 |    РасчетыОстатки.Контрагент.ЭлПочта";
    Запрос.УстановитьПараметр("НаДату",ТекущаяДата());
    Рез=Запрос.Выполнить().Выбрать();
    ВыбНачПериода=ДобавитьМесяц(ТекущаяДата(),-1);
    ВыбКонПериода=ТекущаяДата();
    Пока Рез.Следующий() Цикл
//        // Заполнение полей Контрагент  
//        если не((Пустоезначение(Запрос.БалансПриход)=1)и(Пустоезначение(Запрос.БалансРасход)=1)) тогда
        
            ВыбДилер=Рез.Контрагент;
            ТемаОтправки="Взаморасчеты по дилеру "+СокрЛП(ВыбДилер.Наименование)+" за период "+ПредставлениеПериода(ВыбНачПериода,ВыбКонПериода,"L=ru_RU")+". ";
            если Рез.БалансКонОст<0 тогда
                ТемаОтправки=ТемаОтправки+"Ваш долг "+Рез.БалансКонОст+ " руб.";
            иначе
                ТемаОтправки=ТемаОтправки+"Ваш баланс "+Рез.БалансКонОст+ " руб.";
            конецесли;
            Сформировать(0);        
            глОтправитьОтчетПоПочте(Таб,ВыбДилер,ТемаОтправки,0,"file:G:\Bases2\Balance.htm",2);
            Сообщить(ТемаОтправки);
5 dezss
 
05.09.17
15:54
А у тебя всегда файл для отправки формируется, нет ли ничего такого в Сформировать(0), когда файл просто не формируется и поэтому отправляется тот, который был сформирован ранее?
6 Fedor-1971
 
05.09.17
15:58
(3) Вот тут добавь удаление файла
            глОтправитьОтчетПоПочте(Таб,ВыбДилер,ТемаОтправки,0,"file:G:\Bases2\Balance.htm",2);

.... Удаляем сформированный файл ....

Сообщить(ТемаОтправки);

Или Сформировать(0) сделай функцией с возвратом Истина если файл таки сформирован
7 prilforreal
 
05.09.17
16:08
(5) Проверял, файлы формируются корректно, без сбоев.
8 dezss
 
05.09.17
16:10
(7) Сделай все таки как в (6) тебе написали. И в лог еще пиши о том, сформировался ли файл и что-нибудь из его содержимого.
9 prilforreal
 
05.09.17
16:37
(6) Подскажите будьте добры, как файл удалить
10 dezss
 
05.09.17
16:42
(9) УдалитьФайлы(<Путь>, <Маска>)
11 prilforreal
 
05.09.17
17:02
(10) пошел процесс, контрагентов много, отправка длится долго, завтра расскажу как прошло, спасибо!
12 prilforreal
 
06.09.17
11:59
(10) Все здорово, рассылает все туда, куда и следует, спасибо!)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn