//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                               Работа с метаданными                                        |
//	+                                      ShmalevoZ                                            +
//	|                                       2008-12                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Получение списка пользователей без использования внешних компонент
// Исходная обработка : 
// http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=6213
// Благодарности kresi


//******************************************************************************
// НормализоватьКонтекст(СсылаКонтекст)
//
// Параметры: 
//  СсылаКонтекст
//
// Возвращаемое значение:
//  Неопределенный
//
// Описание:
//  Возвращает ссылка на переданный контекст
//
Функция НормализоватьКонтекст(СсылаКонтекст)
	
	Возврат СсылаКонтекст;
	
КонецФункции // НормализоватьКонтекст()


//******************************************************************************
// _this()
//
// Параметры: 
//  СсылкаКонтекст			- контекст
//
// Возвращаемое значение:
//  ГрупповойКонтекст		- ссылка на контекст
//
// Описание:
//  Возвращает ссылку на контекст
//
Функция _this()
	
	Возврат НормализоватьКонтекст(Контекст);
	
КонецФункции // _this()


//******************************************************************************
// ПолучитьСтрокуДанных(Каталог)
//
// Параметры: 
//  Каталог					- каталог ИБ
//
// Возвращаемое значение:
//  Строка					- строка данных файла users.usr
//
// Описание:
//  Возвращает значимые данные файла users.usr
//
Функция ПолучитьСтрокуДанных(Каталог)
	
	Результат		= "";
	ИсходныйФайл	= ?(ПустаяСтрока(Каталог) = 1, КаталогИБ(), Каталог) + "usrdef\users.usr";
	Хранилище		= СоздатьОбъект("BinaryData");
	Хранилище.ПодключитьсяКФайлу(ИсходныйФайл, 1, 1);
	Хранилище.ЗагрузитьИзФайла(ИсходныйФайл, 0);
	
	Данные			= 0;
	Позиция			= 0;
	Пока Хранилище.ПрочитатьДанные(Данные, 0) = 1 Цикл
		Данные	= ?(Данные = 0, 255, Данные);
		Если (Позиция < 30720) или (Позиция > 31231) Тогда
			Результат	= Результат + Симв(Данные);
		КонецЕсли;
		Позиция	= Позиция + 1;
	КонецЦикла;
	
	Хранилище.Закрыть();
	
	Возврат Результат;
КонецФункции // ПолучитьСтрокуДанных()


//******************************************************************************
// ДополнитьИнформациюОПользователях(ТаблицаПользователей, ИсходныеДанные)
//
// Параметры: 
//  ТаблицаПользователей	- заполняемая таблица
//  ИсходныеДанные			- строка исходных данных
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Дополняет данные таблицы пользователей данными о каталоге, полном имени, ...
//
Процедура ДополнитьИнформациюОПользователях(ТаблицаПользователей, ИсходныеДанные)
	
	СтрокаДанных	= ИсходныеДанные;
	Искомое			= "" + Симв(1) + Симв(255) + Симв(255) + Симв(255) + Симв(1) + Симв(255) + Симв(255) + Симв(255);
	Позиция			= Найти(СтрокаДанных, Искомое);
	Если Позиция = 0 Тогда
		Возврат;
	КонецЕсли;
	СтрокаДанных	= Сред(СтрокаДанных, Позиция);
	
	ТаблицаПользователей.ВыбратьСтроки();
	Пока ТаблицаПользователей.ПолучитьСтроку() = 1 Цикл
		
		Пока КодСимв(Лев(СтрокаДанных, 1)) = 255 Цикл
			СтрокаДанных	= Сред(СтрокаДанных, 2);
		КонецЦикла;
		Если СтрДлина(СтрокаДанных) = 0 Тогда
			Прервать;
		КонецЕсли;
		
		СтрокаДанных		= Сред(СтрокаДанных, 9);
		ДлинаХЭШ			= КодСимв(Лев(СтрокаДанных, 1));
		СтрокаДанных		= Сред(СтрокаДанных, ДлинаХЭШ + 2);
		
		//---------------------------------------------------------------------------------------------
		// Представление
		ДлинаПредставления					= КодСимв(Лев(СтрокаДанных, 1));
		ДлинаПредставления					= ?(ДлинаПредставления = 255, 0, ДлинаПредставления);
		ТаблицаПользователей.Представление	= Сред(СтрокаДанных, 2, ДлинаПредставления);
		СтрокаДанных						= Сред(СтрокаДанных, ДлинаПредставления + 2);
		
		//---------------------------------------------------------------------------------------------
		// Каталог
		ДлинаКаталога						= КодСимв(Лев(СтрокаДанных, 1));
		ДлинаКаталога						= ?(ДлинаКаталога = 255, 0, ДлинаКаталога);
		ТаблицаПользователей.Каталог		= Сред(СтрокаДанных, 2, ДлинаКаталога);
		СтрокаДанных						= Сред(СтрокаДанных, ДлинаКаталога + 6);
		
		//---------------------------------------------------------------------------------------------
		// Интерфейс
		ДлинаИнтерфейса						= КодСимв(Лев(СтрокаДанных, 1));
		ДлинаИнтерфейса						= ?(ДлинаИнтерфейса = 255, 0, ДлинаИнтерфейса);
		ТаблицаПользователей.Интерфейс		= Сред(СтрокаДанных, 2, ДлинаИнтерфейса);
		СтрокаДанных						= Сред(СтрокаДанных, ДлинаИнтерфейса + 2);
		
		//---------------------------------------------------------------------------------------------
		// Права
		ДлинаПрав							= КодСимв(Лев(СтрокаДанных, 1));
		ДлинаПрав							= ?(ДлинаПрав = 255, 0, ДлинаПрав);
		ТаблицаПользователей.Права			= Сред(СтрокаДанных, 2, ДлинаПрав);
		СтрокаДанных						= Сред(СтрокаДанных, ДлинаПрав + 2);
		
		//---------------------------------------------------------------------------------------------
		// Активен
		Если ПустоеЗначение(ТаблицаПользователей.Каталог) = 1 Тогда
			ТаблицаПользователей.Активен	= -1;
			Продолжить;
		КонецЕсли;
		Каталог			= ТаблицаПользователей.Каталог;
		Каталог			= ?(Лев(Каталог, 1) = ".", КаталогИБ() + Сред(Каталог, 2), Каталог);
		ИмяФайлаФлага	= Каталог + "\1Cv7.LCK";
		Если ФС.СуществуетФайл(ИмяФайлаФлага) = 0 Тогда
			ТаблицаПользователей.Активен	= 0;
			Продолжить;
		КонецЕсли;
		Попытка
			ФС.УдалитьФайл(ИмяФайлаФлага);
		Исключение
		КонецПопытки;
		ТаблицаПользователей.Активен	= ФС.СуществуетФайл(ИмяФайлаФлага);
	КонецЦикла;
	
