Однако очень хочется разграничить не только (и не столько) права на объект в целом, но и на некоторые действия над ним из диалогов форм. А также не на все объекты данного вида, а только на некоторые.
"B16_ФормаЭлемента". В справочник Элементы вносим идентификаторы элементов диалога в виде текста.
При начале работы система по имени определяет текущего пользователя, находит его в справочнике Пользователи (если не находит, то заводит нового) и сохраняет ссылку на текущий элемент в глобальной переменной ( в ТиС 9.х - глПользователь). Теперь достаточно при открытии любой формы найти ее в справочнике Формы и установить доступность согласно реквизиту Доступность (число: 1 или 0) справочника Элементы.
Примечания:
* Для того, чтобы каждый раз не вводить руками все элементы подчиненных справочников, их можно скопировать вместе с элементом-родителем при помощи обработки Копирование ветки справочника. назад
** Можно воспользоваться отчетом: Просмотрщик внутренних кодов объектов агрегатного типа. назад
наверх
Реализация стандартными методами.
В глобальном модуле пропишем процедуры установки доступности форм и элементов:
Функция УстановкаФормы(Конт, Имя) Экспорт
Перем Спр;
Спр=СоздатьОбъект("Справочник.Формы");
Спр.ИспользоватьВладельца(глПользователь);
Если Спр.НайтиПоНаименованию(Имя)=1 Тогда
// поиск текущей формы в справочнике
Конт=Спр.ТекущийЭлемент();
Возврат 1;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента
Возврат 0;
КонецЕсли;
КонецФункции
Функция УстановкаДоступности(Конт, Имя) Экспорт
Спр=СоздатьОбъект("Справочник.Элементы");
Спр.ИспользоватьВладельца(Конт);
Если Спр.НайтиПоНаименованию(Имя)=1 Тогда
Возврат Спр.Доступность;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента
Возврат 0; // т.е. если доступ не описан, то запрещен (по умолчанию)
КонецЕсли;
КонецФункции
В каждый модуль пропишем следующий код
Перем Конт;
Процедура ПриОткрытии()
Если УстановкаФормы(Конт, "B12_ФормаСписка")=0 тогда
// здесь: B12_ФормаСписка - это идентификатор формы
// B - справочник
// 12 - ID вида справочника
// ФормаСписка - наименование формы
// По этому идентификатору будет осуществляться поиск в справочнике Формы
СтатусВозврата(0);
Возврат;
КонецЕсли;
Форма.Кнопка.Доступность(УстановкаДоступности(Конт, "Кнопка"));
// здесь: Кнопка - это идентификатор элемента формы
// т.к. нет возможности перебрать все элементы в цикле, то придется описывать каждый элемент
КонецПроцедуры
Если требуется скрывать некоторые элементы на форме, тогда потребуется ввести еще один атрибут в справочник Элементы: Видимость. Однако, видимостью управлять сложнее, так как при использовании многослойных форм включение слоя автоматически включает видимость помещенных на него элементов (при этом доступность не изменяется). Чтобы корректно отработать управление видимостью, придется вникать в логику программы. Однако, есть способ попроще.
На форму помещаем текст с формулой Контроль() (текст должен быть виден всегда, т.е. находиться в постоянно отображаемом слое или его видимость должна устанавливаться принудительно), а в текст модуля
Функция Контроль()
// т.к. нет возможности перебрать все элементы в цикле, то придется описывать каждый элемент
// в целом, функции "УстановкаВидимости" и "УстановкаДоступности" аналогичны.
Если УстановкаВидимости(Конт, "Кнопка")=0 тогда
// т.о. если нужно скрыть, то скрываем
Форма.Наименование.Видимость(0);
КонецЕсли;
Возврат "";
КонецПроцедуры
Таким образом, элементы на форме будут скрываться при каждом обновлении и не придется разбираться и править программное управление видимостью в модулях, которые могут быть довольно сложны в многослойных формах.
Для повышения скорости работы функции, можно создать список принудительно скрываемых реквизитов (однократно выбрав из справочника Элементы) и далее работать без вызова глобальной функции УстановкаВидимости().
Вот пример для формы ФормаСписка справочника 12: элемент (колонка) Код невидим, элемент Кнопка виден и недоступен.

