При разработке новых ролей и кастомных объектов в конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как 1С:Зарплата и Управление Персоналом 3.1, разработчики часто сталкиваются с неочевидным поведением платформы в тонком клиенте. Типичный пример — возникновение ошибки Поле объекта не обнаружено (Ссылка) при попытке выбрать элемент из справочника в самописном документе под новой, казалось бы, полностью настроенной ролью.
В этой статье мы подробно разберем, почему возникает данная проблема, как на нее влияют особенности работы управляемых форм в тонком клиенте, и рассмотрим три надежных способа ее решения.
Рассмотрим сценарий: в конфигурации ЗУП 3.1 создан новый документ (например, «Путевой лист»), в котором есть реквизит Сотрудник (тип СправочникСсылка.Сотрудники). Для выбора сотрудника используется не основная форма справочника, а специальная самописная форма выбора. Для работы с документом создана новая роль.
В процессе тестирования под полными правами или в толстом клиенте всё работает корректно. Однако при запуске в тонком клиенте под учетной записью с новой ролью при выборе сотрудника в документе происходит аварийное завершение работы обработчика со следующей ошибкой:
{Документ.ПутевойЛист.Форма.ФормаДокумента.Форма(407)}: Поле объекта не обнаружено (Ссылка)
Объект.Сотрудник = РезультатВыбора.Ссылка;
Выясним, почему это происходит. В управляемом приложении 1С (особенно в тонком и веб-клиентах) платформа оптимизирует объем данных, передаваемых между сервером и клиентом. Когда в форме выбора динамический список отображает данные, платформа отправляет на клиент только те колонки, которые видимы пользователю на форме.
Если у пользователя с новой ролью ограничены права на просмотр определенных реквизитов или колонка Ссылка скрыта настройками видимости, платформа вообще не передает это поле на клиент. В результате в обработчик выбора возвращается структура данных (или объект ДанныеФормыСтруктура), в которой физически отсутствует свойство Ссылка. Попытка обратиться к нему напрямую вызывает исключение.
Ниже мы разберем три способа решения этой проблемы — от исправления архитектуры кода до настройки прав в БСП.
Самый надежный и правильный с точки зрения стандартов разработки «1С» способ — это изменение логики передачи данных из формы выбора. Зачастую разработчики допускают ошибку, передавая из формы выбора всю строку динамического списка (структуру данных) вместо конкретной ссылки.
Скорее всего, в вашей форме выбора при нажатии на сотрудника вызывается код, который передает текущие данные строки:
// Неправильный подход в форме выбора
ОповеститьОВыборе(Элементы.Список.ТекущиеДанные);
Объект ТекущиеДанные возвращает всю структуру строки, состав полей которой жестко зависит от прав доступа текущего пользователя и видимости колонок на клиенте. Чтобы избежать этой зависимости, необходимо передавать исключительно саму ссылку на объект. Свойство динамического списка ТекущаяСтрока всегда содержит чистую ссылку на элемент справочника.
Выполним доработку кода по шагам:
Сотрудники, которая используется в вашем документе.
// Правильный подход в форме выбора
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Передаем значение ТекущаяСтрока, которое содержит саму ссылку
ОповеститьОВыборе(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры
Теперь скорректируем принимающую сторону в форме документа. Поскольку из формы выбора теперь возвращается непосредственно ссылка (а не структура данных), нам больше не нужно обращаться к свойству .Ссылка через точку на клиенте:
// Исправленный обработчик в форме документа
&НаКлиенте
Процедура СотрудникНачалоВыбораЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора <> Неопределено Тогда
// РезультатВыбора уже является ссылкой на справочник Сотрудники
Объект.Сотрудник = РезультатВыбора;
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует стабильную работу программы в любом типе клиента и под любыми правами доступа, так как ссылка передается напрямую и не зависит от состава колонок на форме.
Если по каким-то причинам вам необходимо передавать именно структуру строки динамического списка, либо вы не можете изменить код возврата значения, можно принудительно заставить платформу передавать поле Ссылка на клиент.
Рассмотрим, как настроить это в конфигураторе:
Сотрудники в конфигураторе.Список с типом ДинамическийСписок).Ссылка (или Ref).После этой настройки платформа «1С:Предприятие» будет принудительно включать поле Ссылка в состав данных, передаваемых на клиент, даже если колонка скрыта или у пользователя настроена индивидуальная видимость элементов формы.
Если вы столкнулись с тем, что даже при полной установке прав в конфигураторе для новой роли ошибка сохраняется, проблема кроется в механизмах интеграции с Библиотекой стандартных подсистем (БСП). В современных конфигурациях, таких как ЗУП 3.1, ручное назначение ролей пользователям непосредственно в конфигураторе может работать некорректно или игнорироваться системой безопасности БСП.
Для корректной интеграции новой роли выполним следующие действия:
/С ЗапуститьОбновлениеИнформационнойБазы.
Это необходимо для того, чтобы БСП зарегистрировала вашу новую роль в справочнике Идентификаторы объектов метаданных.
Использование механизмов БСП для назначения ролей гарантирует, что все ограничения доступа (включая RLS — ограничение на уровне записей) отработают корректно, а платформа правильно кэширует права пользователя при авторизации в тонком клиенте.