Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
03 дек 2022, 16:58

Некорректно работают фоновые задания.

Автор sham4ick, 29 июл 2022, 20:41

0 Пользователей и 1 гость просматривают эту тему.

sham4ick

Снова прошу вашей помощи! Логика такая. У документа есть статусы поставок. Они автоматический меняются. Если до даты поставок осталось меньше суток тогда документ получает статус "Истекает", когда Дата поставки вышла статус "Просрочен". Если на основании этого документа было сделано поступление тогда статус "Исполнен". Статусы без проблем меняются, но также хочу чтобы приходили уведомления. Но сейчас уведомления приходят только когда статус "Истекает" , но нет уведомления когда документ "Просрочен". В чем может быть проблема?

123.JPG

Код в общем модуле:

Функция ПолучитьИнтервалЗапускаФоновыхЗаданий() Экспорт
Возврат Константы.ПериодичностьМониторинга.Получить();
КонецФункции                                             

Процедура ПроизвестиФоновуюПроверкуПросрочен(Адрес) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПоставщику.Ссылка КАК Ссылка,
| ЗаказПоставщику.СтатусПоставки КАК СтатусПоставки,
| ЗаказПоставщику.ДатаПоступления КАК ДатаПоступления
|ИЗ
| Документ.ЗаказПоставщику КАК ЗаказПоставщику
|ГДЕ
| ЗаказПоставщику.СтатусПоставки = ЗНАЧЕНИЕ(Перечисление.СтатусыПоставки.Истекает)
| И ЗаказПоставщику.ДатаПоступления < &ТекДата";
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); 
ТабЗнач = Новый ТаблицаЗначений;
ТабЗнач.Колонки.Добавить("Ссылка");
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДокОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
ДокОбъект.СтатусПоставки=Перечисления.СтатусыПоставки.Просрочен;
ДокОбъект.Записать();
НвСтр = ТабЗнач.Добавить();
НвСтр.Ссылка = ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;                                       
ПоместитьВоВременноеХранилище(ТабЗнач,Адрес);
КонецПроцедуры



Процедура ПроизвестиФоновуюПроверкуИстекает(Адрес) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПоставщику.Ссылка КАК Ссылка,
| ЗаказПоставщику.СтатусПоставки КАК СтатусПоставки,
| ЗаказПоставщику.ДатаПоступления КАК ДатаПоступления
|ИЗ
| Документ.ЗаказПоставщику КАК ЗаказПоставщику
|ГДЕ
| ЗаказПоставщику.СтатусПоставки = ЗНАЧЕНИЕ(Перечисление.СтатусыПоставки.Запланирован)
| И ЗаказПоставщику.ДатаПоступления < &ТекДата";
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата()+86400);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Ссылка");
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДокОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
ДокОбъект.СтатусПоставки=Перечисления.СтатусыПоставки.Истекает;
ДокОбъект.Записать(); 
НовСтр = ТЗ.Добавить();
НовСтр.Ссылка = ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
ПоместитьВоВременноеХранилище(ТЗ,Адрес);
КонецПроцедуры

Код в Документ.ФормаСписка

&НаКлиенте
Процедура ОбновитьСписок(Команда)
Элементы.Список.Обновить();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Интервал = Монитор.ПолучитьИнтервалЗапускаФоновыхЗаданий();
Если Интервал <> 0 Тогда
Попытка
ПодключитьОбработчикОжидания("ОбработатьОжиданиеПросрочен", Интервал, Ложь); 
ПодключитьОбработчикОжидания("ОбработатьОжиданиеИстекает", Интервал, Ложь);
Исключение 
Сообщить("Интервал мониторинга не заднан");
КонецПопытки;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьОжиданиеПросрочен()
ОбработатьОжиданиеНаСервереПросрочен();
ПолучитьДанныеНаСервереПросрочен(АдресВХранилищеП);
Для Каждого Элем из ТЗ_Просрочка Цикл
ДопПараметр = Новый Структура("Ключ",Элем.Ссылка);
ПоказатьОповещениеПользователя("Заказ Поставщику №" + ПолучитьНомерДокумента(Элем.Ссылка),ПолучитьНавигационнуюСсылку(Элем.Ссылка),"Дата поставки просрочена!",БиблиотекаКартинок.Документ,СтатусОповещенияПользователя.Важное);
КонецЦикла;
ТЗ_Просрочка.Очистить();
Элементы.Список.Обновить();
КонецПроцедуры 

