Как программно переназначить исполнителя задачи в 1С:УПП на обычных формах

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе работы с бизнес-процессами и задачами в 1С часто возникает необходимость передать задачу от одного исполнителя другому. Это может быть связано с отпуском сотрудника, изменением должностных обязанностей или ошибкой при первоначальной адресации. Разберем подробно, как реализовать механизм переназначения задачи в конфигурациях на обычных формах (например, в 1С:УПП 1.3 или 1С:КА 1.1).

Постановка задачи и логика решения

Представим ситуацию: у нас есть форма списка задач. Пользователь выделяет нужную строку, нажимает кнопку «Переназначить», выбирает нового пользователя из списка, и система должна программно обновить данные в базе. Для реализации этого функционала нам необходимо выполнить три ключевых шага:

  1. Проверить права доступа: Убедиться, что текущий пользователь имеет право перепоручать задачи.
  2. Организовать выбор нового исполнителя: Открыть форму справочника Пользователи в режиме выбора.
  3. Записать изменения: Получить объект задачи, изменить реквизит Исполнитель и сохранить изменения в информационной базе.

Шаг 1: Инициация выбора и проверка прав

Начнем с процедуры, которая вызывается при нажатии кнопки в командной панели. Рассмотрим ситуацию, когда переназначить задачу может либо сам текущий исполнитель, либо администратор с полными правами. Проанализируем пример кода для открытия формы выбора:


Процедура КоманднаяПанель1Переназначение(Кнопка)
    // Получаем текущую строку из списка задач
    ТекущиеДанные = ЭлементыФормы.Список.ТекущаяСтрока;
    
    Если ТекущиеДанные = Неопределено Тогда
        Сообщить("Выберите задачу для переназначения!");
        Возврат;
    КонецЕсли;

    // Проверяем права (логика может зависеть от ваших бизнес-правил)
    Если ТекущиеДанные.Исполнитель = ПараметрыСеанса.ТекущийПользователь 
         ИЛИ РольДоступна("ПолныеПрава") Тогда
        
        // Получаем форму выбора из справочника Пользователи
        ФормаВыбора = Справочники.Пользователи.ПолучитьФорму("КХМ_ФормаСпискаКраткая");
        ФормаВыбора.Заголовок = "Выберите нового исполнителя";
        ФормаВыбора.РежимВыбора = Истина;
        
        // Открываем форму модально. В обычных формах это вернет выбранную ссылку.
        ВыбранныйПользователь = ФормаВыбора.ОткрытьМодально();
        
        // Если пользователь был выбран, переходим к записи
        Если ЗначениеЗаполнено(ВыбранныйПользователь) Тогда
            ПереназначитьЗадачу(ТекущиеДанные.Ссылка, ВыбранныйПользователь);
        КонецЕсли;
    Иначе 
        Сообщить("У Вас нет прав на перепоручение данной задачи!", СтатусСообщения.Важное);
    КонецЕсли;
КонецПроцедуры

Шаг 2: Программное изменение объекта задачи

Одна из самых распространенных ошибок начинающих разработчиков — попытка записать данные напрямую в ссылку или в метаданные бизнес-процесса. Важно помнить, что в 1С ссылка (ЗадачаСсылка) предназначена только для чтения. Для изменения данных необходимо получить объект (ЗадачаОбъект).

Разберем, как правильно реализовать процедуру записи. Выясним причину, по которой нельзя менять точки маршрута в конфигураторе напрямую через код: точки маршрута — это описание логики, а конкретный исполнитель живет в экземпляре задачи.


Процедура ПереназначитьЗадачу(СсылкаНаЗадачу, НовыйИсполнитель)
    
    Попытка
        // Шаг 1: Получаем объект из ссылки
        ЗадачаОбъект = СсылкаНаЗадачу.ПолучитьОбъект();
        
        // Шаг 2: Устанавливаем нового исполнителя
        ЗадачаОбъект.Исполнитель = НовыйИсполнитель;
        
        // Важный нюанс: если в задаче используется ролевая адресация, 
        // нужно очистить роль исполнителя, иначе задача останется доступной всей роли.
        // ЗадачаОбъект.РольИсполнителя = Справочники.РолиИсполнителей.ПустаяСсылка();
        
        // Шаг 3: Записываем объект
        ЗадачаОбъект.Записать();
        
        Сообщить("Задача успешно переназначена на: " + НовыйИсполнитель);
    Исключение
        Сообщить("Не удалось переназначить задачу. Ошибка: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Шаг 3: Обработка разных типов задач

Если ваша форма списка отображает задачи разных типов (разные точки маршрута разных бизнес-процессов), мы можем добавить проверку типа ссылки. Это позволит гибко управлять логикой в зависимости от того, какая именно задача переназначается. Проанализируем ситуацию, когда для определенных типов задач требуются дополнительные действия.


Если ТипЗнч(СсылкаНаЗадачу) = Тип("ЗадачаСсылка.НА_ЗадачаСогласования") Тогда
    // Дополнительная логика для задач согласования
    // Например, запись в исторический регистр сведений
ИначеЕсли ТипЗнч(СсылкаНаЗадачу) = Тип("ЗадачаСсылка.НА_СогласованиеЗаказа") Тогда
    // Логика для задач по заказам
КонецЕсли;

Важные технические нюансы

При реализации данного функционала следует учитывать несколько критических аспектов, которые обеспечат стабильность системы:

  1. Состояние задачи: Проверяйте реквизит Выполнена. Если задача уже завершена, ее переназначение не имеет смысла и может привести к логическим ошибкам в бизнес-процессе.
  2. Адресация: В типовых механизмах (УПП, ERP, Документооборот) используется комплексная адресация. Кроме реквизита Исполнитель, у задачи могут быть РольИсполнителя и Подразделение. Если вы назначаете конкретного человека, убедитесь, что ролевые реквизиты очищены или заполнены в соответствии с вашей логикой.
  3. Оповещения: Сам по себе факт записи в базу не уведомляет нового исполнителя. Хорошим тоном будет вызов типовой процедуры отправки почтового уведомления или создание записи в системе оповещений.
  4. Модальность: Использование метода ОткрытьМодально() характерно для обычных форм. Помните, что в управляемом интерфейсе (веб-клиент, тонкий клиент) этот метод работать не будет, и потребуется использование ОткрытьФорму() с описанием описания оповещения.

Таким образом, мы рассмотрели полный цикл решения задачи: от нажатия кнопки на форме до физической записи данных в таблицу задач. Использование метода ПолучитьОбъект() и последующая проверка заполнения данных — это стандарт надежной разработки в среде 1С.

← На главную