При разработке функционала оповещения и выдачи поручений в 1С часто возникает вопрос: обязательно ли создавать и запускать объект метаданных БизнесПроцесс, чтобы поставить задачу конкретному пользователю? Разберем подробно внутреннюю логику платформы 1С:Предприятие, выясним причины возможных ошибок при записи задач и рассмотрим различные варианты реализации.
Проанализируем архитектуру объектов платформы. Объект конфигурации Задача является самостоятельным объектом метаданных. Стандартные реквизиты БизнесПроцесс и ТочкаМаршрута на уровне платформы не являются строго обязательными для заполнения. В них может храниться пустая ссылка.
Таким образом, задача вполне может существовать и записываться без ссылки на бизнес-процесс. Это подтверждается типовыми решениями (например, в ряде конфигураций подсистемы задач функционируют автономно без единого бизнес-процесса).
Рассмотрим по шагам, как правильно создать задачу пользователю напрямую. Если мы не используем бизнес-процесс, нам не требуется заполнять реквизиты маршрутизации или вызывать интерактивные методы активации.
Посмотрим на пример создания автономной задачи:
НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
НоваяЗадача.Дата = ТекущаяДатаСеанса();
НоваяЗадача.Наименование = "Ознакомиться с новым распоряжением по отделу";
НоваяЗадача.Исполнитель = ВыбПользователь;
НоваяЗадача.Описание = "Необходимо ознакомиться с документом и принять к сведению.";
// В типовых конфигурациях (на базе БСП) могут требоваться дополнительные реквизиты:
// НоваяЗадача.Автор = Пользователи.ТекущийПользователь();
// НоваяЗадача.СрокИсполнения = ТекущаяДатаСеанса() + 86400; // +1 день
// НоваяЗадача.СостояниеБизнесПроцесса = Перечисления.СостоянияБизнесПроцессов.Активен;
НоваяЗадача.Записать();
Разберем типичные ошибки при программном создании задачи:
АктивироватьИнтерактивно(): данный метод предназначен исключительно для клиентского сценария взаимодействия пользователя с картой маршрута бизнес-процесса. При серверном создании задачи его вызов приведет к ошибке.ПередЗаписью могут быть установлены проверки на заполнение реквизитов (например, Автор, Важность, СрокИсполнения или реквизиты адресации). Если задача не записывается, необходимо проверить модуль объекта на наличие таких условий.ЗадачаОбъект.ВыполнитьЗадачу() просто переведет флаг Выполнена в значение Истина и зафиксирует дату выполнения, не пытаясь продвинуть несуществующий бизнес-процесс дальше.Если в конфигурации уже настроен типовой бизнес-процесс (например, Ознакомление или Задание), создавать задачу вручную через Задачи.ЗадачаИсполнителя.СоздатьЗадачу() не требуется. Достаточно создать и стартовать сам процесс — платформа создаст связанные задачи автоматически в точке маршрута.
Рассмотрим, как выглядит правильный код запуска бизнес-процесса:
БП = БизнесПроцессы.Ознакомление.СоздатьБизнесПроцесс();
БП.Дата = ТекущаяДатаСеанса();
БП.Автор = Пользователи.ТекущийПользователь();
БП.Наименование = "Ознакомление с приказом №12";
БП.Записать();
// При вызове метода Старт() бизнес-процесс сам создаст задачи на активных точках маршрута
БП.Старт();
В этом случае при выполнении пользователем сформированной задачи бизнес-процесс автоматически перейдет к следующей точке или успешно завершится.
Если задача ставится исключительно ради оповещения пользователя без строгого контроля исполнения в списке задач, проанализируем более легковесные альтернативы:
ПоказатьОповещениеПользователя(): подходит для оперативного вывода всплывающего окна в правом нижнем углу экрана текущего активного сеанса.