Имя: Пароль:
1C
1С v8
Почему дублируется отправка?
0 prilforreal
 
09.10.17
11:05
Доброго времени суток! Настроил рассылку отчетов, через батник планировщиком запускаю обработку, но по какой то причине отчет отправляется 2 раза, код проверил, операции по одному разу вызываются, в планировщике тоже задание одно, помогите разобраться в чем дело. Либо может как то возможно ограничить выполнение процедуры одним разом?

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

Процедура ОтправитьБалансыВсемДилерамНажатие(Элемент)
    ОтправитьПисьма();
КонецПроцедуры


Процедура ПриОткрытии()
   ОтправитьПисьма();
   ЗавершитьРаботуСистемы();
   ПоддерживаемыеТипыВО = Новый Массив();
   ПоддерживаемыеТипыВО.Добавить("СканерШтрихкода");
   ОповещенияПриПодключении = Новый ОписаниеОповещения("ПодключитьОборудованиеЗавершение", ЭтаФорма);
   МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу(ОповещенияПриПодключении, ЭтаФорма, ПоддерживаемыеТипыВО);
КонецПроцедуры
1 spiller26
 
09.10.17
11:18
(1) Попробуй в код записать, какой нибудь признак, что отправилось. Как вариант пусть записывает файл только не перезатирал предыдущий, что отправил, в тексте укажи момент записи.
Потом смотри если батник отсылает дважды, то будет создано 2 файла-отчета, потом смотри батник.
Если система, то увидишь 1 файл, значит что-то в коде.
Ну и как вариант №3 почтовой сервер.
2 prilforreal
 
09.10.17
11:41
(1) Отправляет 2 одинаковых отчета, время получения одинаковое, в журнале планировщика 1 событие, батник 1 раз открывается,
Вот код батника
@chcp 1251
"F:\Program Files (x86)\1cv8\common\1cestart.exe" enterprise /F"G:\Bases2" /N"*****" /P"*****"  /Execute "G:\Bases2\dispatch\Rassilka.epf"
Кажется что-то в коде.. хотя, возможно ли что обработка дважды запускается если на одном терминале открыто несколько клиентов 1С?
3 spiller26
 
09.10.17
11:59
(2) Сделай проще, при отправке создай док типа Рассылка(Дата).txt , где Дата дата отправления.
И пусть при отправке проверяет файл, если нет такого то отправить, если есть то нет.
4 spiller26
 
09.10.17
12:04
Вообще по хорошему, мы делали отдельный РС для таких случаев, для проверки отправления отчетов.
Просто есть возможность, что в течении дня можно перезагрузить несколько раз систему и будет он у тебя выполняться столько раз, сколько перезагрузиться система
5 prilforreal
 
09.10.17
12:10
(4) При чем тут перезагрузка системы? Есть батник, который при открытии запускает 1С под учетной записью любого пользователя, в моем случае Автомат, и запускает обработку, по окончании исполнения обработки 1С закрывается, батник раз в сутки ночью запускаю планировщиком заданий windows
6 spiller26
 
09.10.17
12:12
(5) Моё дело предложить, ваше дело использовать или нет.
7 prilforreal
 
09.10.17
12:33
(6) Спасибо, буду пытаться)
8 prilforreal
 
09.10.17
14:56
(6) Нашел объект в котором ошибка, это процедура отправки из модуля обычного приложения, осталось в нем найти причину..

Процедура глОтправитьОтчетПоПочте(ТаблицаОтправки,Получатель,ТемаПисьма,Сообщения=1,ТелоПисьма="",ТипПисьма=0) Экспорт    
//    
//    если ТипЗначенияСтр(ТаблицаОтправки)="Таблица" Тогда
    Если ТипЗнч(ТаблицаОтправки)=Тип("ТабличныйДокумент") или ТипЗнч(ТаблицаОтправки)=Тип("ПолеТабличногоДокумента") тогда
//        ИмяФайла=КаталогПользователя()+"Отчет"+СтрЗаменить(СокрЛП(ТекущаяДата()),".","")+"_"+СтрЗаменить(СокрЛП(ТекущееВремя()),":","")+".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);
    Исключение
        Сообщить(Получатель.ЭлПочта);
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    УдалитьФайлы("file:G:\Bases2\Balance.htm");
    Сообщить(ТемаПисьма);
    Почта.Отключиться();

КонецПроцедуры
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший