Uploaded by llol8496

Реализовать автоматическое выполнение задач для данного исполнителя

advertisement
Заказы на доработку 1С (сервис удаленной
работы)
Неназначенных
незавершенных заказов:
Форум
ПРАВИЛА
5
ВОЙНА с РОССИЕЙ
Хранилище
База знаний
Бесплатные отчеты,
обработки, конфигурации,
внешние компоненты для 1С
Статьи, описание работы,
методики по работе с 1С
Обратная связь
Поиск
Здравствуйте, гость ( Вход | Зарегистрироваться )
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 » Программисту » Программирование в 1С Предприятие 8.3
Реализовать автоматическое выполнение задач для данного исполнителя
VLADAL
16.04.19, 12:55
Конфгурация на БСП 3.0.2, платформа 8.3.13.
Есть бизнес-процесс с "линейной" картой.
Уменьшено: 60% от [ 322 на
Оратор
523 ] — нажмите для просмотра
полного изображения
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 73 раз
Рейтинг: 61
По "пожеланиям телезрителей" нужно автоматически закрывать задачу, если этот пользователь (адресат исполнения) в данном бизнеспроцессе уже закрывал задачу положительно.
В моем случае "локальный директор", "финансовый" и "исполнительный" - одно и то же лицо и нужно упростить, автоматизировать зак
последующих задач.
Что есть: при интерактивном закрытии задачи формируется следующая, в которую нужно зайти и нажать кнопку Согласовать, и так три
(на карте три последние точки маршрута).
Что я дописал:
В отладчике я вижу, что точки бизнес-процесса продвигаются, задача меняется, выполняется, но в конце маршрута вываливается с ош
Цитата
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменен
или удалена)!
Естественно, ссылка одна и та же, да и открыта интерактивно.
Делал это программно. Получил ссылку на текущую задачу, вызвал метод ВыполнитьЗадачу(), в отладчике прослеживаю все этапы и н
последнем шаге получаю ошибку о невозможности закрыть задачу, так как она уже была выполнена.
Как это сделать правильно?
В обработчике точки маршрута ВыполнитьПриСозданииЗадач пишу свой код:
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий элементов карты маршрута.
Процедура ВыполнитьПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
:
НомерИтерации = НомерИтерации + 1;
Записать();
// Устанавливаем реквизиты адресации и доп. реквизиты для каждой задачи.
Для каждого Задача Из ФормируемыеЗадачи Цикл
Если ТочкаМаршрутаБизнесПроцесса.Имя = "СогласованиеФинансовыйКонтролер" Тогда
Задача.РольИсполнителя = Справочники.РолиИсполнителей.ФинансовыйКонтролер;
...
// Определить. был ли этот исполнитель в предыдущих точках маршрута
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|
|
|
ЗадачаИсполнителя.Ссылка КАК Ссылка,
ЗадачаИсполнителя.БизнесПроцесс КАК БизнесПроцесс,
ЗадачаИсполнителя.Выполнена КАК Выполнена,
|
ЗадачаИсполнителя.ГруппаИсполнителейЗадач КАК ГруппаИсполнителейЗадач,
...
Запрос.УстановитьПараметр("ОсновнойОбъектАдресации", Задача.ОсновнойОбъектАдресации);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Задача.ГруппаИсполнителейЗадач = Выборка.ГруппаИсполнителейЗадач;
Задача.Исполнитель = Выборка.Исполнитель;
Задача.ДополнительныйОбъектАдресации = Выборка.ДополнительныйОбъектАдресации;
//-- сделал и так, но все равно последняя задача рубится с ошибкой, что она выполнена и вся транзакция откатывается н
Если Не Задача.Выполнена Тогда
Задача.ВыполнитьЗадачу();
КонецЕсли;
//-- вызывал и типовой модуль, но он тоже валится...
//БизнесПроцессыИЗадачиВызовСервера.ВыполнитьЗадачу(Задача.Ссылка, Истина);
КонецЕсли;
Сообщение отредактировал Vofka - 16.04.19, 14:47
Ответить
VLADAL
Цитировать выделе
16.04.19, 18:51
Сделал эксперимент. В пустой конфе создал БП и Задачу, в карте маршрута добавил несколько пунктов линейно, в обработчик записал
код:
Процедура ПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
Оратор
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 73 раз
Рейтинг: 61
ФормируемыеЗадачи[0].Записать();
ФормируемыеЗадачи[0].ВыполнитьЗадачу();
КонецПроцедуры
БП стартует, создает столько же задач, сколько в карте, и закрывается с выполнением.
Сферический конь в вакууме не привел к ошибке.
Единственное, что если создать БП и в форме только что созданного объекта
Что делать?
Ответить
VLADAL
Цитировать выделе
17.04.19, 16:01
Будет хорошим тоном написать, как я решил эту проблему.
Оратор
:
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 73 раз
Рейтинг: 61
В пустой базе "сферический конь в вакууме" работает так, как мне надо, значит я на верном пути.
В рабочей конфе тоже все отрабатывает, если закрывать задачу непосредственно самой задачей
Задача.ВыполнитьЗадачу(); вместо вызова модуля БизнесПроцессыИЗадачиВызовСервера.ВыполнитьЗадачу(Задача.Ссылка
Истина);.
Но при этом все равно валилась ошибка об измененном объекте и несоответствии версий.
Попробовал записывать задачу перед закрытием, ожидаемого эффекта не было, ошибка осталась, зато отладчик
Задача.Ссылка.УникальныйИдентификатор() показывал, что создаются разные задачи и к ним потом рекурсивно обращается метод
ВыполнитьЗадачу().
Ок.
Но при выходе из каждой итерации рекурсии каждая из задач оказывалась с признаком Выполнена, и соответственно в модуле самой
задачи не проходила проверку по условию:
...
ИначеЕсли НЕ ПометкаУдаления И ИсходныеРеквизиты.Выполнена И Выполнена Тогда
ОбщегоНазначения.СообщитьПользователю(
НСтр("ru='Эта задача уже была выполнена ранее.';en='This task has already been done earlier.'"),,,, Отказ);
Возврат;
КонецЕсли;
Нужен был какой-то признак для игнора этой проверки. Добавил свойство Автозакрытие в ДополнительныеСвойства и всё получилось!
В бизнес-процессе после определения, что задача должна закрыться автоматически, добавляю в объект признак Автозакрытие:
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Если Не Задача.Выполнена Тогда
Задача.ДополнительныеСвойства.Вставить("Автозакрытие", Истина);
Задача.ВыполнитьЗадачу();
КонецЕсли;
КонецЕсли;
А в модуле задачи ПередЗаписью читаю, есть ли этот признак и вызываю проверку:
ИначеЕсли НЕ ПометкаУдаления И ИсходныеРеквизиты.Выполнена И Выполнена
И НЕ ЭтоАвтоЗакрытие Тогда
// При автозакрытии из БП не проводить эту проверку
ОбщегоНазначения.СообщитьПользователю(
НСтр("ru='Эта задача уже была выполнена ранее.';en='This task has already been done earlier.'"),,,, Отказ);
Возврат;
КонецЕсли;
Всё работает, все счастливы.
Спасибо сказали: Vofka,
RPASHKOVSKY
Молчаливый
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0
Ответить
Цитировать выделе
Ответить
Цитировать выделе
21.04.19, 18:15
Vladal @ 17.04.19, 16:01 ,
Прочитайте его перед записью, раз он у вас изменяется, сильно не вчитывался,
но логика следующая
Объект.ПРочитать();
Объект.Задача.ПолучитьОбъект().ВыполнитьЗадачу();
Под объектом имею в виду сам БП
Сообщение отредактировал Vofka - 22.04.19, 8:06
VLADAL
22.04.19, 8:39
rpashkovsky @ Вчера, 19:15 ,
Как раз с БП всё в порядке. после записи задачи назначается оповещение при котором его объект перечитывается в форме.
Я же стартовал задачи программно - ошибка проявлялась после выхода каждой задачи из рекурсии.
Оратор
Задача решена двумя днями головоломок и 10 строками.
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 73 раз
Рейтинг: 61
:
Ответить
Цитировать выделе
Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.
Ключевое слово
« Предыдущая тема · Программирование в 1С Предприятие 8.3 ·
Найти в этой теме
Ответить
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|-- Программирование в 1С Предприятие 8.3
Текстовая версия
Сейчас: 21.11.2
Форум IP.Board © 2022 IPS, Inc.
:
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методи
поддержка 1С - всё в одном месте: на Украинском 1С форуме!
Download