Разработка и Конфигурация · 11 мин
Как программно создать задачу в 1С
Как программно создать задачу в 1С: работа с менеджером задач, заполнение реквизитов, бизнес-процессы, типовые ошибки и примеры кода на встроенном языке.
Программное создание задач в 1С — типовая операция при автоматизации согласований, уведомлений пользователей и построения маршрутов документооборота. Задача в 1С — это самостоятельный объект конфигурации (ветка «Задачи» в дереве метаданных), экземпляры которого создаются либо вручную пользователем, либо из кода встроенного языка, либо автоматически в точках маршрута бизнес-процесса.
Способ создания зависит от того, что именно вы используете: самостоятельный объект «Задача» (как в конфигурации «Документооборот» или в типовых механизмах БСП) или задачи, порождаемые бизнес-процессом. В первом случае работает прямой вызов Задачи.ИмяЗадачи.СоздатьЗадачу(), во втором задача появляется при старте и продвижении бизнес-процесса по карте маршрута.
Ниже разобраны оба сценария с примерами кода, заполнением реквизитов, проверкой результата и разбором типовых ошибок. Примеры применимы к управляемым и обычным формам, серверному контексту и внешним обработкам.
Что представляет собой объект «Задача» в конфигурации
Задача — прикладной объект метаданных, предназначенный для описания поручений исполнителям и контроля их выполнения. У задачи есть стандартные реквизиты: наименование, дата, номер, признак выполнения, а также реквизиты, которые разработчик добавляет сам: исполнитель, срок исполнения, важность, бизнес-процесс, точка маршрута, объект основания.
Важная особенность: задача часто связана с бизнес-процессом. В типовых механизмах (например, в «1С:Документооборот» или в подсистеме бизнес-процессов БСП) задачи не создают напрямую — они появляются, когда бизнес-процесс доходит до соответствующей точки маршрута. Прямое создание уместно для «свободных» задач-поручений, не привязанных к маршруту.
Перед написанием кода откройте конфигуратор и проверьте: есть ли в ветке «Задачи» нужный объект, какие у него реквизиты обязательны для заполнения, участвует ли он в бизнес-процессах. От этого зависит выбор сценария.
Базовое создание задачи: СоздатьЗадачу и Записать
Минимальный сценарий состоит из трёх шагов: получить новый объект через менеджер, заполнить реквизиты, записать. Код выполняется на сервере — в модуле объекта, общем модуле с признаком «Сервер» или в серверной процедуре формы.
НоваяЗадача = Задачи.ЗадачиИсполнителям.СоздатьЗадачу();
НоваяЗадача.Дата = ТекущаяДатаСеанса();
НоваяЗадача.Наименование = "Проверить поступление товара";
НоваяЗадача.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
НоваяЗадача.СрокИсполнения = ТекущаяДатаСеанса() + 86400 * 3; // +3 дня
НоваяЗадача.Описание = "Сверить количество по накладной и фактическое.";
НоваяЗадача.Записать();
Метод СоздатьЗадачу() только формирует объект в памяти — в базе данных задача появится после вызова Записать(). Если запись не выполнена, ссылка на задачу останется пустой, и любые попытки использовать её (например, в отборах или уведомлениях) ни к чему не приведут.
После записи полезно зафиксировать ссылку: СсылкаНаЗадачу = НоваяЗадача.Ссылка;. Именно ссылку передают дальше — в параметры оповещений, в регистры сведений, в отчёты по исполнению.
- 1Убедитесь, что объект «Задача» существует в конфигурации и узнайте его имя в метаданных
- 2Вызовите Задачи.ИмяЗадачи.СоздатьЗадачу() на сервере
- 3Заполните обязательные реквизиты: наименование, исполнитель, срок
- 4Вызовите Записать() и сохраните ссылку на созданную задачу
- 5Проверьте, что задача видна у исполнителя в списке задач
Заполнение реквизитов: исполнитель, срок и основание
Исполнитель — ключевой реквизит. В зависимости от конфигурации это может быть ссылка на справочник «Пользователи», «Сотрудники» или на ролевую адресацию (роль + объект адресации). Если в конфигурации используется адресация по ролям, заполняйте реквизиты роли, а не конкретного пользователя: задача тогда попадёт всем исполнителям роли, а принять её сможет любой из них.
Срок исполнения задаётся датой. Типовой приём — прибавлять к текущей дате сеанса нужное количество секунд (86400 в сутках). Учитывайте, что ТекущаяДатаСеанса() возвращает время сервера, а не клиента, — при распределённой работе в разных часовых поясах это может давать неожиданные сроки.
Если задача создаётся «по поводу» документа или справочника, сохраните основание в специальном реквизите (часто он называется «Предмет», «Основание» или «ДокументОснование»). Это позволит строить отчёты по задачам в разрезе объектов и открывать основание прямо из формы задачи.
Создание задачи через бизнес-процесс
Если задачи в конфигурации порождаются бизнес-процессами, прямое создание через СоздатьЗадачу() нарушит логику маршрута: такая задача не будет связана с точкой маршрута, и её выполнение не продвинет процесс дальше. Правильный подход — стартовать бизнес-процесс, а задачи появятся автоматически.
НовыйПроцесс = БизнесПроцессы.СогласованиеЗаявки.СоздатьБизнесПроцесс();
НовыйПроцесс.Дата = ТекущаяДатаСеанса();
НовыйПроцесс.Заявка = СсылкаНаДокумент;
НовыйПроцесс.Инициатор = ПараметрыСеанса.ТекущийПользователь;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
После вызова Старт() система проходит карту маршрута до первой точки действия и создаёт задачи по правилам, заданным в этой точке. Получить созданные задачи можно запросом по отбору «БизнесПроцесс = ссылка» и «Выполнена = Ложь».
Для программного выполнения задачи (например, автоодобрение по условию) используется метод ВыполнитьЗадачу() объекта задачи. После него бизнес-процесс движется дальше по маршруту и при необходимости создаёт следующие задачи.
Два способа получить задачу
Подходит для разовых поручений и свободных задач вне маршрута. Не работает, если логика требует прохождения бизнес-процесса.
Подходит для согласований и маршрутов. Задачи формируются автоматически, но нельзя создать задачу в произвольной точке вне карты.
Где размещать код: события, регламентные задания, внешние вызовы
Типовые точки вызова создания задачи — подписки на события и регламентные задания. Подписка на запись документа позволяет автоматически ставить задачу при проведении, например, заявки: в обработчике проверяются условия (статус, сумма, вид документа) и создаётся задача ответственному.
Регламентное задание подходит для периодических задач: ежедневный контроль просроченных договоров, еженедельная сверка остатков.
При вызове извне (через HTTP-сервис, COM или внешнюю обработку) убедитесь, что код выполняется в привилегированном контексте только там, где это действительно нужно. Создание задачи от имени произвольного внешнего вызова без проверки прав — частая причина появления «лишних» задач и дыр в безопасности.
Проверка результата и типовые ошибки
После записи задачи проверьте три вещи: задача открывается и содержит корректные реквизиты; она видна исполнителю в его списке задач (учитывайте отборы по ролям и RLS); если задача порождена процессом — её выполнение двигает процесс дальше.
Наиболее частая ошибка — «Поле объекта не обнаружено» из-за несоответствия имён реквизитов. Вторая по частоте — запись без заполнения обязательных реквизитов, когда Записать() выбрасывает исключение с текстом о незаполненном поле. Третья — пустой исполнитель: задача записывается, но никому не видна, потому что отборы списков завязаны на адресацию.
Если задача создана, но исполнитель её не видит, проверьте права доступа и механизм адресации. В конфигурациях с RLS пользователь видит только задачи, адресованные ему или его роли, — тестируйте под учётной записью реального исполнителя, а не под администратором.
Отладка и безопасная откатка изменений
Отлаживайте создание задач на копии базы. Если код уже создал лишние задачи в рабочей базе, удаляйте их аккуратно: для задач, связанных с бизнес-процессами, сначала остановите или удалите процесс, иначе удалённые задачи могут быть пересозданы при следующем движении маршрута.
Для массовой чистки используйте обработку с установкой пометки удаления, а не непосредственное удаление — так сохраняется возможность отката. Перед пометкой сделайте отбор по дате создания и автору, чтобы не зацепить задачи, созданные пользователями вручную.
Полезный приём при отладке — записывать в журнал регистрации факт создания задачи с ключевыми параметрами (основание, исполнитель, источник вызова). Это резко упрощает поиск источника «самозародившихся» задач.
Как проверить результат
Ссылка не пустая, задача открывается из списка
Ссылка пустая или исключение при Записать()
Задача есть в списке под учёткой исполнителя
Под администратором видна, под исполнителем — нет
Выполнение задачи двигает бизнес-процесс
Задача выполняется, но процесс стоит на месте
Что важно запомнить
Свободную задачу создают через Задачи.ИмяЗадачи.СоздатьЗадачу() с обязательным Записать() и заполнением исполнителя. Задачи маршрутов порождаются стартом бизнес-процесса. Проверяйте видимость задачи под учётной записью исполнителя и отлаживайте массовое создание только на копии базы.
Частые вопросы
Как создать задачу конкретному пользователю, а не роли?
Заполните реквизит исполнителя ссылкой на элемент справочника пользователей и оставьте реквизиты ролевой адресации пустыми, если они есть. Если конфигурация требует роль обязательно, создайте персональную роль с одним исполнителем или измените настройки адресации в точке маршрута.
Почему Записать() выдаёт ошибку о незаполненном реквизите?
У реквизита включена проверка заполнения (свойство «Проверка заполнения» — «Выдавать ошибку»). Откройте объект задачи в конфигураторе, найдите реквизиты с обязательным заполнением и заполняйте их в коде до вызова Записать(). Текст исключения обычно содержит имя проблемного поля.
Можно ли создать задачу из внешней обработки на клиенте?
Напрямую с клиента — нет: создание и запись объектов выполняется на сервере. В управляемом приложении вызовите серверную процедуру (общий модуль с признаками «Сервер» и «Вызов сервера»), в которой разместите код создания задачи, и передайте ей нужные параметры.
Как программно выполнить задачу?
Получите объект задачи по ссылке (ЗадачаОбъект = СсылкаНаЗадачу.ПолучитьОбъект()), при необходимости заполните реквизиты результата и вызовите метод ВыполнитьЗадачу(). Если задача принадлежит бизнес-процессу, после выполнения процесс продвинется по карте маршрута и создаст следующие задачи.
Задача создаётся, но не видна исполнителю. Что проверить?
Проверьте заполнение исполнителя и роли, настройки RLS на объект «Задача», отборы в динамическом списке формы списка задач и права пользователя на чтение задач. Тестируйте строго под учётной записью исполнителя — под полными правами отборы не срабатывают.
Как избежать дублей при автоматическом создании задач?
Перед созданием выполняйте запрос: есть ли уже невыполненная задача с тем же основанием и тем же исполнителем. Если есть — не создавайте новую или обновляйте существующую. Дополнительно можно хранить соответствие «основание — задача» в регистре сведений.