8.х Закрыть доступ к документам

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем iliko, 18 фев 2010.

  1. TopicStarter Overlay
    iliko
    Offline

    iliko Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    136
    Симпатии:
    0
    Баллы:
    26
    т.е собственно как в теме
    для друга быстренько сделал
    может еще кому понадобится

    Код:
    
    Функция ЗаполнитьГруппыПользователя(Пользователь) Экспорт 
    
    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("ТекПользователь", Пользователь);
    Запрос.УстановитьПараметр("ВсеПользователи", Справочники.ГруппыПользователей.ВсеПользователи);
    
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |	ГруппыПользователей.Ссылка КАК Группа,
    |	ГруппыПользователей.АдминистраторГруппы КАК АдминистраторГруппы,
    |	ВЫБОР
    |		КОГДА ТЧПользователиГруппы.Пользователь ЕСТЬ NULL 
    |			ТОГДА 0
    |		ИНАЧЕ 1
    |	КОНЕЦ КАК Флаг,
    |	Истина КАК ВсеСтроки
    |ИЗ
    |	Справочник.ГруппыПользователей КАК ГруппыПользователей
    |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыПользователей.ПользователиГруппы КАК ТЧПользователиГруппы
    |		ПО ТЧПользователиГруппы.Ссылка = ГруппыПользователей.Ссылка
    |			И (ТЧПользователиГруппы.Пользователь = &ТекПользователь)
    |ГДЕ
    |	ГруппыПользователей.Ссылка <> &ВсеПользователи
    |
    |УПОРЯДОЧИТЬ ПО
    |	Группа ИЕРАРХИЯ";
    
    ДеревоГрупп = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    ОтметитьСвязныеГруппы(ДеревоГрупп.Строки);
    
    Возврат ДеревоГрупп; 
    
    КонецФункции 
    
    Функция ОтметитьСвязныеГруппы(Строки, РодительскаяОтметка = Ложь) Экспорт 
    
    БылиОтметки = Ложь;
    Для каждого Строка Из Строки Цикл
    
    Если Строка.Флаг = 2 Тогда
    Строка.Флаг = 0;
    КонецЕсли; 
    
    
    Если РодительскаяОтметка и Строка.Флаг = 0 Тогда
    Строка.Флаг = 2;
    КонецЕсли;
    
    БылиПодчиненныеОтметки = ОтметитьСвязныеГруппы(Строка.Строки, РодительскаяОтметка или Строка.Флаг = 1);
    
    Если БылиПодчиненныеОтметки и Строка.Флаг = 0 Тогда
    Строка.Флаг = 2;
    КонецЕсли;
    
    БылиОтметки = БылиОтметки или БылиПодчиненныеОтметки или Строка.Флаг = 1;
    
    КонецЦикла;
    
    Возврат БылиОтметки;
    
    КонецФункции
    
    Функция ВернутьСписокАдминистраторовГруппы(ДеревоГрупп) Экспорт 
    СписокАдминистраторов = Новый СписокЗначений; 
    Для каждого стрДерева из ДеревоГрупп.Строки цикл 
    Если СтрДерева.Флаг <> 0 тогда 
    СписокАдминистраторов.Добавить(СтрДерева.АдминистраторГруппы);
    КонецЕсли;	
    КонецЦикла;	
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/конецфункции')">КонецФункции	</span>
    
    
    Функция ЕстьДоступКДокументу(ДокСсылка, Пользователь) Экспорт 
    
    Попытка 
    Если ДокСсылка.Ответственный =  Пользователь тогда 
    Возврат Истина; 
    ИначеЕсли ДокСсылка.Ответственный = Справочники.Пользователи.ПустаяСсылка() тогда 
    Возврат Истина; 
    Иначе 
    ДеревоГрупп = ЗаполнитьГруппыПользователя(ДокСсылка.Ответственный); 
    АдминистраторыДокумента = ВернутьСписокАдминистраторовГруппы(ДеревоГрупп); 
    Если АдминистраторыДокумента.НайтиПоЗначению(Пользователь) = Неопределено тогда 
    Возврат Ложь; 
    Иначе 
    Возврат Истина; 
    КонецЕсли;	
    КонецЕсли;  	
    Исключение 
    КонецПопытки;
    
    КонецФункции
    
    
    
  2. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!
    А зачем данный лисипед :unsure:
    Не проще воспользоваться приработанным механизмам и настроить на уровне прав. В сто крат проще и без проволочек.
  3. TopicStarter Overlay
    iliko
    Offline

    iliko Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    136
    Симпатии:
    0
    Баллы:
    26
    Вставить в закрываемые документы код

    Код:
    // Процедура - обработчик события "ПередОткрытием" формы.
    //
    Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    // *************************************
    Если НЕ ОбщегоНазначения.ЕстьДоступКДокументу(Ссылка, глЗначениеПеременной("глТекущийПользователь")) тогда  
    Отказ = Истина;
    КонецЕсли;        
    // *************************************
    
    
    
  4. TopicStarter Overlay
    iliko
    Offline

    iliko Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    136
    Симпатии:
    0
    Баллы:
    26
    Может быть
    но я виноват не описал задачу
    надо чтобы в документ можно было зайти только
    Автору документа и его начальнику / начальникам
    либо его пользовательской группе

    Т.е. деление не по типу документа , не по организации
    а именно по автору и его начальникам
  5. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    И опять же повторю вопрос, а зачем программно то, все эти условия я выполню в настройке прав, что будет красивее, практичней и раз в дцать быстрее.
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    iliko,
    Обращаться через точку к реквизиту по ссылке - моветон.
    Вызывает чтение всего объекта в память, инициализацию объекта и прочее.
    Если документ большой (например, ОПзС) - это ахтунг.
    Лучше делать минизапрос, а еще лучше - реализовать на уровне RLS

Поделиться этой страницей