gifts2017

Ограничение формирования стандартных отчётов некоторым набором счетов

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

В стандартных средствах платформы 7 нет возможности ограничить доступ к отчётам только определёнными счетами, хотя вопрос этот периодически возникает.
Предложено решение, позволяющее путём небольших переделок типовой конфигурации внедрить механизм ограничения выбора счёта в стандартном отчёте и относительно легко настраивать его для новых пользователей.
В стандартных средствах платформы 7 нет возможности ограничить доступ к отчётам только определёнными счетами, хотя вопрос этот периодически возникает. Для организации такого разграничения понадобятся небольшие доработки стандартных алгоритмов. Прежде всего во все отчёты, в которых мы хотим конкретному пользователю разрешить выбирать конкретные счета, в процедуру ПриНачалеВыбораЗначения(ИдентЭлемДиалога,Флаг) добавим:
Если ИдентЭлемДиалога = "Счет" Тогда
Если
глКонтролироватьСчета = 0 Тогда
Флаг = 1;
Иначе
Флаг = 0;
Счет = глДоступныйСчет();
ПриВыбореСчета();
КонецЕсли;
КонецЕсли;
Таким образом мы в зависимости от значения переменной глКонтролироватьСчета перенаправим выбор счета в функцию глДоступныйСчет(). Теперь разберёмся с глобальным модулем. Вставим в него описание двух переменных
// Определение переменных
Перем глКонтролироватьСчета Экспорт;
Перем глСписокСчетов;
(глСписокСчетов будет списком значений, содержащих доступные счета) и функцию глДоступныйСчет()
//Функция глДоступныйСчет() - располагается в любом месте ГМ
Функция глДоступныйСчет() Экспорт
Перем
сч;
Если глСписокСчетов.РазмерСписка()>0 Тогда
глСписокСчетов.ВыбратьЗначение(сч);
Иначе
сч = ПолучитьПустоеЗначение("Счет");
КонецЕсли;
Возврат(сч) ;
Теперь определим значение глКонтролироватьСчета и заполним глСписокСчетов. Сделаем это в процедуре ПриНачалеРаботыСистемы(). Используем одну хитрость. Если мы ограничиваем пользователю формирование каких-либо отчётов, то, естественно, нам придётся создавать для него новый набор прав. (Как минимум, мы запретим ему запуск любых внешних отчётов, использование шахматки - её-то списком счетов не ограничишь, ну и скорее всего ещё урежем его в правах.) Название нового набора прав будет состоять из слова "Только" и списка счетов через запятую. Например - "Только41,60,62". Используя этот нехитрый приём, мы обеспечим работу нашей системы ограничения стандартных отчётов для любого нового пользователя (например, "Только70,68,69", "Только50.51" и т.д.).
глСписоксчетов = СоздатьОбъект("СписокЗначений");
глКонтролироватьсчета = 1;
НаборПрав = НазваниеНабораПрав(1);

Если СокрЛП(НаборПрав)="" Тогда
ИначеЕсли
Лев(СокрЛП(НаборПрав),6)="Только"
Прочитали название набора прав, если оно пустое (пользователь не авторизован) не делаем ничего, если же оно начинается со слова "Только", заполним глСписокСчетов. Для этого вычленим из названия набора прав значения кодов счетов. добавим их в список. Для счетов-групп добавим также все субсчета.
		_Состав = Сред(НаборПрав,7);
