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