Почему нет кнопки "Записать и закрыть" в дополнительных настройках ЗУП 3.1 у пользователя без полных прав?

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

При настройке прав доступа в конфигурациях на базе БСП (например, ЗУП 3.1, ERP, КА) администраторы и программисты часто сталкиваются с ситуацией, когда пользователю даны права на редактирование объекта (регистра или справочника), но в интерфейсе отсутствуют кнопки сохранения изменений. В частности, распространен сценарий, когда необходимо дать доступ к форме "Дополнительные настройки" (меню Настройка), чтобы пользователь мог управлять опциями вроде "Показывать взаиморасчеты", но при этом не выдавать ему роль "Полные права".

Разберем подробно, почему при наличии прав на регистр сведений кнопка "Записать и закрыть" исчезает, почему копирование роли администратора не помогает, и какие способы решения этой задачи существуют.

Диагностика проблемы

Рассмотрим исходную ситуацию. Вы решили предоставить пользователю возможность менять настройки программы, хранящиеся в регистре сведений ДополнительныеНастройкиЗарплатаКадры. Вы выполнили следующие действия:

  1. Создали профиль групп доступа или отдельную роль.
  2. Включили права на Изменение для регистра сведений ДополнительныеНастройкиЗарплатаКадры.
  3. Пользователь успешно открывает форму настроек.

Однако, несмотря на наличие прав доступа к данным, на форме отсутствует стандартная кнопка "Записать и закрыть". При этом добавление роли ПолныеПрава моментально возвращает кнопку на место.

Попытка скопировать роль ПолныеПрава в новую роль (например, ПолныеПрава2) и назначить ее пользователю также не приводит к успеху — кнопка все равно отсутствует. Это говорит о том, что проверка прав выполняется не только на уровне платформы (галочки в ролях), но и на программном уровне конфигурации.

Причина 1: Особенности работы стандартных команд формы

В управляемых формах видимость стандартных кнопок (Записать, Провести, Удалить) определяется платформой автоматически. Платформа анализирует:

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

Решение 1: Настройка использования команды (Самый быстрый способ)

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

Разберем этот метод по шагам:

  1. Создайте расширение конфигурации (если не хотите менять основную).
  2. Заимствуйте в расширение форму настройки (в данном случае это общая форма или форма списка/записи регистра ДополнительныеНастройкиЗарплатаКадры).
  3. Перейдите на вкладку Команды или в дерево элементов формы.
  4. Найдите стандартную команду ЗаписатьИЗакрыть (или кнопку, связанную с ней).
  5. В свойствах элемента формы (кнопки) или самой команды обратите внимание на свойство Использование (Usage) или Видимость.
  6. Вместо значения Авто попробуйте установить явное значение или проверьте настройки видимости по ролям.

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

Решение 2: Использование расширения и привилегированного режима

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

Суть метода заключается в том, чтобы дать пользователю интерфейс, а саму запись выполнять "от имени" системы, минуя проверки прав.

Порядок действий:

  1. Создайте расширение и добавьте в него нужную форму.
  2. Добавьте на форму свою собственную кнопку "Сохранить настройки".
  3. Назначьте кнопке команду с вызовом серверной процедуры.
  4. В серверной процедуре используйте привилегированный режим.

Пример кода для модуля формы в расширении:


&НаКлиенте
Процедура Расш1_СохранитьНастройки(Команда)
    Расш1_СохранитьНастройкиНаСервере();
    Закрыть();
КонецПроцедуры

&НаСервере
Процедура Расш1_СохранитьНастройкиНаСервере()
    // Устанавливаем режим, игнорирующий проверки прав доступа
    УстановитьПривилегированныйРежим(Истина);
    
    // Здесь код записи набора записей регистра или сохранения данных формы
    // Например, для регистра сведений:
    НаборЗаписей = РегистрыСведений.ДополнительныеНастройкиЗарплатаКадры.СоздатьНаборЗаписей();
    // ... заполнение отбором и данными из реквизитов формы ...
    НаборЗаписей.Записать();
КонецПроцедуры

Важное замечание: При использовании расширений убедитесь, что в свойствах расширения снят флажок "Безопасный режим", иначе команда УстановитьПривилегированныйРежим(Истина) будет проигнорирована платформой.

Почему не помогло копирование роли "Полные права"?

Многие пытаются решить проблему, копируя роль ПолныеПрава и пытаясь урезать её. Давайте разберем, почему это часто не срабатывает. Это важный теоретический момент.

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


Функция ЭтоПолноправныйПользователь(Пользователь = Неопределено) Экспорт
    // ...
    Если РольДоступна("ПолныеПрава") Или РольДоступна("СистемныйАдминистратор") Тогда
        Возврат Истина;
    КонецЕсли;
    // ...
КонецФункции

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

Именно поэтому при открытии формы срабатывает код ПриСозданииНаСервере, который проверяет функцию ЭтоПолноправныйПользователь(). Получая Ложь, код принудительно устанавливает элементам формы режим ТолькоПросмотр или скрывает командную панель.

Как проверить реальные права доступа к данным?

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

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

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

Резюме

Для решения задачи "дать доступ к настройкам без полных прав":

  1. Проверьте права на регистр: Создайте роль с правом "Изменение" на ДополнительныеНастройкиЗарплатаКадры.
  2. Проверьте UI: Если кнопки нет, попробуйте принудительно включить видимость команды "Записать и закрыть" в свойствах формы через расширение.
  3. Используйте обходной путь: Если стандартная форма блокируется программным кодом БСП, создайте в расширении свою кнопку сохранения с использованием УстановитьПривилегированныйРежим(Истина).
← На главную