Пока СтрДлина(_Состав)>0 Цикл
_Состав = СокрЛП(_Состав);
ПозицияЗапятой = Найти(_Состав,",");
Если ПозицияЗапятой = 0 Тогда
НовоеЗначение = _Состав; _Состав = "";
ИначеЕсли ПозицияЗапятой = 1 Тогда
_Состав = Сред(_Состав,2);
Продолжить;
Иначе
НовоеЗначение = СокрЛП(Лев(_Состав,ПозицияЗапятой - 1));
Если ПозицияЗапятой<СтрДлина(_Состав) Тогда
_Состав = Сред(_Состав,ПозицияЗапятой + 1);
Иначе
_Состав = "";
КонецЕсли;
КонецЕсли;
ДобавляемыйСчет = СчетПоКоду(НовоеЗначение) ;
глСписоксчетов.ДобавитьЗначение(ДобавляемыйСчет,""+НовоеЗначение+" "+ДобавляемыйСчет.Наименование);
Если ДобавляемыйСчет.ЭтоГруппа()=1 Тогда
ЕщеСчета = СоздатьОбъект(\"Счет\");
ЕщеСчета.ИспользоватьРодителя(ДобавляемыйСчет);
ЕщеСчета.ВыбратьСчета();
Пока ЕщеСчета.ПолучитьСчет() = 1 Цикл
глСписоксчетов.ДобавитьЗначение(ЕщеСчета.ТекущийСчет(),""+ЕщеСчета.Код+" "+ЕщеСчета.Наименование);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Для ситуации. когда название набора прав определено, но не начинается словом "Только" установим глКонтролироватьСчета в ноль.
Иначе
глКонтролироватьСчета = 0;
КонецЕсли;
Таким образом, для всех пользователей с набором прав "Только" у нас будут сформированы списки доступных счетов, для прочих авторизованных пользователей контроль выбора счета будет отключен, а неавторизованные пользователи не смогут использовать эти стандартные отчёты вообще (у них при включённом контроле список доступных счетов будет пустой).

См. также

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

Комментарии

1. Артур Аюханов (artbear) 24.03.08 17:58
Странная схема, честно говоря, и очень много факторов неучтено :(
Например, есть реквизиты типа счет с именем КоррСчет и т.д.
Далее нафига в название роли засовывать названия счетов в качестве ограничения, когда можно сделать простой справочник, в котором названия привязать к счетам.
И т.д. и т.п. :(
2. Артур Аюханов (artbear) 24.03.08 18:01
Еще не проработан момент показа в каком-то отчете запрещенных счетов - например, для выбора в отчетах счет 70 запрещен, но его легко будет посмотреть, например, в отчетах по субконто и т.д.
3. TimeSoft (Timesoft) 25.03.08 11:11
Ну, во-первых, 20 стороками кода проблему разграничения доступа не решишь, задача стояла именно ограничить выбор счёта... Насчёт КоррСчет - принято. Добавим в ПриНачалеВыбораЗначения еще КоррСчет.
А зачем делать справочник, когда можно НЕ ДЕЛАТЬ ? Кроме того, в справочник надо не забывать добавить при появлении нового. Справочник надо закрыть от тех же пользователей...
Ну и если надо закрывать выбор субконто - это уже другая задача. Можно просто выкинуть этот отчёт у конкретного пользователя.
Вообще, по большому счёту, вся система разграничения в 7-ке - это защита от дурака, для гарантированного разграничения информации от УМНЫХ пользователей надо затратить несравненно больше усилий, чем здесь предложено, которые могут пойти на смарку в несколько секунд, когда этот умный пользователь залезет в папку базы данных...
4. Артур Аюханов (artbear) 25.03.08 11:22
(3) Я намекал, что лучше использовать не название, а проверять тип значения элемента :)
В названии может стоять все что угодно :)
5. Сhe Burashka (CheBurator) 25.03.08 22:34
а что мешает в поле выбора счета вбить код счета вручную...?
6. Maljaev (maljaev) 26.03.08 09:25
Мое мнение совпадает с artbear. Сталкивался с такой же проблемой, пришел к выводу что необходимо контролировать вывод каждого значения в ячейках и даже более того. Легче наверное написать стандартные отчеты с нуля, учитывая контроль прав на счета и субконто, чем лопатить существующие.
7. Слава123 (Слава123) 26.03.08 23:47
Достаточно жизнеспособная идея, если не разрабатывается параноидальная система защиты от утечки комерческой информации :))))
8. Сhe Burashka (CheBurator) 27.03.08 00:24
(7) не прокатит... достаточно изредка фоткать мобильником экраны пользователей с более широкими правами...
9. TimeSoft (Timesoft) 27.03.08 11:23
(5) Помешаем ! Ставим на поле Счет (ну и КоррСчет) флаг "Запретить редактирование", ручками вводить нельзя, а выбор из списка работает !
10. TimeSoft (Timesoft) 27.03.08 11:31
(8) Мобильники отнимать на входе в здание ! ...или просматривать фотографии на выходе!
А если серьёзно - эта идея позиционируется как достаточно простое и эффективное решение в объёме "защиты от дурака".
(6) А что помешает пользователю (умному) открыть папку базы.. и через 30 секунд добавить нового пользователя с полными правами, получить какие надо отчёты и вернуть всё на место ? Или вообще просто утащить базу?
11. Maljaev (maljaev) 27.03.08 17:11
(10) "А что помешает пользователю..." - помешает администратор сети, если ему не все "по барабану".
12. TimeSoft (Timesoft) 28.03.08 11:22
(11) Например ? Предложите способ сделать это при отсутствии выделенного сервера. Да и при наличии сомневаюсь я что-то...
13. Maljaev (maljaev) 31.03.08 12:20
При отсутствии сервера не предложу. При наличии терминал-сервера многое можно сделать, хотя дыры при желании всегда найдутся. Но все-таки на терминалке штатными средствами администрирования и нештатными компонентами под 1С и утилитами можно 99% дыр позакрывать. Правда потребуется много времени и фантазии. Я помню, то ли статья была, то ли ветка в форуме, где были описаны многие дыры 1С и способы как их закрыть.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа