Как настроить права для документа 'Корректировка регистров', чтобы поле 'Период' было доступно для редактирования?

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

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

Проанализируем ситуацию. На первый взгляд, все логично: есть права на документ, есть права на регистр — значит, все поля должны быть доступны. Отладчик показывает, что у колонки Период свойства ТолькоПросмотр установлено в Ложь, а Доступность в Истина. Тем не менее, при попытке программно присвоить значение дате в обработчике события ПриНачалеРедактирования, система выдает ошибку "Поле не доступно для записи".


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

Это верный признак того, что проблема кроется не в свойствах элемента формы, а на более глубоком уровне — в механизме прав доступа на уровне данных. Секрет поведения платформы заключается в универсальности документа Корректировка регистров. Его форма и логика создаются динамически, и он потенциально может работать с любым регистром из своего списка движений.

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

Теперь, когда мы понимаем корень проблемы, рассмотрим несколько способов ее решения.

Решение 1: Предоставление прав на все связанные регистры

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

  1. Определяем список регистров. Откройте конфигуратор и найдите в дереве метаданных документ Корректировка регистров. Разверните его свойства и найдите ветку Движения. В этой ветке перечислены абсолютно все регистры (накопления, сведений, бухгалтерии), по которым этот документ может создавать записи.
  2. Настраиваем роль в расширении. Вернитесь к созданной вами роли в расширении конфигурации. Вам нужно последовательно добавить в эту роль все регистры из списка, полученного на первом шаге. Для каждого регистра необходимо выдать права на Чтение, Добавление и Изменение.

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

  3. Проверяем результат. Сохраните расширение, обновите конфигурацию базы данных и запустите 1С в режиме предприятия под тестовым пользователем. Теперь, при добавлении строки в документе Корректировка регистров, поле Период должно быть доступно для редактирования.

Этот метод полностью решает проблему, хотя и требует некоторой "ручной" работы по добавлению всех необходимых объектов в роль.

Решение 2: Создание специализированного документа

Этот подход является хорошей архитектурной альтернативой, особенно если корректировка требуется только для одного-двух конкретных регистров, а доступ к универсальному инструменту не нужен.

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

Преимущества такого подхода:

Как реализовать:

  1. Создайте в расширении новый документ, например, КорректировкаТоваровК_Оформлению.
  2. Добавьте в него табличную часть, состав колонок которой будет соответствовать измерениям, ресурсам и реквизитам регистра Товары к оформлению излишков и недостач.
  3. В модуле объекта документа, в процедуре ОбработкаПроведения, напишите код, который будет формировать движения по нужному регистру на основе данных из табличной части.
  4. Создайте для этого документа простую форму.
  5. В вашей роли дайте права только на этот новый документ и на целевой регистр.

Этот способ требует больше времени на разработку, но в долгосрочной перспективе делает систему более надежной и простой в администрировании.

Решение 3: Диагностика с помощью Технологического журнала

Если вы столкнулись с подобной проблемой, но не можете определить, на какой именно объект не хватает прав, на помощь придет мощный инструмент — Технологический журнал (ТЖ).

  1. Настройте ТЖ. Вам нужно создать файл logcfg.xml и настроить его на отслеживание событий доступа к базе данных (SDBL). Установите фильтр по имени пользователя или ID сеанса, чтобы не собирать лишнюю информацию.
  2. Воспроизведите ошибку. Запустите сеанс пользователя и выполните действия, которые приводят к блокировке поля.
  3. Проанализируйте логи. В файлах логов ТЖ ищите записи с упоминанием "ACCESS.DENIED" или обращения к таблицам метаданных (например, _AccumRgChngR), которые происходят непосредственно перед ошибкой. Таким образом вы сможете точно определить, к какому регистру или другому объекту система пыталась обратиться и получила отказ в доступе.

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

Подведем итог: проблема с блокировкой поля Период в документе Корректировка регистров — это не ошибка, а особенность работы платформенного механизма прав для универсальных, динамически настраиваемых объектов. Для ее решения необходимо обеспечить наличие у пользователя прав на все потенциальные движения документа, даже если он работает только с одним из них.

← На главную