Как исправить ошибку «Поле объекта не обнаружено (Ссылка)» при выборе сотрудника в тонком клиенте 1С:ЗУП 3.1

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

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

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

Проанализируем ситуацию и выявим причину

Рассмотрим сценарий: в конфигурации ЗУП 3.1 создан новый документ (например, «Путевой лист»), в котором есть реквизит Сотрудник (тип СправочникСсылка.Сотрудники). Для выбора сотрудника используется не основная форма справочника, а специальная самописная форма выбора. Для работы с документом создана новая роль.

В процессе тестирования под полными правами или в толстом клиенте всё работает корректно. Однако при запуске в тонком клиенте под учетной записью с новой ролью при выборе сотрудника в документе происходит аварийное завершение работы обработчика со следующей ошибкой:


{Документ.ПутевойЛист.Форма.ФормаДокумента.Форма(407)}: Поле объекта не обнаружено (Ссылка)
        Объект.Сотрудник = РезультатВыбора.Ссылка;

Выясним, почему это происходит. В управляемом приложении 1С (особенно в тонком и веб-клиентах) платформа оптимизирует объем данных, передаваемых между сервером и клиентом. Когда в форме выбора динамический список отображает данные, платформа отправляет на клиент только те колонки, которые видимы пользователю на форме.

Если у пользователя с новой ролью ограничены права на просмотр определенных реквизитов или колонка Ссылка скрыта настройками видимости, платформа вообще не передает это поле на клиент. В результате в обработчик выбора возвращается структура данных (или объект ДанныеФормыСтруктура), в которой физически отсутствует свойство Ссылка. Попытка обратиться к нему напрямую вызывает исключение.

Ниже мы разберем три способа решения этой проблемы — от исправления архитектуры кода до настройки прав в БСП.

Способ 1. Исправление логики возврата значения (Рекомендуемый метод)

Самый надежный и правильный с точки зрения стандартов разработки «1С» способ — это изменение логики передачи данных из формы выбора. Зачастую разработчики допускают ошибку, передавая из формы выбора всю строку динамического списка (структуру данных) вместо конкретной ссылки.

Скорее всего, в вашей форме выбора при нажатии на сотрудника вызывается код, который передает текущие данные строки:


// Неправильный подход в форме выбора
ОповеститьОВыборе(Элементы.Список.ТекущиеДанные);

Объект ТекущиеДанные возвращает всю структуру строки, состав полей которой жестко зависит от прав доступа текущего пользователя и видимости колонок на клиенте. Чтобы избежать этой зависимости, необходимо передавать исключительно саму ссылку на объект. Свойство динамического списка ТекущаяСтрока всегда содержит чистую ссылку на элемент справочника.

Выполним доработку кода по шагам:

  1. Откроем форму выбора справочника Сотрудники, которая используется в вашем документе.
  2. Найдем процедуру, отвечающую за выбор элемента (например, при двойном клике или нажатии кнопки «Выбрать»), и заменим передачу данных:

// Правильный подход в форме выбора
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Передаем значение ТекущаяСтрока, которое содержит саму ссылку
    ОповеститьОВыборе(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры

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


// Исправленный обработчик в форме документа
&НаКлиенте
Процедура СотрудникНачалоВыбораЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт
    
    Если РезультатВыбора <> Неопределено Тогда
        // РезультатВыбора уже является ссылкой на справочник Сотрудники
        Объект.Сотрудник = РезультатВыбора; 
    КонецЕсли;
    
КонецПроцедуры

Этот подход гарантирует стабильную работу программы в любом типе клиента и под любыми правами доступа, так как ссылка передается напрямую и не зависит от состава колонок на форме.

Способ 2. Настройка свойства «Использовать всегда» в динамическом списке

Если по каким-то причинам вам необходимо передавать именно структуру строки динамического списка, либо вы не можете изменить код возврата значения, можно принудительно заставить платформу передавать поле Ссылка на клиент.

Рассмотрим, как настроить это в конфигураторе:

  1. Откроем форму выбора справочника Сотрудники в конфигураторе.
  2. Перейдем на вкладку «Реквизиты» и выберем основной реквизит формы (обычно это Список с типом ДинамическийСписок).
  3. В окне свойств реквизита найдем строку «Настройка списка» и откроем ее.
  4. В дереве полей динамического списка найдем поле Ссылка (или Ref).
  5. Установим для этого поля свойство «Использовать всегда» (поставим флажок).

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

Способ 3. Регистрация новой роли в БСП (ЗУП 3.1)

Если вы столкнулись с тем, что даже при полной установке прав в конфигураторе для новой роли ошибка сохраняется, проблема кроется в механизмах интеграции с Библиотекой стандартных подсистем (БСП). В современных конфигурациях, таких как ЗУП 3.1, ручное назначение ролей пользователям непосредственно в конфигураторе может работать некорректно или игнорироваться системой безопасности БСП.

Для корректной интеграции новой роли выполним следующие действия:

  1. Запустим базу данных из Конфигуратора в режиме «1С:Предприятие» со специальным ключом запуска для обновления служебных справочников метаданных: /С ЗапуститьОбновлениеИнформационнойБазы. Это необходимо для того, чтобы БСП зарегистрировала вашу новую роль в справочнике Идентификаторы объектов метаданных.
  2. Перейдем в режим «1С:Предприятие» под учетной записью администратора (с полными правами).
  3. Откроем раздел Администрирование -> Настройки пользователей и прав -> Профили групп доступа.
  4. Создадим новый профиль групп доступа, укажем понятное наименование и отметим флажком вашу новую роль в списке разрешенных ролей.
  5. Перейдем в раздел Группы доступа, создадим новую группу доступа, выберем созданный на предыдущем шаге профиль и добавим туда нужного пользователя.

Использование механизмов БСП для назначения ролей гарантирует, что все ограничения доступа (включая RLS — ограничение на уровне записей) отработают корректно, а платформа правильно кэширует права пользователя при авторизации в тонком клиенте.

← На главную