Как программно скрыть кнопку "Записать и закрыть" в управляемой форме 1С?

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

В процессе разработки конфигураций на платформе 1С часто возникает задача ограничить действия пользователя в зависимости от его роли или состояния документа. Для ускорения и стандартизации таких задач удобно использовать общий модуль для программного изменения форм. Одной из типовых задач является скрытие стандартной кнопки "Записать и закрыть". Рассмотрим подробнее, как это реализовать правильно и какие нюансы стоит учитывать.

Способ 1. Программное управление видимостью через коллекцию Элементы

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

Разберем пример кода, который можно разместить в процедуре ПриСозданииНаСервере или в обработчике, срабатывающем при изменении данных:


Если ПроверитьРольПользователя("Сотрудник") И Объект.Статус = Перечисления.СтатусыДокументов.Завершен Тогда
    // Для документов без проведения
    Элементы.ФормаЗаписатьИЗакрыть.Видимость = Ложь;
    
    // Для документов с проведением (если нужно скрыть и её)
    // Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь;
КонецЕсли;

Способ 2. Усиление защиты через ПользовательскаяВидимость

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


Элементы.ФормаЗаписатьИЗакрыть.ПользовательскаяВидимость = Ложь;

Способ 3. Использование свойства формы "ТолькоПросмотр"

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


ЭтаФорма.ТолькоПросмотр = Истина;

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

Способ 4. Архитектурный подход через Функциональные опции

Рассмотрим более "чистый" метод, не требующий написания кода в каждой форме. В 1С предусмотрен механизм Функциональных опций (ФО). Мы можем создать ФО, привязанную к параметру сеанса (например, "РазрешитьРедактированиеДокументов"), и в свойствах кнопки на форме указать эту опцию в поле "Путь к данным функциональной опции". В этом случае платформа сама будет управлять отображением кнопки на основе прав или настроек системы.

Важные замечания по безопасности

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

Для полной гарантии того, что данные не будут записаны, мы рекомендуем всегда дублировать проверки в модуле объекта в процедуре ПередЗаписью:


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

Таким образом, мы обеспечиваем комплексную защиту: скрываем лишние элементы управления для удобства пользователя и блокируем несанкционированную запись на уровне базы данных.

← На главную