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