Безопасность 1с 7.7

  • Автор темы IvanS
  • Дата начала
I

IvanS

#1
У меня 2 вопроса.
Можно сделать, что бы во всех журналах у конкретного пользователя показывались документы только по 3 определенным складам и н-ному количеству касс (тоже определенных).
Мне сказали сделать разделение ( визуальное) по группам складов и что бы 1 группа видела документы только относящиеся к ней.
Может кто уже сталкивался с такой проблемой, подскажите как лучше сделать?

И второе, есть ли в нете ( гуглил не нашел) надстройки для 1с, пускай даже платные для того что бы можно было запретить доступ к документам не просто опр вида, а по принципу того же склада. Т.е. пользователь из 1 группы с складом№1 не мог получить доступ к документам склада;2 относящегося ко второй группе или хотя бы мог только смотреть, но не изменить.
 

puh14

Well-known member
11.07.2008
1 412
0
#2
Что-то типа

Код:
Процедура ПриОткрытии()
Юзер=СокрЛП(Пользователь.Код);
Если Юзер<>"Администратор" Тогда
Если Юзер<>"Ирина" Тогда
Если Юзер<>"Людмила" Тогда
УстановитьОтбор("Менеджер",Юзер);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Процедура ПриПовторномОткрытии()
ПриОткрытии();
КонецПроцедуры
С доступом - то-же при открытии, только с выкидыванием, ежли пользователь не в той группе.
 
I

IvanS

#3
Ух ты, спасибо. А где почитать поподробнее?
Как я понял нужно будет это прописывать в глобальном модуле при открытии. И можно ли как-то привязаться не к имени пользователя а к набору его прав, которые устанавливаются в конфигураторе ?
 

puh14

Well-known member
11.07.2008
1 412
0
#4
Почитать в синтаксис-помошнике. Там просто установитьОтбор в документах живет - там внутри подграфа про списки журналов.
В глобальный это можно просто вынести, а жить должно в модулях формы журналов.
К набору прав можно привязаться через НазваниеНабораПрав(0)
 
I

IvanS

#5
Т.е. обойтись только правкой глобального модуля не получится? Там просто слишком много журналов, замучаюсь потом обновлять.

А набор прав так получать :

Юзер=СокрЛП(Пользователь.НазваниеНабораПрав)
 

puh14

Well-known member
11.07.2008
1 412
0
#6
а что глобальник? его к каждой форме не пришьешь.Надо в каждой форме журнала прописывать. Проще всего записать процедуру в глобальник, и прописать её вызов приоткрытии() журналов.
а пользовательские права получить проще
Юзер= СокрЛП(НазваниеНабораПрав(0));

у меня просто все пользователи в отдельный справочник забиты и при начале работы системы элемент справочника соответствующий пользователю, записывается в глобальную переменную пользователь.
Поэтому Пользователь.Код работает .
Так как скорее всего этого у тебя нет то проще как я написал выше.
 
I

IvanS

#7
У меня есть родной справочник 1с. Если бы там можно было джелать группы было бы замечательно еще проще, чем делать 10 однотипных прав пользователей ( просто название прав хотябы неизменно) а вот имена пользователй часто меняются.

И еще он мне не дает установить отбор. В модуле журнала при открытии прописал:

Код:
Процедура ПриОткрытии() 

ПриОткрытииИЛИПереоткрытииЖурнала("Открытие");

// будем отслеживать только реальные изменения этих реквизитов
Форма.ВидОтбора.ВыполнятьФормулуТолькоПриИзменении(1); 

Юзер = НазваниеНабораПрав (0);
Если Юзер<>"Постовалова" Тогда 
ПолучитьЗначение (ПолСправочник.Склады.Наименование)
УстановитьОтбор(Склад,"Постовалова 8");
Иначе	Если Юзер<>"Труда" Тогда
УстановитьОтбор(Склад,"Труда 5а");
КонецЕсли;
КонецЕсли;

КонецПроцедуры // ПриОткрытии()
При открытии пишет УстановитьОтбор(Склад,"Труда 5а") - значение неопределено

В ЖКК написано надо еще и прописать все виды документов. Даже при такой форме :

Код:
Процедура ПриОткрытии() 

ПриОткрытииИЛИПереоткрытииЖурнала("Открытие");

// будем отслеживать только реальные изменения этих реквизитов
Форма.ВидОтбора.ВыполнятьФормулуТолькоПриИзменении(1); 

Юзер = НазваниеНабораПрав (0);
Если Юзер<>"Постовалова" Тогда 
ПолучитьЗначение (ПолСправочник.Склады.Наименование)
УстановитьОтбор(Склад,"Постовалова 8");
Иначе	Если Юзер<>"Труда" Тогда
УстановитьОтбор(ПеремещениеТМЦ);
УстановитьОтбор(Склад,"Труда 5а");
КонецЕсли;
КонецЕсли;

КонецПроцедуры // ПриОткрытии()
все тоже самое
пытаюсь сделать общий журнал для начала, т.к. он самый используемый ими.
конфа комплексная 7.7 почти типовая :ph34r:
 

puh14

Well-known member
11.07.2008
1 412
0
#8
При открытии пишет УстановитьОтбор(Склад,"Труда 5а") - значение неопределено
конечно неопределено - первым должно идти строчное наименование реквизита( или тупо название отбора), а потом значение
СкладПостовалова = СоздатьОбъект("Справочник.Склады");
СкладПостовалова.НайтиПоНаименованию("Постовалова 8",0);

УстановитьОтбор("Склад",СкладПостовалова.ТекущийЭлемент());

Виды документов прописывать не надо - если у них всех есть общий реквизит склад.
Касательно справочника пользователей - добавь реквизит склад, в который будет проставляться с каким складом тот работает. Тогда будет выглядеть как

УстановитьОтбор("Склад",Пользователь.Склад);
А если склад пустой - то и отбора нету. То бишь для админа.
разумеется переменная пользователь(глобальная) должна заполняться в ПриНачалеРаботыСистемы() значением справочника пользователи.
 
I

IvanS

#9
При открытии пишет УстановитьОтбор(Склад,"Труда 5а") - значение неопределено
конечно неопределено - первым должно идти строчное наименование реквизита( или тупо название отбора), а потом значение
СкладПостовалова = СоздатьОбъект("Справочник.Склады");
СкладПостовалова.НайтиПоНаименованию("Постовалова 8",0);

УстановитьОтбор("Склад",СкладПостовалова.ТекущийЭлемент());

Виды документов прописывать не надо - если у них всех есть общий реквизит склад.
Касательно справочника пользователей - добавь реквизит склад, в который будет проставляться с каким складом тот работает. Тогда будет выглядеть как

УстановитьОтбор("Склад",Пользователь.Склад);
А если склад пустой - то и отбора нету. То бишь для админа.
разумеется переменная пользователь(глобальная) должна заполняться в ПриНачалеРаботыСистемы() значением справочника пользователи.

Ааааа.
А можно будет сделать не 1 а 5 условий отбора на один и тот же реквизит, и как он поведет себя если такого реквизита в документе не будет ( например в расх кассовом ордере нет склада)


Может правильнее будет создать какой-то доп справочник ( или добавить группу в справочник пользователей) и в ней дать возможность задавать необходимые реквизиты. ( мне нужны Склад, касса, Фирма, р/с)
И в глобальном модуле получать эти значения.
 

puh14

Well-known member
11.07.2008
1 412
0
#10
А можно будет сделать не 1 а 5 условий отбора на один и тот же реквизит, и как он поведет себя если такого реквизита в документе не будет ( например в расх кассовом ордере нет склада)
Что значит на один и тот-же реквизит? Ты имеешь ввиду что тип значение реквизита неопределен? энто я не знаю.
несколько отборов одновременно не пашут - только один, так что отобрать по пяти разным показателям энто мечта. Может с 1с++ и можно, я пока этим не занимался. Если реквизита нет выдаст сообщение об ошибке. Это тоже можно обойти использовав
попытка
исключение
конецпопытки;

Может правильнее будет создать какой-то доп справочник ( или добавить группу в справочник пользователей) и в ней дать возможность задавать необходимые реквизиты. ( мне нужны Склад, касса, Фирма, р/с)
И в глобальном модуле получать эти значения.
Доп справочник не нужен - проще либо добавить группы, в них групповыми реквизитами прописать Склад, касса, Фирма, р/с, либо групп не делать,просто добавить эти реквизиты, и выходить на них типа Пользователь.Склад
 

vbs

Well-known member
18.02.2007
1 708
1
#11
как он поведет себя если такого реквизита в документе не будет ( например в расх кассовом ордере нет склада)
Ну уж в этом-то проблемы нет - можно для каждого документа проверять наличие реквизита
типа такой функции
Function AttrExist(AttrName,DocKind)
var Attr;
if (EmptyValue(DocKind) = 1) OR (EmptyValue(AttrName) = 1) then
Return 0;
endif;
Attr = 0; InHead = "";
for i = 1 to MetaData.Document(DocKind).HeadAttribute() do
if TrimAll(MetaData.Document(DocKind).HeadAttribute(i).Identifier) = AttrName then
Attr = i; InHead = "InHead";
Break;
endif;
enddo;
if Attr = 0 then
for i = 1 to MetaData.Document(DocKind).TableAttribute() do
if TrimAll(MetaData.Document(DocKind).TableAttribute(i).Identifier) = AttrName then
Attr = i; InHead = "InTable";
Break;
endif;
enddo
endif;
Return Attr
EndFunction //Есть Реквизит в табличной части или в шапке
//*******************************************
 
I

IvanS

#12
Что значит на один и тот-же реквизит? Ты имеешь ввиду что тип значение реквизита неопределен? энто я не знаю.
несколько отборов одновременно не пашут - только один, так что отобрать по пяти разным показателям энто мечта. Может с 1с++ и можно, я пока этим не занимался. Если реквизита нет выдаст сообщение об ошибке. Это тоже можно обойти использовав
попытка
исключение
конецпопытки;
Видимо придется везде в документах вводить доп реквизит и п нему отбирать. Т.к. мне надо что бы отбирались реквизиты не по 1 складу а по 3-ем. и по н-ому коичеству касс :)


как он поведет себя если такого реквизита в документе не будет ( например в расх кассовом ордере нет склада)
Ну уж в этом-то проблемы нет - можно для каждого документа проверять наличие реквизита
типа такой функции
Function AttrExist(AttrName,DocKind)
var Attr;
if (EmptyValue(DocKind) = 1) OR (EmptyValue(AttrName) = 1) then
Return 0;
endif;
Attr = 0; InHead = "";
for i = 1 to MetaData.Document(DocKind).HeadAttribute() do
if TrimAll(MetaData.Document(DocKind).HeadAttribute(i).Identifier) = AttrName then
Attr = i; InHead = "InHead";
Break;
endif;
enddo;
if Attr = 0 then
for i = 1 to MetaData.Document(DocKind).TableAttribute() do
if TrimAll(MetaData.Document(DocKind).TableAttribute(i).Identifier) = AttrName then
Attr = i; InHead = "InTable";
Break;
endif;
enddo
endif;
Return Attr
EndFunction //Есть Реквизит в табличной части или в шапке
//*******************************************
эээээ, а откуда в 1с ангийские слова :( Это 1с++ что ли?
Если да, то что надо что бы и у меня такое чудо заработало?
 

vbs

Well-known member
18.02.2007
1 708
1
#13
Это чудо надо скопировать и вставить без изменений в нужное место - само заработает - 1С среда двуязычная, это меня только здесь все поливают за английские тексты
 
I

IvanS

#14
Прикольно. А на каком языке тогда писать предпочтительнее? или без разницы?
 

puh14

Well-known member
11.07.2008
1 412
0
#15
Видимо придется везде в документах вводить доп реквизит и п нему отбирать. Т.к. мне надо что бы отбирались реквизиты не по 1 складу а по 3-ем. и по н-ому коичеству касс
Тогда проще плюнуть на журналы - сделать обработку с ТЗ на форме в которую будут выгружаться нужные тебе документы по запросу. А на тз прописать всякие открытия документов, ввод новых, показ проведенных/непроведенных/помеченых на удаление/после ТА. Тогда УстановитьОтбор тебе нафиг не нужен - нужны запросы.
 
I

IvanS

#16
Тогда проще плюнуть на журналы - сделать обработку с ТЗ на форме в которую будут выгружаться нужные тебе документы по запросу. А на тз прописать всякие открытия документов, ввод новых, показ проведенных/непроведенных/помеченых на удаление/после ТА. Тогда УстановитьОтбор тебе нафиг не нужен - нужны запросы.

Я уже думал об этом, но моих знанию вряд ли хватит на такое.
ТЗ что такое? Я хотел сделать отчет по виду напоминающий журнал, но в котором при открытии можно будет установить определенную группировку.

Или просто сделать для каждой точки свою фирму? в бух учете все равно ведь используется подчиненный фирме справочник собственных юр лиц....
Заодно потом проставить им все свою управленческую аналитику и считать рехультаты по каждой точке отдельно. Не знаю только сильно ли это затруднит ввод новых документов ведь придется выбирать из 10-ки фирм.... и главное не тем, для кого я делаю сортировку а тем, кто будет работать однвременоо со всеми 10 "новыми фирмами" вместо одной.

p.s. Уже башка начинает пухнуть, ну и задачку дали :) Я ж блин не программер, а на программера у них денег нету :(

А если я добавлю возможность группировки с правочник фирм, как это скажется на базе? поотому что по всякому выходит что бы бы единственно возможным на данный момент выходом
 

puh14

Well-known member
11.07.2008
1 412
0
#17
ТЗ - это таблица значений. А насчет фирм - это не состыкуется с одновременным отбором по нескольким параметрам. Группировка по справочникам фирм может сработать.
 
I

IvanS

#18
ТЗ ? хм, посмотрю сегодня в ЖКК. Просто установкой кучи фирм я как раз избавлюсь от необходимости множественного отбора. Только по фирме отбирать и все.
Группировка вроде сработала, вопрос не приведет ли это к каким-нибудь непредсказуемым последствиям?......
 

vbs

Well-known member
18.02.2007
1 708
1
#19
выкати свои данные в ТЗ и поставь кнопки, которые обеспечат любые сортировки и группировки, а на таблицу значений - процедурку типа
Procedure WhenClick()
// DocT - таблица значений, в которой есть колонка "Document"
if DocT.CurrentLine() = 0 then
Return;
endif;
if DocT.CurrentColumn() = "Document" then
OpenForm(DocT.Document)
endif
EndProcedure
//**********************************************************
и будет работать примерно как журнал
PS. А писать можно на обоих языках, даже такая конструкция сработает
if ...
КонецЕсли
и т.п.