Имя: Пароль:
1C
 
Список пользователей
0 Press
 
15.10.04
13:42
Можно ли, штатно, не используя ГМ, получить список пользователей конфигурции. Если можно, то, естественно, очень интересует как?
1 Crew
 
15.10.04
13:44
поиск сделать лень?
2 F427
 
15.10.04
13:44
А спросить в отделе кадров уже не канает?

Обязательно в ГМ переться? Кстати, а что такое ГМ?
3 Press
 
15.10.04
13:53
(1) А прочитать внимательно вопрос лень?
(2) Не канает, написал обработочку позволяющую удобно группировать внешние отчеты,
хочу сделать разграничение доступа по пользователям, но для этого мне нужно   получить их список.
4 Press
 
15.10.04
13:54
+(3) ГМ - глобальный модуль
5 Crew
 
15.10.04
13:56
(3)
В твоем случае ГМ переводится иначе г...на мешок.
6 Последний Будда
 
15.10.04
13:57
users.usr - парсить.
7 Press
 
15.10.04
13:58
(6) Как? Используя объект "Текст" не получается.
8 GrayT
 
15.10.04
14:08
Если конфа стандартная не проще использовать справочник Пользователи?
9 Press
 
15.10.04
14:12
(8) Нужно универсальное, внешнее решение.
10 Просто BorisG
 
15.10.04
14:14
Мда......
(9) А все же... возвращаясь к (1)... искать по форуму совсем лень?
11 Press
 
15.10.04
14:20
(10) А сам пробывал?
12 Crew
 
15.10.04
14:25
(3)
Накуй получать список пользователей для разграничения??? к тому же на разных конфигурациях?
13 Просто BorisG
 
15.10.04
14:26
(11) А я знаю ответ. И сам автор не далее, как вчера сюда объявился.
14 MMF
 
15.10.04
14:34
Можно, абсолютно без использования ГМ.
unit UsrWork;
interface
uses SysUtils, Classes, CompoundFiles, Global, ActiveX, Math;
type
 TUserDetail = record
   PageName: string;
   UserName: string;
   Dir: string;
   Interf: string;
   Password: string;
   FullName: string;
   UserRight: string;
 end;
 PUserDetail= ^TUserDetail;

 TUsersDetailList=Class(TList)
 private
   function Get(Index: Integer): PUserDetail;
   procedure Put(Index: Integer; Item: PUserDetail);
 public
   property Items[Index: Integer]: PUserDetail read Get write Put; default;
 end;

 TUsrWork=Class
   private
     FFileName: string;
     FUsersDetailList: TUsersDetailList;
     FTempFileName: string;
     FBaseName: string;
     FUsersNames: TStringList;
     function GetFileName: string;
     procedure SetFileName(const Value: string);
     function CheckFileExists: boolean;
     function GetUsersDetails: TUsersDetailList;
     procedure SetUsersDetail(const Value: TUsersDetailList);
     function GetBaseName: string;
     procedure SetBaseName(const Value: string);
     procedure CopyFileToTempDir;
     Procedure ProcessUsersInfo;
     Procedure ProcessUsersNames(Root: IStorage);
     Procedure UpdateUserDetails(Root: IStorage; index: integer);
   public
     Constructor Create;
     Destructor Destroy; override;
     property FileName: string Read GetFileName Write SetFileName;
     Property BaseName: string Read GetBaseName Write SetBaseName;
     property UsersDetailList: TUsersDetailList read GetUsersDetails write SetUsersDetail;
     function GetUsersNames: TStringList;
 end;
implementation

{ TUsrWork }

function TUsrWork.CheckFileExists: boolean;
begin
 result := False;
 if FileExists(FFileName) then
   result := FileIsCompoundDoc(FFileName);
end;

procedure TUsrWork.CopyFileToTempDir;
var
 SrcFile, copyFile: TFileStream;
begin
 SrcFile:=TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite);
 FTempFileName:=GetTempDirPath+'\usr'+StringReplace(BaseName, chr(34), '', [rfReplaceAll]);
 CopyFile:= TFileStream.Create(FTempFileName, fmCreate or fmShareExclusive);
 CopyFile.CopyFrom(SrcFile, SrcFile.Size);
 SrcFile.Free;
 CopyFile.Free;
end;

constructor TUsrWork.Create;
begin
 FUsersDetailList:=TUsersDetailList.Create;
 FUsersNames:= TStringList.Create;
end;

destructor TUsrWork.Destroy;
begin
 if Assigned(FUsersDetailList) then
 with FUsersDetailList do
 begin
   Clear;
   Free;
 end;
 if Assigned(FUsersNames) then
 with FUsersNames do
 begin
   Clear;
   Free;
 end;
 inherited;
end;

function TUsrWork.GetBaseName: string;
begin
 Result:=FBaseName;
end;

function TUsrWork.GetFileName: string;
begin
 Result:=FFileName;
end;

function TUsrWork.GetUsersDetails: TUsersDetailList;
begin
 Result:=FUsersDetailList;
end;

function TUsrWork.GetUsersNames: TStringList;
begin
 Result:=TStringList.Create;
 Result.AddStrings(FUsersNames);
end;

procedure TUsrWork.ProcessUsersInfo;
var
 Hr: HResult;
 Root: IStorage;
 I: integer;
begin
 Hr := StgOpenStorage(StringToPWideChar(FTempFileName),
   nil, STGM_READ or STGM_DIRECT
   or STGM_SHARE_EXCLUSIVE,
   nil, 0, Root);
 try
   OLECheck(Hr);
   //необходимо открыть поток с содержимым контейнера
   ProcessUsersNames(Root);  //считываем имена пользователей и названия их страниц
   for i := 0 to FUsersDetailList.Count - 1 do
     UpdateUserDetails(Root, i);
 finally
   Root.Commit(STGC_DEFAULT);
 end;
end;

procedure TUsrWork.SetBaseName(const Value: string);
begin
 FBaseName:=Value;
end;

procedure TUsrWork.SetFileName(const Value: string);
begin
 FFileName:=Value;
 if Not(CheckFileExists) then Exit;
 CopyFileToTempDir;
 FUsersDetailList.Clear;
 FUsersNames.Clear;
 ProcessUsersInfo;
end;

procedure TUsrWork.SetUsersDetail(const Value: TUsersDetailList);
begin
 if Assigned(FUsersDetailList) then FUsersDetailList.Clear;
 FUsersDetailList:=Value;
end;

procedure TUsrWork.UpdateUserDetails(Root: IStorage; index: integer);
//считываем информацию о пользователе с заданным индексом

 //*********************************************************
 //считываем указанное кол-во символов и сдвигаем указатель
 //*********************************************************
 function GetSubstr(var L: PChar; Cnt: integer): string;
 var
   I: integer;
 begin
   Result := '';
   if cnt = 0 then
     exit;
   for I := 0 to cnt - 1 do
   begin
     Result := Result + L^;
     Inc(L);
   end;
 end;

var
 UsersData, P: PChar;
 WorkStream: IStream;
 Hr: HResult;
 Size, NewPos, BytesRead: Largeint;
 BufferSize: Integer;
 StatStg: TStatStg;
 Cnt: byte;
 DetailItem: PUserDetail;
begin
 DetailItem:=PUserDetail(FUsersDetailList.Items[index]);
 with DetailItem^ do
 begin
   Dir := '';
   Interf := '';
   Password := '';
   FullName := '';
   UserRight := '';
 end;

 HR := Root.OpenStream(StringToPWideChar(DetailItem^.PageName), 0,
   STGM_READ or STGM_DIRECT or STGM_SHARE_EXCLUSIVE,
   0, WorkStream);
 OLECheck(Hr);
 NewPos := 0;
 WorkStream.Stat(StatStg, 0);
 Size := Floor(StatStg.CbSize);
 BufferSize := Size;

 GetMem(UsersData, BufferSize);
 WorkStream.Seek(0, STREAM_SEEK_SET, NewPos);
 WorkStream.Read(UsersData, BufferSize, @BytesRead);
 //обрабатываем буфер потока
 p := UsersData;
 p := StrPos(p, #01#00#00#00#01#0);
 if p <> nil then
 begin
   Inc(p, 8); //добрались до длины пароля
   cnt := Byte(Pointer(P)^);
   Inc(p);
   DetailItem^.Password := GetSubstr(p, Cnt);
   //теперь указатель находится на длине полного имени
   cnt := Byte(Pointer(P)^);
   Inc(p);
   DetailItem^.FullName := Trim(GetSubstr(p, Cnt));
   //определяем длину каталога
   cnt := Byte(Pointer(P)^);
   Inc(p);
   DetailItem^.Dir := Trim(GetSubstr(p, Cnt));
   //передвигаемся к названию интерфейса
   Inc(p, 4);
   //определяем длину названия интерфейса
   cnt := Byte(Pointer(P)^);
   Inc(p);
   DetailItem^.Interf := Trim(GetSubstr(p, Cnt));
   //определяем длину названия набора прав
   cnt := Byte(Pointer(P)^);
   Inc(p);
   DetailItem^.UserRight := Trim(GetSubstr(p, Cnt));
 end;
 FreeMem(UsersData, BufferSize);
end;


{ TUsersDetailList }

function TUsersDetailList.Get(Index: Integer): PUserDetail;
begin
 Result:=inherited get(Index);
end;

procedure TUsersDetailList.Put(Index: Integer; Item: PUserDetail);
begin
 Inherited put(index, Item);
end;

//*****************************************************************************
//Возвращаем список имен пользователей из Container.Contents Root
//*****************************************************************************
procedure TUsrWork.ProcessUsersNames(Root: IStorage);
var
 UsersData, P: PChar;
 WorkStream: IStream;
 Hr: HResult;
 Size, NewPos, BytesRead: Largeint;
 BufferSize: Integer;
 StatStg: TStatStg;
 Temp: string;
 NewDetail: PUserDetail;
begin
 FUsersNames.Clear;
 FUsersDetailList.Clear;
 HR := Root.OpenStream(StringToPWideChar('Container.Contents'), 0,
   STGM_READ or STGM_DIRECT or STGM_SHARE_EXCLUSIVE,
   0, WorkStream);
 OLECheck(Hr);
 NewPos := 0;
 WorkStream.Stat(StatStg, 0);
 Size := Floor(StatStg.CbSize);
 BufferSize := Size;

 GetMem(UsersData, BufferSize);
 WorkStream.Seek(0, STREAM_SEEK_SET, NewPos);
 WorkStream.Read(UsersData, BufferSize, @BytesRead);
 //обрабатываем буфер потока
 P := usersData;
 while p <> nil do
 begin
   p := StrPos(p, '"UserItemType",'#0);
   if p = nil then
     break;
   Inc(p, 16); //добрались до названия потока, содержащего
   //информацию по пользователю
   temp := '';
   while p^ <> '"' do
   begin
     Temp := Temp + p^;
     inc(p);
   end;
   New(NewDetail);
   NewDetail^.PageName := Temp;
   //теперь пропускаем запятую и следующую кавычку
   Inc(p, 3);
   temp := '';
   while p^ <> '"' do
   begin
     Temp := Temp + p^;
     inc(p);
   end;
   NewDetail^.UserName := Temp;
   FUsersNames.Add(Temp);
   FUSersDetailList.Add(NewDetail)
 end;
 FreeMem(UsersData, BufferSize);
end;

end.
15 Press
 
15.10.04
14:36
(12) Объясняю. Доходчиво. Всего лишь во второй раз. Обработка, позволяет, отображать внешние отчеты с иерархией, хочется добавить кнопку доступ, встаешь
на нужный отчет (группу), нажимаешь ее появляется список пользователей, помечаешь галочками тех кому можно использовать этот отчет (группу) и радуешься.
(13) Ну так скажи, что мешает?
PS. Только про links.tmp не рассказывай.
16 Press
 
15.10.04
14:37
(14) Средствами 1С, без использования ВК нужно.
17 MMF
 
15.10.04
14:39
(16) На проклабе есть где-то чтение списка пользователей средствами 1С, но это только имена, без остальной инфы.
18 Press
 
15.10.04
14:43
(17) Я нашел там одну вещь, как раз то что я сейчас и делаю, но она только для членов.
19 Последний Будда
 
15.10.04
14:45
18. Мы бы тебе скинули, если бы были уверены, что это тебе действительно нужно.
20 Press
 
15.10.04
14:46
(19) Могу выслать то что наваял, а там уже решите.
21 Последний Будда
 
15.10.04
15:16
20 icq 273377239
22 Press
 
15.10.04
15:20
(21) Аси по рукой нет, давай по мылу.
23 Последний Будда
 
15.10.04
15:22
matreya@souzp.aaanet.ru
24 MMF
 
15.10.04
15:30
(19) не подумайте, что это продолжение... просто интересно, почему вы говорите о себе во множественном числе? "Мы бы тебе скинули, если бы были уверены..." Вы - симбиоз организмов, наподобие клубеньковых бактерий и гороха? Или - "Мы, Николай II..."
25 Последний Будда
 
15.10.04
15:39
24. Мы - потому что от имени нескольких наших лиц.
26 Press
 
15.10.04
15:40
(25) Я выслал, жду вердикта.
27 MMF
 
15.10.04
15:40
(25) Простите, о шизофрении, как о вероятной причине такого обращения, я не подумал
28 Последний Будда
 
15.10.04
15:46
27. :) Человек не может смотреть иначе, чем как через призму своего ума.
29 Последний Будда
 
15.10.04
15:53
26. Ответил, в том числе и на твои мысли.
30 Press
 
15.10.04
16:26
(29) Премного благодарен.