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