КонецПроцедуры // ДополнитьИнформациюОПользователях()


//******************************************************************************
// ПолучитьТаблицуПользователей(Каталог = "")
//
// Параметры: 
//  Каталог = ""			- каталог ИБ
//
// Возвращаемое значение:
//  ТаблицаЗначений			- таблица информации о пользователях ИБ
//
// Описание:
//  Возвращает таблицу информации о пользователях ИБ
//
Функция ПолучитьТаблицуПользователей(Каталог = "") Экспорт
	
	Результат	= СоздатьОбъект("ТаблицаЗначений");
	Результат.НоваяКолонка("Номер");
	Результат.НоваяКолонка("Идентификатор");
	Результат.НоваяКолонка("Представление");
	Результат.НоваяКолонка("Каталог");
	Результат.НоваяКолонка("Интерфейс");
	Результат.НоваяКолонка("Права");
	Результат.НоваяКолонка("Активен");
	
	ИсходныеДанные	= ПолучитьСтрокуДанных(Каталог);
	Математика		= СоздатьОбъект("Math");
	
	//---------------------------------------------------------------------------------------------
	// Заполняем номера пользователей
	Искомое	= """UserItemType";
	Позиция	= Найти(ИсходныеДанные, Искомое);
	Пока Позиция <> 0 Цикл
		
		ИсходныеДанные	= Сред(ИсходныеДанные, Позиция);
		Окончание		= Найти(ИсходныеДанные, "}");
		Данные			= СоздатьОбъект("СписокЗначений");
		Данные.ИзСтрокиСРазделителями(Лев(ИсходныеДанные, Окончание - 1));
		
		Результат.НоваяСтрока();
		Результат.Идентификатор	= Данные.ПолучитьЗначение(3);
		Номер					= Сред(Данные.ПолучитьЗначение(2), 6);
		Результат.Номер			= Математика.Число("0x" + Номер);
		
		ИсходныеДанные	= Сред(ИсходныеДанные, Окончание + 1);
		Позиция			= Найти(ИсходныеДанные, Искомое);
	КонецЦикла;
	
	Результат.Сортировать("Номер-");
	ДополнитьИнформациюОПользователях(Результат, ИсходныеДанные);
	Результат.Сортировать("Номер+");
	
	Возврат Результат;
КонецФункции // ПолучитьТаблицуПользователей()


//******************************************************************************
// Конструктор()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Предопределенный метод
//
Процедура Конструктор()
	
	
	
КонецПроцедуры // Конструктор()


//******************************************************************************
// Деструктор()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Предопределенный метод
//
Процедура Деструктор()
	
	
	
КонецПроцедуры // Конструктор()
