При программном создании и перенаправлении бизнес-процессов или задач разработчики нередко сталкиваются с ситуацией: в коде создания объекта значения реквизитов (например, Исполнитель, Модератор, ИсточникПеренаправления) заполняются корректно, запись проходит без ошибок, однако при открытии формы задачи пользователем на месте значений отображается строка вида <Объект не найден> [УникальныйИдентификатор].
Проанализируем пример исходного программного кода, в котором выполняется создание новой задачи:
Процедура ДействияФормыПеренаправитьДругомуИсполнителю(Кнопка)
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
Задача.Дата = ТекущаяДата();
Задача.ВидЗадачи = ВидЗадачи;
Задача.Наименование = Наименование + " [ПЕРЕНАПРАВЛЕНАЯ ЗАДАЧА]";
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Ссылка,
| Пользователи.ФизЛицо
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ФизЛицо = &ФизЛицо";
Запрос.УстановитьПараметр("ФизЛицо", ИсточникПеренаправления);
Рез = Запрос.Выполнить();
Если Не Рез.Пустой() Тогда
Выборка = Рез.Выбрать();
Выборка.Следующий();
Задача.Исполнитель = Выборка.Ссылка;
Иначе
Сообщить("По физ. лицу " + Строка(ИсточникПеренаправления) + " не найден пользователь для перенаправлении задачи!");
Возврат;
КонецЕсли;
Задача.Модератор = Модератор;
Задача.ИсточникПеренаправления = Исполнитель.ФизЛицо;
Задача.ДатаВыполненияПланово = ДатаВыполненияПланово;
Задача.ЗадачаИсточник = Ссылка;
Задача.Записать();
Модифицированность = Ложь;
ЭтаФорма.Закрыть();
КонецПроцедуры
Выясним причину такого поведения платформы 1С:Предприятие и разберем по шагам, как исправить данную ошибку.
Самая распространенная причина появления надписи <Объект не найден> при корректно записанной ссылке — работа механизма ограничения прав на уровне записей (RLS) или отсутствие прав на чтение связанного справочника.
Платформа 1С устроена так, что если в базе данных ссылка существует, но у текущего пользователя в его сеансе нет прав на просмотр этого конкретного элемента (например, элемента справочника ФизическиеЛица или Пользователи), платформа заменяет представление объекта на <Объект не найден>. При этом сама ссылка в базе не является «битой».
Разберем, как проверить эту гипотезу:
Модератор, ИсточникПеренаправления) отображаются корректно, проблема гарантированно заключается в назначенных ролях и правилах RLS.Справочник.Пользователи и Справочник.ФизическиеЛица.ВЫБРАТЬ РАЗРЕШЕННЫЕ к связанным справочникам. Если запрос возвращает пустой результат для нужных элементов, значит, действуют ограничения RLS.Вторая частая причина — ошибка сопоставления типов в метаданных и в программном коде. Рассмотрим подробнее фрагмент присвоения:
Задача.Модератор = Модератор;
Задача.ИсточникПеренаправления = Исполнитель.ФизЛицо;
Если тип реквизита ИсточникПеренаправления в метаданных задачи ожидает тип СправочникСсылка.Пользователи, а в коде передается Исполнитель.ФизЛицо (тип СправочникСсылка.ФизическиеЛица), либо если реквизит имеет составной тип данных, при записи может возникнуть некорректная ссылка или неявное приведение типа.
Разберем действия для устранения проблемы:
Задача.ЗадачаИсполнителя.Исполнитель, Модератор и ИсточникПеренаправления.Если код создания и перенаправления задачи выполняется на сервере в модуле с установленным признаком привилегированного режима или с вызовом УстановитьПривилегированныйРежим(Истина), платформа производит поиск и запись ссылок без контроля прав RLS. Однако когда задача открывается в пользовательском интерфейсе обычным сотрудником, срабатывают пользовательские ограничения.
Если по регламенту безопасности рядовой пользователь не должен иметь доступа к справочнику физических лиц, но должен видеть текстовую информацию о том, кто перенаправил задачу, применим одно из решений:
ИсточникПеренаправленияСтрока) и при создании задачи в привилегированном режиме запишем туда текстовое представление (ФИО сотрудника).