Управление доступностью реквизитов на форме документа 1С: Предприятие 8.1

Опубликовал Сергей * (koshak84) в раздел Программирование - Практика программирования

В большом предприятии с большим числом пользователей часто возникает необходимость в каком либо документе для какого либо отдела/группы пользователей заблокировать те или иные элементы формы. Для того чтобы данная задача могла решаться быстро и без внесения изменений в конфигурацию был написан небольшой модуль, который с некоторыми изменениями может работать с любой конфигурацией.

Основой данного дополнения стал справочник ЗАБЛОКИРОВАННЫЕ ЭЛЕМЕНТЫ ФОРМЫ. Данный справочник содержит элементы со списком блокируемых элементов. Справочник имеет следующую структуру шапки:
ДОКУМЕНТ – имя документа (как оно задано в конфигурации) для которого нужно блокировать элементы формы.
ОТДЕЛ – отдел, для которого будут блокироваться элементы.

Так же у справочника имеется табличная часть РЕКВИЗИТЫ со следующими колонками:
РЕКВИЗИТ ФОРМЫ – имя реквизита на форме так, как оно задано в конфигурации (для колонок табличных частей нужно полностью писать путь. Например, Таблица1.Колонки.Товар).
ЗАБЛОКИРОВАТЬ – признак того, что данный элемент будет в «режиме только просмотр».
НЕВИДИМЫЙ – признак того, что данный элемент будет скрыт.

В шапку справочника можно добавить дополнительные реквизиты, в зависимости от текущих требований блокировки формы, например, по отдельным пользователям. Или же добавить название формы документа, для которой следует блокировать элементы.

Далее, в форме документа необходимо определить процедуру ЗаблокироватьЭлементыФормы()
и описать ее вызов в процедуре формы ПриОткрытии()
.

Текст процедуры блокировки элементов:



Процедура ЗаблокироватьЭлементыФормы() Экспорт

   
Запрос = Новый Запрос;
   
Запрос.УстановитьПараметр("ОтделПользователя", Справочники.Отделы.Склад);
   
Запрос.УстановитьПараметр("Документ", ЭтотОбъект.Метаданные().Имя);
   
Запрос.Текст = "
    |ВЫБРАТЬ
    |   ЗаблокированыеЭлементыФормы.РеквизитФормы КАК РеквизитФормы,
    |   ЗаблокированыеЭлементыФормы.Заблокировать КАК Заблокировать,
    |   ЗаблокированыеЭлементыФормы.Невидимый     КАК Невидимый
    |ИЗ
    |   Справочник.ЗаблокированыеЭлементыФормы.Реквизиты КАК ЗаблокированыеЭлементыФормы
    |ГДЕ
    |   ЗаблокированыеЭлементыФормы.Ссылка.Отдел = &ОтделПользователя
    |   И ЗаблокированыеЭлементыФормы.Ссылка.Документ = &Документ"
;

   
Результат = Запрос.Выполнить().Выгрузить();

    Для Каждого
ТекСтрока Из Результат Цикл

       
СтрокаРеквизита = ТекСтрока.РеквизитФормы;
       
ЭлементФормы = ЭлементыФормы;

        Пока Истина Цикл
           
ПозицияТочки = Найти(СтрокаРеквизита, ".");
            Если
ПозицияТочки <> 0 Тогда
               
РеквизитДоТочки = Лев(СтрокаРеквизита, ПозицияТочки-1);
               
ЭлементФормы = ЭлементФормы[РеквизитДоТочки];
               
СтрокаРеквизита = Прав(СтрокаРеквизита, СтрДлина(СтрокаРеквизита)-ПозицияТочки);
            Иначе
               
ЭлементФормы = ЭлементФормы[СтрокаРеквизита];
                Прервать;
            КонецЕсли;
        КонецЦикла;

        Попытка
           
ЭлементФормы.ТолькоПросмотр = ТекСтрока.Заблокировать;
        Исключение
           
ЭлементФормы.Доступность = НЕ ТекСтрока.Заблокировать;
        КонецПопытки;

       
// Этого свойства нету у кнопок
       
Попытка
           
ЭлементФормы.Видимость = НЕ ТекСтрока.Невидимый;
        Исключение
           
ЭлементФормы.Доступность = НЕ ТекСтрока.Невидимый;
        КонецПопытки;

    КонецЦикла;

КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
Файл примера
.dt 22,81Kb
09.08.10
58
.dt 22,81Kb 58 Скачать

См. также

Комментарии
1. Александр Синцов (Sintson) 333 09.08.10 12:40 Сейчас в теме
Я в свое время в качестве хранилища настроек использовал регистр сведений, т.к. на мой взгляд его можно гибче настроить. В целом идея правильная, жаль что в 1Сv8 нельзя на форму подключить внешний обработчик событий без влезания в код.
Для 8.2 уже не актуально.
2. Misha ⁠ (Magister) 131 09.08.10 18:47 Сейчас в теме
Эх, помню маялся похожим - у меня список реквизитов формы заполнялся, и ещё можно было присваивать некоторым полям значения, которые не изменишь.
3. Serj (Serj1C) 461 10.08.10 07:01 Сейчас в теме
Попытка/Исключение не приветствую в коде.

Я люблю создавать структуру, а потом заполнять значения:
ЗаполнитьЗначенияСвойств(ЭлементФормы, Новый Струкутра("ТолькоПросмотр,Доступность,Видимость", ТекСтрока.Заблокировать, НЕ ТекСтрока.Заблокировать, НЕ ТекСтрока.Невидимый));
KroVladS; nixel; Valerich; artbear; +4 Ответить
Оставьте свое сообщение