В этой статье разберем довольно хитрую ситуацию, с которой сталкиваются разработчики при настройке ограниченных прав доступа в 1С. Проблема проявляется так: вы создаете новую роль, даете ей полные права на определенный регистр накопления и на документ Корректировка регистров. Пользователь под этой ролью открывает документ, выбирает нужный регистр, но при попытке добавить новую строку поле Период оказывается заблокированным. При этом, если выдать пользователю полные права, все работает как надо. Давайте выясним, в чем причина такого поведения платформы и как это исправить.
Проанализируем ситуацию. На первый взгляд, все логично: есть права на документ, есть права на регистр — значит, все поля должны быть доступны. Отладчик показывает, что у колонки Период свойства ТолькоПросмотр установлено в Ложь, а Доступность в Истина. Тем не менее, при попытке программно присвоить значение дате в обработчике события ПриНачалеРедактирования, система выдает ошибку "Поле не доступно для записи".
&НаКлиенте
Процедура Подключаемый_ТаблицаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
// Вот здесь возникает ошибка при ограниченных правах
Элемент.ТекущиеДанные.Период = Объект.Дата;
ЗаполнитьЗначенияСвойств(Элемент.ТекущиеДанные, Новый Структура("Организация", Организация));
КонецЕсли;
КонецПроцедуры
Это верный признак того, что проблема кроется не в свойствах элемента формы, а на более глубоком уровне — в механизме прав доступа на уровне данных. Секрет поведения платформы заключается в универсальности документа Корректировка регистров. Его форма и логика создаются динамически, и он потенциально может работать с любым регистром из своего списка движений.
Ключевая причина проблемы: перед тем как разрешить редактирование общих реквизитов записи регистра (таких как Период), платформа 1С проверяет наличие прав не только на тот регистр, который вы редактируете в данный момент, но и на все остальные регистры, для которых документ "Корректировка регистров" может формировать движения. Если у пользователя нет прав хотя бы на один из этих регистров, платформа в целях безопасности блокирует редактирование общих полей.
Теперь, когда мы понимаем корень проблемы, рассмотрим несколько способов ее решения.
Это наиболее правильный и прямой способ решения, который соответствует логике платформы. Нам нужно определить полный список регистров, с которыми связан документ, и добавить права на них в нашу кастомную роль.
Корректировка регистров. Разверните его свойства и найдите ветку Движения. В этой ветке перечислены абсолютно все регистры (накопления, сведений, бухгалтерии), по которым этот документ может создавать записи.
Чтение, Добавление и Изменение.
Важно: права нужно выдать даже на те регистры, которые пользователь никогда не будет корректировать вручную. Это требование платформы для корректной работы с универсальной формой документа.
Корректировка регистров, поле Период должно быть доступно для редактирования.
Этот метод полностью решает проблему, хотя и требует некоторой "ручной" работы по добавлению всех необходимых объектов в роль.
Этот подход является хорошей архитектурной альтернативой, особенно если корректировка требуется только для одного-двух конкретных регистров, а доступ к универсальному инструменту не нужен.
Суть метода: вместо использования многофункционального типового документа, мы создаем в расширении свой, узкоспециализированный документ, который умеет делать движения только по нужному нам регистру (например, Товары к оформлению излишков и недостач).
Преимущества такого подхода:
Как реализовать:
КорректировкаТоваровК_Оформлению.Товары к оформлению излишков и недостач.ОбработкаПроведения, напишите код, который будет формировать движения по нужному регистру на основе данных из табличной части.Этот способ требует больше времени на разработку, но в долгосрочной перспективе делает систему более надежной и простой в администрировании.
Если вы столкнулись с подобной проблемой, но не можете определить, на какой именно объект не хватает прав, на помощь придет мощный инструмент — Технологический журнал (ТЖ).
logcfg.xml и настроить его на отслеживание событий доступа к базе данных (SDBL). Установите фильтр по имени пользователя или ID сеанса, чтобы не собирать лишнюю информацию."ACCESS.DENIED" или обращения к таблицам метаданных (например, _AccumRgChngR), которые происходят непосредственно перед ошибкой. Таким образом вы сможете точно определить, к какому регистру или другому объекту система пыталась обратиться и получила отказ в доступе.Этот метод является самым трудоемким, но позволяет находить причины самых неочевидных проблем с правами доступа.
Подведем итог: проблема с блокировкой поля Период в документе Корректировка регистров — это не ошибка, а особенность работы платформенного механизма прав для универсальных, динамически настраиваемых объектов. Для ее решения необходимо обеспечить наличие у пользователя прав на все потенциальные движения документа, даже если он работает только с одним из них.