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