&НаКлиенте
Процедура ОбработатьОжиданиеИстекает()
ОбработатьОжиданиеНаСервереИстекает();
ПолучитьДанныеНаСервереИстекает(АдресВХранилищеИ);
Для Каждого Эл из ТЗ_Истекает Цикл
ДопПараметр = Новый Структура("Ключ",Эл.Ссылка);
ПоказатьОповещениеПользователя("Заказ Поставщику №" + ПолучитьНомерДокумента(Эл.Ссылка),ПолучитьНавигационнуюСсылку(Эл.Ссылка),"Дата поставки истекает!",БиблиотекаКартинок.Документ,СтатусОповещенияПользователя.Важное);
КонецЦикла;
ТЗ_Истекает.Очистить();
Элементы.Список.Обновить();
КонецПроцедуры

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

 &НаСервере
Процедура ОбработатьОжиданиеНаСервереПросрочен()
АдресВХранилищеП = ПоместитьВоВременноеХранилище(Неопределено);
пПараметры = Новый Массив;
пПараметры.Добавить(АдресВХранилищеП);
ФоновоеЗадание=ФоновыеЗадания.Выполнить("Монитор.ПроизвестиФоновуюПроверкуПросрочен",пПараметры);
КонецПроцедуры 

 &НаСервере
Процедура ОбработатьОжиданиеНаСервереИстекает()
АдресВХранилищеИ = ПоместитьВоВременноеХранилище(Неопределено);
иПараметры = Новый Массив;
иПараметры.Добавить(АдресВХранилищеИ);
ФоновоеЗадание=ФоновыеЗадания.Выполнить("Монитор.ПроизвестиФоновуюПроверкуИстекает",иПараметры);
 КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ОтключитьОбработчикОжидания("ОбработатьОжидание");
КонецПроцедуры

&НаСервере
Процедура ПолучитьДанныеНаСервереИстекает(АдресВХранилищеИ)
ТЗ = ПолучитьИзВременногоХранилища(АдресВХранилищеИ);   
Если ТЗ <> Неопределено Тогда
ТЗ_Истекает.Очистить();
Если ТЗ.Количество()<>0 Тогда
Для каждого Эл Из ТЗ Цикл   
НовСтр = ТЗ_Истекает.Добавить();
НовСтр.Ссылка=Эл.Ссылка;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры 

Процедура ПолучитьДанныеНаСервереПросрочен(АдресВХранилищеП)
ТабЗнач = ПолучитьИзВременногоХранилища(АдресВХранилищеП);   
Если ТабЗнач <> Неопределено Тогда
ТЗ_Просрочка.Очистить();
Если ТабЗнач.Количество()<>0 Тогда
Для каждого Элем Из ТабЗнач Цикл   
НвСтр = ТЗ_Просрочка.Добавить();
НвСтр.Ссылка=Элем.Ссылка;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры



LexaK

sham4ick,
ЦитироватьНо сейчас уведомления приходят только когда статус "Истекает" , но нет уведомления когда документ "Просрочен"
так самое простое, найдите то место/код который формирует уведомления по статусу "Истекает" и там же добавьте условие для формирование и по статусу "Просрочен", в том коде что вы привели, формирования уведомлений нет, скорее всего этот код или модуле документа или в какой нибудь из подписок.
Ищите. 
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск