gifts2017

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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