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