Как видно, стандартные методы, реализованные на платформе 1С:Предприятие 7.7, не обладают достаточной гибкостью. Необходимо описывать доступность/видимость всех элементов формы, которым предполагается управлять.
Примечание
На самом деле, есть возможностьне управлять доступностью и видимостью в цикле. Реализуется это следующим образом:-
создаем обработку, в модуле директива #ЗагрузитьИзФайла;
-
программно создаем текст модуля для этой обработки;
Процедура ПриОткрытии()
Конт=Форма.Параметр;
// пример текста:
Конт.Кнопка.Доступность(1);
СтатусВозврата(0);
КонецПроцедуры
-
записываем текст модуля в файл
-
программно открываем форму этой обработки, в качестве параметра передаем контекст обрабатываемой формы
наверх
Используем внешнюю компоненту.
Для доступа и управления элементами формы можно воспользоваться компонентой FormEx, автор: Алексей Федоров aka АЛьФ. Эта компонента значительно расширяет методы работы с элементами формы.
На эту тему есть статья, автор Куклин Андрей ОсОО «Практика», Бишкек, Кыргызстан.
наверх
Ограничение действий пользователя.
В стандартной ТиС 9.х контроль некоторых действий реализован при помощи справочника ПолномочияПользователей. С его помощью отслеживались такие действия:
-
Разрешить редактирование таблиц
-
Разрешить продавать резерв
-
Разрешить превышение кредита
-
Разрешить редактирование цен в документах
-
Разрешить печать непроведенных документов
Но опять-таки нет возможности отследить, чтобы пользователь, не мог, например, вводить элементы в определенную группу справочника или не мог изменить "не свои" документы...
Для того, чтобы ограничить действия пользователя, необходимо их как-то идентифицировать.
Создадим еще один справочник Действия, также подчиненный справочнику Формы. В реквизит Действие будем записывать число; 1-действие разрешено, 0-запрещено.
В глобальном модуле пишем
Функция УстановкаПрав(Конт, Имя) Экспорт
Спр=СоздатьОбъект("Справочник.Действия");
Спр.ИспользоватьВладельца(Конт);
Если Спр.НайтиПоНаименованию(Имя)=1 Тогда
Возврат Спр.Действия;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента
Возврат 0; // т.е. если действие не описно, то запрещено (по умолчанию)
КонецЕсли;
КонецФункции
В модуле формы документа:
Процедура ВводНового(Признак, Объект)
Если УстановкаПрав(Конт, "ВводНового")=0 тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Признак=1 тогда
Если УстановкаПрав(Конт, "КопированиеДокумента")=0 тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
Автор=ГлПользователь;
КонецПроцедуры
Процедура ПриЗаписи()
Если ТекущийДокумент().Выбран()=1 тогда
Если УстановкаПрав(Конт, "ЗаписьСуществующего")=0 тогда
СтатусВозврата(0);
КонецЕсли;
Иначе
Если УстановкаПрав(Конт, "ЗаписьНового")=0 тогда
СтатусВозврата(0);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
УстановкаФормы(Конт, "O14_Форма");
Вот и простейшее управление формой. Отследить можно любое действие, описываемое предопределенными процедурами (открытие, ввод нового, копирование, запись, проведение и отмену проведения документа и т.д).

Для накладывания различных условий, нужно добавить в справочник Действия реквизит Объект (неопределенного типа).
Функция УстановкаПрав(Конт, Имя) Экспорт
Спр=СоздатьОбъект("Справочник.Действия");
Спр.ИспользоватьВладельца(Конт);
Если Спр.НайтиПоНаименованию(Имя)=1 Тогда
Имя=Спр.ТекущийЭлемент();
Возврат 1;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента
Возврат 0; // т.е. если действие не описно, то запрещено (по умолчанию)
КонецЕсли;
КонецФункции
Теперь функция вернет в вызывающий модуль найденнный элемент справочника Действия для доступа к его реквизитам. Это позволит, например, автоматически устанавливать отбор по объекту в общем журнале документов или форме списка справочника.
Действие="УстанавливатьОтбор";
Если УстановкаПрав(Конт, Действие)=1 тогда
Если Действие.Объект.Выбран()=1 Тогда
УстановитьОтбор("Автор", Действие.Объект);
КонецЕсли;
КонецЕсли;
Ну и для большего прикола, внесем еще один реквизит: Шаблон (строка подходящей длины). Шаблон можно обрабатывать при попощи функции
Шаблон("["+Спр.Шаблон+"]");
Суть данного метода вот в чем. Функция вычисляет выражение в скобках и возвращает строку, которую можно анализировать на равенство/неравенство. Например:
Если Шаблон("["+Спр.Шаблон+"]")="1" Тогда
Обработку выбора реквизита в формах делаем так.
Процедура ПриНачалеВыбораЗначения(ЭлементДиалога, ФлагСтандОбр)
// навеяно обсуждением на Т1С "Как открыть группу справочника?"
Спр=СоздатьОбъект("Справочник.Элементы");
Спр.ИспользоватьВладельца(ID_);
Если Спр.НайтиПоНаименованию(ЭлементДиалога) = 1 Тогда
// ТипВид - это тип и вид значения реквидита что-то типа"Справочник.Контрагенты"
Что=Спр.ТипВид;
Конт="";
Если Лев(Что,10)="Справочник" Тогда
// открываем заранее разрешенную для выбора группу
ОткрытьФорму(Что,Конт);
Конт.ИспользоватьРодителя(Спр.Объект,0);
ИначеЕсли Лев(Что,8)="Документ" Тогда
// используется для выбора
ОткрытьФорму("Журнал.ДляВыбора",Конт);
Конт.УстановитьОтбор(Прав(Что,СтрДлина(Что)-9),Спр.Объект);
КонецЕсли;
ФлагСтандОбр=0;
КонецЕсли;
КонецПроцедуры
Вот так выглядит форма настройки действий.
В шаблон можно вносить несложные условия, например: ТекущийЭлемент().ЭтоГруппа()
Или даже действия: ИспользоватьРодителя(Спр.Объект,0) (имеет смысл при открытии формы списка справочника: в данном случае для пользователя установится режим просмотра только конкретной группы).

А это настройки элементов формы.
Отбор устанавливается
-
для справочника: по группе справочника;
-
для документа:
-
по виду документа
-
по значению общего реквизита документа
-
по значению графы отбора.
Фильтр по: служит для описания объекта, по которому осуществляется отбор.
наверх
Пример конфигурации можно скачать здесь.