Почему при открытии перенаправленной задачи в 1С реквизиты содержат значение Объект не найден?

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

При программном создании и перенаправлении бизнес-процессов или задач разработчики нередко сталкиваются с ситуацией: в коде создания объекта значения реквизитов (например, Исполнитель, Модератор, ИсточникПеренаправления) заполняются корректно, запись проходит без ошибок, однако при открытии формы задачи пользователем на месте значений отображается строка вида <Объект не найден> [УникальныйИдентификатор].

Проанализируем пример исходного программного кода, в котором выполняется создание новой задачи:


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

Выясним причину такого поведения платформы 1С:Предприятие и разберем по шагам, как исправить данную ошибку.

Причина 1. Ограничение прав доступа на уровне записей (RLS)

Самая распространенная причина появления надписи <Объект не найден> при корректно записанной ссылке — работа механизма ограничения прав на уровне записей (RLS) или отсутствие прав на чтение связанного справочника.

Платформа 1С устроена так, что если в базе данных ссылка существует, но у текущего пользователя в его сеансе нет прав на просмотр этого конкретного элемента (например, элемента справочника ФизическиеЛица или Пользователи), платформа заменяет представление объекта на <Объект не найден>. При этом сама ссылка в базе не является «битой».

Разберем, как проверить эту гипотезу:

  1. Проверка прав под администратором: откроем задачу под пользователем с полными административными правами. Если под полными правами все реквизиты (Модератор, ИсточникПеренаправления) отображаются корректно, проблема гарантированно заключается в назначенных ролях и правилах RLS.
  2. Проверка прав на ссылочные метаданные: проверим роли конечного исполнителя. Убедимся, что у пользователя есть право «Чтение» и «Просмотр» на справочники Справочник.Пользователи и Справочник.ФизическиеЛица.
  3. Тестирование запросом с контролем прав: выполним в сеансе пользователя проверочный запрос с конструкцией ВЫБРАТЬ РАЗРЕШЕННЫЕ к связанным справочникам. Если запрос возвращает пустой результат для нужных элементов, значит, действуют ограничения RLS.

Причина 2. Несоответствие типов данных реквизитов

Вторая частая причина — ошибка сопоставления типов в метаданных и в программном коде. Рассмотрим подробнее фрагмент присвоения:


Задача.Модератор = Модератор;
Задача.ИсточникПеренаправления = Исполнитель.ФизЛицо;

Если тип реквизита ИсточникПеренаправления в метаданных задачи ожидает тип СправочникСсылка.Пользователи, а в коде передается Исполнитель.ФизЛицо (тип СправочникСсылка.ФизическиеЛица), либо если реквизит имеет составной тип данных, при записи может возникнуть некорректная ссылка или неявное приведение типа.

Разберем действия для устранения проблемы:

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

Причина 3. Запись задачи в привилегированном режиме и чтение в непривилегированном

Если код создания и перенаправления задачи выполняется на сервере в модуле с установленным признаком привилегированного режима или с вызовом УстановитьПривилегированныйРежим(Истина), платформа производит поиск и запись ссылок без контроля прав RLS. Однако когда задача открывается в пользовательском интерфейсе обычным сотрудником, срабатывают пользовательские ограничения.

Если по регламенту безопасности рядовой пользователь не должен иметь доступа к справочнику физических лиц, но должен видеть текстовую информацию о том, кто перенаправил задачу, применим одно из решений:

  1. Добавление строковых представлений: создадим в задаче строковый реквизит (например, ИсточникПеренаправленияСтрока) и при создании задачи в привилегированном режиме запишем туда текстовое представление (ФИО сотрудника).
  2. Корректировка групп доступа: включим пользователя в соответствующие группы доступа или рабочие группы, предоставляющие права на чтение данных участников бизнес-процесса.
← На главную