При настройке прав доступа для кадровой службы в конфигурации 1С:Бухгалтерия КОРП 3.0 специалисты часто сталкиваются со специфической ошибкой при попытке записать данные нового или существующего сотрудника. Проблема проявляется сообщением: Поле объекта недоступно для чтения (ТекущийСпособРасчетаАванса). Ошибка возникает в общем модуле СотрудникиКлиентБазовый и блокирует работу пользователя, даже если основные права на справочники «Сотрудники» и «Физические лица» уже назначены.
В этой статье мы подробно разберем причины возникновения данной ситуации, проанализируем программный код, вызывающий исключение, и рассмотрим правильные способы решения проблемы через настройку прав и использование расширений.
Для начала проанализируем, почему эта ошибка характерна именно для версии КОРП. В отличие от обычной «Бухгалтерии предприятия», версия КОРП обладает расширенным функционалом по расчету заработной платы и кадровому учету, который по своей структуре приближен к 1С:ЗУП. В данной конфигурации реализовано жесткое разделение между кадровыми данными и сведениями, необходимыми для расчета зарплаты.
Реквизиты, связанные с авансом (такие как ТекущийСпособРасчетаАванса), относятся к блоку расчета зарплаты. Проблема заключается в том, что в коде формы сотрудника на клиенте происходит обращение к реквизитам, которые динамически удаляются из контекста формы или становятся недоступными для чтения, если у пользователя отсутствуют права на соответствующие зарплатные объекты. Проанализируем стек вызова:
СотрудникиПередЗаписьюЗавершение вызывает проверку заполнения.СотрудникиПередЗаписьюДозаполнениеРеквизитов.СотрудникиКлиентБазовый происходит обращение к Форма.АвансРедактируется или непосредственно к способу расчета аванса.Если у пользователя нет роли, позволяющей видеть данные по авансам, система считает это поле «несуществующим» для чтения в данном контексте, что и приводит к фатальной ошибке.
Рассмотрим самый правильный метод решения, который не требует вмешательства в программный код. Нам необходимо расширить права кадровика (используя список профилей с отбором по роли) таким образом, чтобы он имел право на чтение (но, возможно, не на редактирование) зарплатных параметров, необходимых для инициализации формы сотрудника.
Разберем по шагам, какие объекты метаданных необходимо разрешить для чтения (в этом поможет анализ прав доступа к объекту):
ИспользоватьРасчетЗарплаты, то проверка прав становится еще строже.Рекомендуется создать новый профиль групп доступа или добавить в существующий профиль кадровика роль «Чтение плановых авансов» или «Просмотр данных по зарплате». Это позволит системе беспрепятственно считывать технические реквизиты формы, даже если сами поля аванса не выведены в интерфейс пользователя.
Если по политике безопасности организации кадровику категорически запрещено давать доступ к любым зарплатным регистрам (даже на чтение), можно прибегнуть к использованию расширения. Рассмотрим пример кода, который позволяет обойти ошибку, добавив проверку доступности или обернув проблемный участок в блок Попытка...Исключение.
Проанализируем пример доработки процедуры СотрудникиПередЗаписьюДозаполнениеРеквизитов в расширении:
&Вместо("СотрудникиПередЗаписьюДозаполнениеРеквизитов")
Процедура Расш1_СотрудникиПередЗаписьюДозаполнениеРеквизитов(Форма)
// Стандартная логика заполнения вида занятости
Если НЕ Форма.ПоддержкаСовместительства
И НЕ Форма.ИспользоватьКадровыйУчет
И НЕ ЗначениеЗаполнено(Форма.ТекущийВидЗанятости)
И ЗначениеЗаполнено(Форма.ДатаПриема) Тогда
Форма.ТекущийВидЗанятости = СотрудникиВызовСервера.ПолучитьВидЗанятостиДляНовогоСотрудника(
Форма.Сотрудник,
Форма.ТекущаяОрганизация,
Форма.ФизическоеЛицоСсылка);
КонецЕсли;
// Безопасное заполнение параметров аванса
Попытка
// Проверяем, доступны ли реквизиты для чтения
Если НЕ Форма.АвансРедактируется
И НЕ ЗначениеЗаполнено(Форма.ТекущийСпособРасчетаАванса) Тогда
Форма.ТекущийСпособРасчетаАванса = ПредопределенноеЗначение("Перечисление.СпособыРасчетаАванса.ПроцентомОтТарифа");
Форма.ТекущийАванс = Форма.РазмерАвансаВПроцентахПоУмолчанию;
КонецЕсли;
Исключение
// Если права отсутствуют, просто игнорируем заполнение этих полей на клиенте
// Это предотвратит падение системы при записи
КонецПопытки;
КонецПроцедуры
Важное замечание: Как справедливо отмечают эксперты, использование пустого блока Исключение является «костылем». Это маскирует проблему прав доступа. Однако в условиях жестких ограничений RLS (Record Level Security) это может быть единственным способом заставить форму работать без предоставления лишних прав.
Если вышеуказанные действия не помогли, проанализируем настройки ограничений на уровне записей (RLS). В версии КОРП часто настраивают доступ по организациям или подразделениям. Если у кадровика нет доступа к организации, по которой числится сотрудник в регистре ПлановыеАвансы, ошибка чтения возникнет снова.
Также стоит проверить функциональную опцию ИспользоватьРасчетЗарплаты. В некоторых случаях, если кадровый учет ведется во внешней программе, а в Бухгалтерии КОРП только отражаются результаты, эту опцию можно отключить, что снимет необходимость проверки данных авансов в справочнике сотрудников (особенно если настроен запрет просмотра документов зарплаты).
Для устранения ошибки Поле объекта недоступно для чтения (ТекущийСпособРасчетаАванса) мы рекомендуем придерживаться следующего алгоритма:
ПлановыеАвансы и ПараметрыОплатыТрудаСотрудников.СпособыРасчетаАванса для пользователя.Попытка...Исключение.Следуя этим шагам, мы обеспечим стабильную работу кадровой службы в системе 1С:Бухгалтерия КОРП 3.0 без нарушения логики разделения прав доступа.