В процессе разработки конфигураций на платформе 1С часто возникает задача ограничить действия пользователя в зависимости от его роли или состояния документа. Для ускорения и стандартизации таких задач удобно использовать общий модуль для программного изменения форм. Одной из типовых задач является скрытие стандартной кнопки "Записать и закрыть". Рассмотрим подробнее, как это реализовать правильно и какие нюансы стоит учитывать.
Самый быстрый и распространенный способ — это изменение свойства Видимость конкретного элемента формы. Чтобы точно определить имя элемента, можно использовать конструктор управляемых форм, однако важно помнить, что имя стандартной кнопки зависит от того, включено ли проведение у документа. Проанализируем, какое имя использовать:
ФормаЗаписатьИЗакрыть.ФормаПровестиИЗакрыть.Разберем пример кода, который можно разместить в процедуре ПриСозданииНаСервере или в обработчике, срабатывающем при изменении данных:
Если ПроверитьРольПользователя("Сотрудник") И Объект.Статус = Перечисления.СтатусыДокументов.Завершен Тогда
// Для документов без проведения
Элементы.ФормаЗаписатьИЗакрыть.Видимость = Ложь;
// Для документов с проведением (если нужно скрыть и её)
// Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь;
КонецЕсли;
Если у пользователя есть права на настройку формы (команда "Изменить форму"), он может самостоятельно вернуть скрытую кнопку. Чтобы изучить, как это выглядит со стороны пользователя, или быстро отредактировать свойства, пригодится редактор форм в режиме предприятия. Установка свойства ПользовательскаяВидимость в Ложь программным кодом полностью исключает кнопку из списка доступных элементов для пользователя.
Элементы.ФормаЗаписатьИЗакрыть.ПользовательскаяВидимость = Ложь;
Выясним причину, по которой простого скрытия кнопки может быть недостаточно. Даже если кнопка скрыта, пользователь может нажать горячие клавиши (например, Ctrl + Enter) или внести изменения через контекстное меню списка. В таких случаях стоит учитывать, что добавление и изменение элементов формы может быть реализовано и через расширения, но если логика задачи подразумевает, что документ вообще не должен редактироваться, правильнее будет установить свойство всей формы:
ЭтаФорма.ТолькоПросмотр = Истина;
Это автоматически скроет все кнопки редактирования и запретит изменение любых реквизитов, что является более надежным решением.
Рассмотрим более "чистый" метод, не требующий написания кода в каждой форме. В 1С предусмотрен механизм Функциональных опций (ФО). Мы можем создать ФО, привязанную к параметру сеанса (например, "РазрешитьРедактированиеДокументов"), и в свойствах кнопки на форме указать эту опцию в поле "Путь к данным функциональной опции". В этом случае платформа сама будет управлять отображением кнопки на основе прав или настроек системы.
Посмотрим на ситуацию с точки зрения надежности системы. Скрытие кнопок в интерфейсе — это лишь визуальное ограничение. Перед внедрением ограничений мы рекомендуем выполнить детальный анализ прав и ролей, чтобы убедиться в правильности настройки профилей пользователей. Также не забывайте про ограничение прав в списках, чтобы пользователи не могли обойти запреты через реестры документов.
Для полной гарантии того, что данные не будут записаны, мы рекомендуем всегда дублировать проверки в модуле объекта в процедуре ПередЗаписью:
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Статус = Перечисления.СтатусыДокументов.Завершен И НЕ РольДоступна("Администратор") Тогда
Сообщить("Редактирование завершенных документов запрещено!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Таким образом, мы обеспечиваем комплексную защиту: скрываем лишние элементы управления для удобства пользователя и блокируем несанкционированную запись на уровне базы данных.