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