За агент спасибо Роману С!
Перед применением агента изучите его. Возможно нужна доработка под вашу систему. Текущую версию агента удобно использовать как базу, чтобы оттолкнуться от нее и сделать все под себя.
//// // Задаём переменные KursObrazec (обязательно), остальные - VremyaObnovleniya, ProhodnoyBall, Perenaznacheniye - можно не трогать, но почитайте их описание - может они Вам будут полезны KursObrazec = ***==>>ID Назначенного курса-образца<<==***; VremyaObnovleniya = ''; // здесь указываем "and ($elem/start_learning_date <= date(2022-04-07T10:15:00) or $elem/start_learning_date = '')" , где в скобках - время обновления курса (или чуть позже), если хотим пропустить тех, кто начал курс после его обновления. Или оставляем '', если хотим сбросить статус для всех, независимо от времени начала изучения курса ProhodnoyBall = 'Проверяем'; // или ставим 'Игнорируем', если не нужно учитывать условие проверки Проходного балла Perenaznacheniye = 'Все'; // или ставим 'Только В процессе', если нужны только курсы В процессе //// docObrazec = OpenDoc(UrlFromDocID(OptInt(KursObrazec))); // Открываем документ Образца Назначенного электронного курса // Проверяем, включать ли только незаконченные курсы В процессе или Все (назначенные и В процессе) (параметр) if (StrContains (Perenaznacheniye, 'Только В процессе', true)) _query_stroka_zaprosa = "for $elem in active_learnings where $elem/course_id = " + docObrazec.TopElem.course_id + " and $elem/id != " + OptInt(KursObrazec) + VremyaObnovleniya + " and $elem/state_id=1 return $elem/id,score"; else _query_stroka_zaprosa = "for $elem in active_learnings where $elem/course_id = " + docObrazec.TopElem.course_id + " and $elem/id != " + OptInt(KursObrazec) + VremyaObnovleniya + " and MatchSome($elem/state_id,(0,1)) return $elem/id,score"; VseNezavershenniyeKursy = XQuery(_query_stroka_zaprosa); // Формируем массив из всех Незаконченных электронных курсов с ID как у Образца if (ArrayOptFirstElem(VseNezavershenniyeKursy) != undefined) // Если такие Незаконченные курсы найдены { // проверяем, не пустой ли проходной балл, если пустой, то смысла проверять, набрал ли кто-нибудь проходной балл нет docCourse = OpenDoc(UrlFromDocID(OptInt(docObrazec.TopElem.course_id))); // открываем документ Электронного курса CourseProhodnoyBall = OptInt(docCourse.TopElem.mastery_score); // получаем проходной балл Электронного курса if (CourseProhodnoyBall != undefined) { // нужно ли проверять условие набора проходного балла? (параметр) if (StrContains (ProhodnoyBall, 'Проверяем', true)) { KolichestvoNabravshihProhodnoyBall = 0; // обнуляем переменную с количеством набравших проходной балл for (NezavershenniyKurs in VseNezavershenniyeKursy) // для каждого Незаконченного курса проверяем, не набран ли сотрудником проходной балл, если набран - считаем, сколько таких курсов и сообщаем об этом { if ( NezavershenniyKurs.score >= CourseProhodnoyBall ) // проверяем, не набран ли проходной балл KolichestvoNabravshihProhodnoyBall++; // если набран - увеличиваем переменную } if (KolichestvoNabravshihProhodnoyBall > 0) // проверяем переменную, если она больше 0 - сообщаем, что есть сотрудники, которые набрали проходной балл и нужно просмотреть их перед работой агента { alert("ВНИМАНИЕ: В незавершённых курсах найдено " + KolichestvoNabravshihProhodnoyBall + " набравших проходной балл " + CourseProhodnoyBall + ". Проверьте их и завершите их как успешные. Либо, если требуется переназначение независимо от проходного балла, переключите переменную ProhodnoyBall в Игнорируем.\nВыполнение Агента остановлено."); Cancel(); } } } for (NezavershenniyKurs in VseNezavershenniyeKursy) // для каждого Незаконченного курса выполняем { try { docPerenaznacheniye = OpenDoc(UrlFromDocID(NezavershenniyKurs.id)); // открываем документ Незаконченного электронного курса docPerenaznacheniye.TopElem.parts.Clear(); // очищаем статусы Разделов в карточке Незаконченного электронного курса // перезапишем значения в карточке Незаконченного электронного курса: docPerenaznacheniye.TopElem.start_learning_date = ''; // очистим Дата начала обучения docPerenaznacheniye.TopElem.last_usage_date = ''; // очистим Дата последнего посещ. docPerenaznacheniye.TopElem.doc_info.modification.date = docObrazec.TopElem.doc_info.modification.date; // Дата модификации самой карточки (это для Репликации) tools.assign_elems( docPerenaznacheniye.TopElem, docObrazec.TopElem, [ 'score', 'state_id', 'time', 'parts'] ); // перезапишем Баллы, Состояние, Время модулей, Разделы docPerenaznacheniye.Save(); // сохраняем карточку незавершённого курса - теперь он сброшен в статус Назначен } catch (err) { DeleteDoc(UrlFromDocID(NezavershenniyKurs.id)); // если карточку курса не удаётся открыть - удаляем её } } alert("Найдено и переведено в статус Назначен " + ArrayCount(VseNezavershenniyeKursy) + " незавершённых курсов"); } else alert("Курсов " + docObrazec.TopElem.course_name + " в статусе В процессе не найдено");