Имя: Пароль:
1C
 
Ошибка в отработке регламентного задания
, ,
0 NIGHTHUNTER
 
23.06.22
10:07
Регламентное задание отрабатывать по документам должно раз, проставляя флаг булево в строки документа, что свидетельствует об исключении повторной рассылки, зацикливания.
Но почему то зацикливается. Я на простейшем тестовом примере проверил, и оставил, в работу. Я занимаюсь этим вопросом, зависло на переименовании синонима, решил спросить.
А так я сам занимаюсь. Спрашиваю, для получения полезных советов, рекомендаций.


//
&НаСервере
Процедура Отправить()
    УстановитьПРивилегированныйРежим(Истина);
    МассивКому     = Новый Массив;
    МассивВложений = Новый Массив;
    ТекстПисьма    = "";
    ТемаПисьма        = "";
    //
    Запрос         = Новый Запрос;
    Запрос.Текст   = "
        |ВЫБРАТЬ
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка КАК Ссылка,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка.Номер КАК Номер,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка.Дата КАК Дата,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка.Менеджер КАК Менеджер,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.НомерСтроки КАК НомерСтроки,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления КАК ДатаПоступления,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Сертификат КАК Сертификат,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ПаспортИзделия КАК ПаспортИзделия,
        |    РАЗНОСТЬДАТ(ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления, &ТекДата, ДЕНЬ) КАК РазностьДат
        |ИЗ
        |    Документ.ХХХ_ПредварительныйЗаказПоставщику.ОтметкиСклада КАК ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада
        |ГДЕ
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Сертификат = ЛОЖЬ
        |    И ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ПаспортИзделия = ЛОЖЬ
        |    И ДОБАВИТЬКДАТЕ(ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления, ДЕНЬ, 2) < &ТекДата
        |    И ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления >= &ДатаНачала
        |    И НЕ ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.УведомлениеОтправлено = ИСТИНА
        |
        |УПОРЯДОЧИТЬ ПО
        |    РазностьДат";                                                                            
    Запрос.УстановитьПараметр("ТекДата",    ТекущаяДата());
    Запрос.УстановитьПараметр("ДатаНачала", Дата("20220621"));
    Рез = Запрос.Выполнить();
    //
    НомерПредыдущегоДокумента = Неопределено;
    Если Не Рез.Пустой() Тогда
        Выборка = Рез.Выбрать();
        Пока Выборка.Следующий() Цикл
            //
            Если НомерПредыдущегоДокумента = Неопределено ИЛИ Не Выборка.Номер = НомерПредыдущегоДокумента Тогда
                Сообщить("Отправляется " + Выборка.Номер);
                //
                ТемаПисьма  = "О предоставлении сертификата";
                ТекстПисьма = "Срочно предоставитьпаспорт изделия № " + Выборка.Номер + " от " + ФОРМАТ(Выборка.Дата, "ДЛФ=DD") + ". " + Символы.ПС;
                //
                // Ответственный менеджер
                ЕАдресМенеджер = ЕАдресПользователя(Выборка.Менеджер);    
                НашПолучатель  = Новый Структура;
                НашПолучатель.Вставить("Адрес",         ЕАдресМенеджер);                                            
                НашПолучатель.Вставить("Представление", ЕАдресМенеджер);
                Если ЗначениеЗаполнено(НашПолучатель.Адрес) Тогда
                    МассивКому.Добавить(НашПолучатель);
                КонецЕсли;
                //
                // Контролирующее лицо
                КонтролирующееЛицо  = Справочники.Пользователи.НайтиПоНаименованию("Пользователь 1", 1);
                ЕКонтролирующееЛицо = ЕАдресПользователя(КонтролирующееЛицо);    
                НашПолучатель       = Новый Структура;
                НашПолучатель.Вставить("Адрес",         ЕКонтролирующееЛицо);                                            
                НашПолучатель.Вставить("Представление", ЕКонтролирующееЛицо);
                Если ЗначениеЗаполнено(НашПолучатель.Адрес) Тогда
                    МассивКому.Добавить(НашПолучатель);
                КонецЕсли;
                //
                Если МассивКому.Количество() > 0 Тогда
                    //  отправка писсьма
                    УчетнаяЗаписьПочты = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
                    ПараметрыОтправки  = Новый Структура;
                    ПараметрыОтправки.Вставить("Важность",           ВажностьИнтернетПочтовогоСообщения.Обычная);
                    ПараметрыОтправки.Вставить("Кодировка",          "UTF-8");
                    ПараметрыОтправки.Вставить("Кому",               МассивКому);
                    ПараметрыОтправки.Вставить("Вложения",           МассивВложений);
                    ПараметрыОтправки.Вставить("ОбрабатыватьТексты", Ложь);
                    ПараметрыОтправки.Вставить("УдалитьСоединение",  Истина);
                    ПараметрыОтправки.Вставить("ПротоколПочты",      "IMAP");
                    ПараметрыОтправки.Вставить("ТипТекста",          Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст);
                    ПараметрыОтправки.Вставить("Тема",               ТемаПисьма);
                    ПараметрыОтправки.Вставить("Тело",               ТекстПисьма);
                    РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗаписьПочты, ПараметрыОтправки);
                КонецЕсли;
                //
                НомерПредыдущегоДокумента = Выборка.Номер;
            КонецЕсли;
            //
            ДокПредварительныйЗаказПоставщику       = Выборка.Ссылка.ПолучитьОбъект();
            НайденнаяСтрока                       = ДокПредварительныйЗаказПоставщику.ОтметкиСклада.Найти(Выборка.НомерСтроки, "НомерСтроки");
            НайденнаяСтрока.УведомлениеОтправлено = Истина;            
            ДокПредварительныйЗаказПоставщику.Записать();
        КонецЦикла;        
    КонецЕсли;
    //
КонецПроцедуры    
//
1 Деспот_1С
 
23.06.22
10:15
Заремируй эти строки кода и посмотри уйдет ли зацикливание:
ДокПредварительныйЗаказПоставщику       = Выборка.Ссылка.ПолучитьОбъект();
            НайденнаяСтрока                       = ДокПредварительныйЗаказПоставщику.ОтметкиСклада.Найти(Выборка.НомерСтроки, "НомерСтроки");
            НайденнаяСтрока.УведомлениеОтправлено = Истина;            
            ДокПредварительныйЗаказПоставщику.Записать();


Если не получиться тогда в запросе сделай вначале эту строчку и посмотри пройдет ли зацикливание:
|ВЫБРАТЬ ПЕРВЫЕ 1
2 NIGHTHUNTER
 
23.06.22
10:27
(1) Вышло так.
Я стал тестировать обработку как внешнюю с формы.
Смотрю, идет список документов. Я у обработки поменял синонимум, но новый номер.
И сейчас ничего не меняя, запускаю, она не выполняется. То есть выполнилось по тому что было, как и предполагалось и все.
Я не понимаю, что это означает (. Мне писали, что приходят какие то дикие рассылки.
Я хотел устранять.
Может что с идентификатором НомерСтроки7 И нужно как то иначе?
Сейчас я не вижу ошибку, и не понимаю что отлаживать.

(1) Если я это закомментирую, это и будет зацикливание же тогда. Благодаря этому должно срабатывать только раз.
3 Деспот_1С
 
23.06.22
10:31
(2) "Если я это закомментирую, это и будет зацикливание же тогда."

Сделайте как я сказал и чтобы не было рассылки закомментируйте эту строку:
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗаписьПочты, ПараметрыОтправки);
4 NIGHTHUNTER
 
23.06.22
10:49
(3) Дело в том что пока нет выборки на которой проверять, она куда то делась . И почему то.
Появились галки что вы просили закомментировать в (1) .
5 NIGHTHUNTER
 
23.06.22
10:51
(3) Я вчера сделал тестирование, отрабатывает раз и все.
Сейчас выявилось, что, что то циклится. Я стал отлавливать, как ошибка исчезла.
6 lodger
 
23.06.22
10:58
(0)
а) научись обходить результаты запроса по группировкам (внешний цикл по ссылкам, внутренний по тч).
б) зачем писать одному менеджеру 10 писем из одной тч по одной ссылке, если можно написать одно с перечнем нужных документов?
7 Деспот_1С
 
23.06.22
11:02
(5) Дело может быть в конфликте блокировок, посмотрите в журнале регистраций, что происходит после запуска обработки
8 NIGHTHUNTER
 
23.06.22
12:05
(6) Да согласен, нужно научиться обходить результаты запросов по группировкам.
(6) Так в моем случае, идет обработка по номеру. И так же по одному документу идет одно письмо, а не больше чем одно. Ведь так?
9 NIGHTHUNTER
 
23.06.22
12:23
(6) Если не трудно, можете подсказать , как это было бы?
Учитывая что выборка идет по документу.
Я и сам в принципе представляю.
Но что то  у меня с мотивацией (
А так, если вам не трудно бы. я и увидел бы, и применил, и тд.
10 NIGHTHUNTER
 
23.06.22
12:38
Считаю что и (0), работает . А то что мне высылали немыслемые примеры, и потом внезапно, сам видел пропала выборка. Я не знаю как объяснить.
11 lodger
 
23.06.22
12:40
(9) у меня голова болит, устал наверное. пойду поем.
12 NIGHTHUNTER
 
23.06.22
12:43
Кажется я немного понимаю от чего там ошибки могли быть, я поправил сейчас так.

    //
    Запрос         = Новый Запрос;
    Запрос.Текст   = "
        |ВЫБРАТЬ
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка                                          КАК Ссылка,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка.Номер                                  КАК Номер,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка.Дата                                  КАК Дата,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Ссылка.Менеджер                              КАК Менеджер,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.НомерСтроки                                  КАК НомерСтроки,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления                              КАК ДатаПоступления,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Сертификат                                      КАК Сертификат,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ПаспортИзделия                                  КАК ПаспортИзделия,
        |    РАЗНОСТЬДАТ(ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления, &ТекДата, ДЕНЬ) КАК РазностьДат,
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.УведомлениеОтправлено                        КАК УведомлениеОтправлено
        |ИЗ
        |    Документ.ХХХ_ПредварительныйЗаказПоставщику.ОтметкиСклада КАК ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада
        |ГДЕ
        |    ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.Сертификат = ЛОЖЬ
        |    И ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ПаспортИзделия = ЛОЖЬ
        |    И ДОБАВИТЬКДАТЕ(ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления, ДЕНЬ, 2) < &ТекДата
        |    И ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.ДатаПоступления >= &ДатаНачала
        |    И НЕ ХХХ_ПредварительныйЗаказПоставщикуОтметкиСклада.УведомлениеОтправлено = ИСТИНА
        |
        |УПОРЯДОЧИТЬ ПО
        |    Номер,
        |    РазностьДат";
13 NIGHTHUNTER
 
23.06.22
12:44
Если вот этого не сделать, то и алгоритм мой не будет работать.

     |УПОРЯДОЧИТЬ ПО
        |    Номер,
        |    РазностьДат";



Он же подразумевает идущие по по порядку номера. А если в разброс, как и было.
В рабочей то больше всего. Вот там и начало все летать.

Установил сортировку по номеру.
14 Мультук
 
гуру
23.06.22
12:50
(13)

И так пойдет.
Потом, внезапно, придет откровение, что номера могут повторяться (например каждый год).
А ссылки нет, но ...
15 NIGHTHUNTER
 
23.06.22
12:55
(14) Но а подсказать как правильно не желаете? Так то да в (6), правильно говорят .
16 NIGHTHUNTER
 
24.06.22
13:52
(14) Снова что то сильно глючи. Я не пойму уже что, и как отловить. Как там по группировкам будет правильно?
Понимаю, что некоторые вещи мне не очевидны. И я не предвижу ни ошибок, ни возможных подзадач. Просто не знаю о них (((.
17 NIGHTHUNTER
 
24.06.22
14:52
Похоже проблема была из за массива  

МассивКому     = Новый Массив;

после этой строки

      Пока Выборка.Следующий() Цикл

сделал МассивКому.Очистить();