Продолжение разработки Интеграция 1С и Active Directory на сервере (windows) но уже на linux.
ПараметрыСтруктуры = "LDPA_Домен,LDPA_Сервер,LDPA_Контейнер,USER_Логин,USER_Пароль,Отбор_Условие";
	стрПараметры = Новый Структура(ПараметрыСтруктуры);
	стрПараметры.LDPA_Домен = "";      //(не обязательное) Пример: domen.ru. 
	                                   //   Дописывается USER_Логин "@domen.ru" (если не указан). 
	                                   //   Используется в колонке "АутентификацияОС", для совместимости.
	стрПараметры.LDPA_Сервер = "";     //domen.ru или IP сервера, пример: 192.168.1.1
	стрПараметры.LDPA_Контейнер = "";  //Пример строки: DC=domen; DC=ru
	стрПараметры.USER_Логин = "";      //Пользователь AD c доступом к LDPA, пример: User или User@domen.ru
	стрПараметры.USER_Пароль = "";     //Пароль
	стрПараметры.Отбор_Условие = 1;    //Число - прописанный фильтр в функции "LDPA_ПолучитьТекстКомандыУсловия"
	стрРезультат = LDPA_ПолучитьСписокПользователейActiveDirectoryLinux(стрПараметры);
	Если стрРезультат = Неопределено Тогда Возврат; КонецЕсли;
#Область Получить_Информацию_АД
&НаКлиентеНаСервереБезКонтекста
Функция LDPA_ПолучитьТекстКомандыУсловия(Отбор_Условие)
	
	ТекстКомандыУсловия = "";
	
	Если Отбор_Условие = 1 Тогда 
		//1,"Все пользователи, кроме отключенных"
		ТекстКомандыУсловия = "(&(sAMAccountType=805306368)(!(useraccountcontrol:1.2.840.113556.1.4.803:=2)))";
	ИначеЕсли Отбор_Условие = 2 Тогда 
		//2,"Отключенные (Disabled) пользователи"
		ТекстКомандыУсловия = "(&(sAMAccountType=805306368)(useraccountcontrol:1.2.840.113556.1.4.803:=2))";
	ИначеЕсли Отбор_Условие = 3 Тогда 
		//3,"Заблокированные (Locked) пользователи"
		ТекстКомандыУсловия = "(&(sAMAccountType=805306368)(badPwdCount>=4))";
	ИначеЕсли Отбор_Условие = 4 Тогда 
		//4,"Пользователи, у которых в настройках указано «Пароль никогда не истекает»"
		ТекстКомандыУсловия = "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536))";
	ИначеЕсли Отбор_Условие = 5 Тогда 
		//5,"Пользователи с mail"
		ТекстКомандыУсловия = "(&(sAMAccountType=805306368)(mail=*))";
	ИначеЕсли Отбор_Условие = 6 Тогда 
		//6,"Пользователи с незаполненным полем mail"
		ТекстКомандыУсловия = "(&(sAMAccountType=805306368)(!(mail=*)))";
	Иначе 
		ТекстКомандыУсловия = "(&(sAMAccountType=805306368))";
	КонецЕсли;
	
	Возврат ТекстКомандыУсловия;
КонецФункции
&НаСервереБезКонтекста
Функция LDPA_ПолучитьПустуюТаблицуПользователи(ТекстКоманды_Атрибуты)
	
	ТЗ_Пользователи = Новый ТаблицаЗначений;
	ТЗ_Пользователи.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
	ТЗ_Пользователи.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
	ТЗ_Пользователи.Колонки.Добавить("Фамилия", Новый ОписаниеТипов("Строка"));
	ТЗ_Пользователи.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
	ТЗ_Пользователи.Колонки.Добавить("Отчество", Новый ОписаниеТипов("Строка"));
	ТЗ_Пользователи.Колонки.Добавить("Служебный", Новый ОписаниеТипов("Булево"));
	ТЗ_Пользователи.Колонки.Добавить("АутентификацияОС", Новый ОписаниеТипов("Строка")); //Осталось для совместимости обработок под винду и только...
	ТЗ_Пользователи.Колонки.Добавить("Примечание", Новый ОписаниеТипов("Строка"));
	//
	МассивАтрибутов = СтрРазделить(ТекстКоманды_Атрибуты," ",Ложь);
	Для Каждого ИмяАтрибута Из МассивАтрибутов Цикл 
		ТЗ_Пользователи.Колонки.Добавить(ИмяАтрибута, Новый ОписаниеТипов("Строка"));
	КонецЦикла;
	
	Возврат ТЗ_Пользователи;
КонецФункции
&НаСервереБезКонтекста
Функция LDPA_ПолучитьПустуюТаблицуГрупп()
	
	ТЗ_Группа = Новый ТаблицаЗначений;
	ТЗ_Группа.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
	//
	ТЗ_Группа.Колонки.Добавить("memberOf", Новый ОписаниеТипов("Строка"));
	
	Возврат ТЗ_Группа;
КонецФункции
&НаСервереБезКонтекста
Функция LDPA_ПолучитьСписокПользователейActiveDirectoryLinux(стрПараметры)
	
	ЭтоЛиукс = ЭтоОС("linux");
	Если ЭтоЛиукс <> Истина Тогда 
		ТекстСообщения = "Только для Linux ОС.";
		СообщитьПользователю(ТекстСообщения);
		Возврат Неопределено;
	КонецЕсли;
	
	ТекстКомандыУсловия = LDPA_ПолучитьТекстКомандыУсловия(стрПараметры.Отбор_Условие);
	ТекстКоманды_Атрибуты = "name sn displayName givenName mail sAMAccountName userPrincipalName memberOf telephoneNumber manager";
	
	ПараметрыСтруктуры = "Успешно,ТекстОшибки_Кратко,ТекстОшибки_Подробно,ТЗ_Пользователи,ТЗ_Группа,Примечание,";
	стрРезультат = Новый Структура(ПараметрыСтруктуры);
	стрРезультат.Успешно				 = Ложь;
	стрРезультат.ТекстОшибки_Кратко		 = "";
	стрРезультат.ТекстОшибки_Подробно	 = "";
	стрРезультат.ТЗ_Пользователи		 = LDPA_ПолучитьПустуюТаблицуПользователи(ТекстКоманды_Атрибуты);
	стрРезультат.ТЗ_Группа				 = LDPA_ПолучитьПустуюТаблицуГрупп();
	стрРезультат.Примечание				 = "";
	
	LDPA_ИмяПользователя = стрПараметры.USER_Логин;
	Если Найти(LDPA_ИмяПользователя,"@") = 0 Тогда 
		LDPA_ИмяПользователя = "" + LDPA_ИмяПользователя + "@" + стрПараметры.LDPA_Домен;
	КонецЕсли;
	
	ТекстКоманды = "ldapsearch -H ldap://"+стрПараметры.LDPA_Сервер+" -D """+LDPA_ИмяПользователя+""" -w """+стрПараметры.USER_Пароль+""" -b """+стрПараметры.LDPA_Контейнер+""" """+ТекстКомандыУсловия+""" "+ТекстКоманды_Атрибуты;
	ТекущийКаталог = КаталогВременныхФайлов();
	стрРезультата = bash_ВыполнитьКомандуLinux(ТекстКоманды, Неопределено, ТекущийКаталог, Истина);
	Если стрРезультата = Неопределено Тогда
		ТекстСообщения = "Команда не выполнена.";
		СообщитьПользователю(ТекстСообщения);
		Возврат Неопределено;
	КонецЕсли;
	
	//Поместим некооторые значения...
	ЗаполнитьЗначенияСвойств(стрРезультат,стрРезультата);
	
	РезультатКоманды = ПолучитьЗначениеСтруктуры("РезультатКоманды",стрРезультата,Неопределено);
	
	Если стрРезультата.КодВозврата = Неопределено Или РезультатКоманды = Неопределено Или ПустаяСтрока(РезультатКоманды) Тогда 
		ТекстСообщения = "Команда 'ldapsearch' не выполнена.";
		СообщитьПользователю(ТекстСообщения);
		
		Если Не ПустаяСтрока(стрРезультата.ТекстОшибки_Кратко) Тогда 
			ТекстСообщения = "Была ошибка: "+стрРезультата.ТекстОшибки_Кратко;
			Если Не ПустаяСтрока(стрРезультата.ТекстОшибки_Подробно) Тогда 
				ТекстСообщения = ТекстСообщения + ". Подробно об ошибке: "+стрРезультата.ТекстОшибки_Подробно;
			КонецЕсли;
			СообщитьПользователю(ТекстСообщения);
		КонецЕсли;
		
		Возврат Неопределено;
	КонецЕсли;
	
	ТЗ_Пользователи	 = стрРезультат.ТЗ_Пользователи;
	ТЗ_Группа		 = стрРезультат.ТЗ_Группа;
	
	ldapsearch_ПарсерРезультатаКоманды(РезультатКоманды, ТЗ_Пользователи, ТЗ_Группа, стрПараметры, стрРезультат.Примечание, ТекстКоманды_Атрибуты);
	
	Возврат стрРезультат;
КонецФункции
#КонецОбласти
Небольшое описание функции "bash_ВыполнитьКомандуLinux":
- ТекстКоманды - Текст выполняемой команды.
- ПолноеИмяФайла_TXT - (Не обязательное) Полный путь к файлу, куда будет помещен результат выполнения команды. (Все как в DOS). Если не казан, то результат будет помещен в возвращаемый параметр "РезультатКоманды".
- ТекущийКаталог - (Не обязательное) При выполнении команды устанавливает текущий каталог, куда вызываемое приложение будет записывать файлы. Если не указать, то некоторые приложения использую каталог исполняемого файла Сервера 1С.
- ИспользоватьВариант2 - (Не обязательное) Если ИСТИНА, то результат запишется с переносом строк. Если ЛОЖЬ, то результат выполнения команды запишется в одну строку, без переноса строк.
#Область Команда_Линукса
  
&НаКлиентеНаСервереБезКонтекста
Функция bash_ПолучитьРезультатКоманды(ПолноеИмяФайла)
	
	//Только для маленьких файликов...
	Чтение = Новый ЧтениеТекста(ПолноеИмяФайла,КодировкаТекста.Системная,Символы.ПС);
	ТекстРезультатаКоманды = Чтение.Прочитать();
	Чтение.Закрыть();	
	
	УдалитьФайлы(ПолноеИмяФайла);
	
	Возврат ТекстРезультатаКоманды;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция bash_ВыполнитьКомандуLinux(Знач ТекстКоманды, Знач ПолноеИмяФайла_TXT=Неопределено, Знач ТекущийКаталог=Неопределено, Знач ИспользоватьВариант2=Ложь) Экспорт
	
	ПараметрыСтруктуры = "Успешно,ТекстОшибки_Кратко,ТекстОшибки_Подробно,КодВозврата,";
	стрРезультат = Новый Структура(ПараметрыСтруктуры);
	стрРезультат.Успешно				 = Ложь;
	стрРезультат.ТекстОшибки_Кратко		 = "";
	стрРезультат.ТекстОшибки_Подробно	 = "";
	
	Попытка
		
		Если ПолноеИмяФайла_TXT <> Неопределено И Не ПустаяСтрока(ПолноеИмяФайла_TXT) Тогда 
			ВернутьРезультатКоманды = Ложь;
			Файл = Новый Файл(ПолноеИмяФайла_TXT);
			Если Файл.Существует() Тогда 
				Если Не Файл.ЭтоФайл() Тогда 
					ВызватьИсключение "Имя файла TXT совпадает с каталогом, укажите другое имя файла TXT.
					|Имя файла: "+ПолноеИмяФайла_TXT;
				КонецЕсли;
				УдалитьФайлы(ПолноеИмяФайла_TXT);
			КонецЕсли;
			
			СтрокаНаИсполнение = ""+ТекстКоманды+" >> "+ПолноеИмяФайла_TXT;
			
		Иначе
			ВернутьРезультатКоманды = Истина;
			КаталогTemp = КаталогВременныхФайлов();
			ПолноеИмяФайла_TXT = ""+КаталогTemp+СгенерироватьИмяФайлаПоДате()+".txt";
			
			Если ИспользоватьВариант2 <> Истина Тогда 
				ИмяОкружения = "bash_1c";
				СтрокаНаИсполнение = ""+ИмяОкружения+"="+"$("+ТекстКоманды+"); echo $"+ИмяОкружения+" >> "+ПолноеИмяФайла_TXT;
			Иначе 
				СтрокаНаИсполнение = ""+ТекстКоманды+" >> "+ПолноеИмяФайла_TXT;
			КонецЕсли;
		КонецЕсли;
		
		
		КодВозврата = Неопределено;
		Если ТекущийКаталог = Неопределено Или ПустаяСтрока(ТекущийКаталог) Тогда
			ЗапуститьПриложение(СтрокаНаИсполнение,,Истина,КодВозврата);
		Иначе
			ЗапуститьПриложение(СтрокаНаИсполнение,ТекущийКаталог,Истина,КодВозврата);
		КонецЕсли;
		
		стрРезультат.КодВозврата = КодВозврата;
		
		Если ВернутьРезультатКоманды = Истина Тогда 
			СтрокаРезультатКоманды = bash_ПолучитьРезультатКоманды(ПолноеИмяФайла_TXT);
			стрРезультат.Вставить("РезультатКоманды", СокрЛП(СтрокаРезультатКоманды));
		КонецЕсли;
		
		стрРезультат.Успешно = Истина;
	Исключение
		ИнфОшиб = ИнформацияОбОшибке();
		
		стрРезультат.Успешно			  = Ложь;
		стрРезультат.ТекстОшибки_Кратко	  = КраткоеПредставлениеОшибки(ИнфОшиб);
		стрРезультат.ТекстОшибки_Подробно = ПодробноеПредставлениеОшибки(ИнфОшиб);
	КонецПопытки;
	
	Возврат стрРезультат;
КонецФункции
#КонецОбласти
#Область Парсер_ldapsearch
&НаСервереБезКонтекста
Функция ldapsearch_ПолучитьСтрокуТекстаИзСтрок(РезультатКоманды, СчСтрок, КолСтрок, СтрокаОкончанияДанных)
	
	СледСтрокаТекста = "";
	
	Пока СчСтрок <= КолСтрок Цикл 
		СтрокаТекста = СтрПолучитьСтроку(РезультатКоманды, СчСтрок);
		
		Если ПустаяСтрока(СледСтрокаТекста) Тогда 
			Если СтрокаТекста = "" Тогда 
				СтрокаОкончанияДанных = Истина;
				СчСтрок = СчСтрок + 1;
				Прервать;
			КонецЕсли;
		Иначе 
			Если СтрокаТекста = "" Тогда 
				СтрокаОкончанияДанных = Истина;
				СчСтрок = СчСтрок + 1;
				Прервать;
			ИначеЕсли Лев(СтрокаТекста,1) = "#" Тогда 
				Прервать;
			ИначеЕсли Найти(СтрокаТекста,":") > 0 Тогда 
				Прервать;
			ИначеЕсли Лев(СтрокаТекста,1) = " " Тогда 
				СтрокаТекста = Сред(СтрокаТекста,2);
			КонецЕсли;
		КонецЕсли;
		
		СледСтрокаТекста = СледСтрокаТекста + СтрокаТекста;
		
		СчСтрок = СчСтрок + 1;
	КонецЦикла;
	
	Если СтрокаОкончанияДанных <> Истина И СчСтрок > КолСтрок Тогда 
		СтрокаОкончанияДанных = Истина;
	КонецЕсли;
	
	Возврат СледСтрокаТекста;
КонецФункции
&НаСервереБезКонтекста
Функция ldapsearch_ПолучитьМассивСтрокСтрокиИзТекста(РезультатКоманды, СчСтрок, КолСтрок, Примечание, ТекстКоманды_Атрибуты)
	
	Если СчСтрок > КолСтрок Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	МассивСтрок = Новый Массив;
	Примечание_ = "";
	КодОперации = 1; //1- Начало
	ЕстьАтрибур = Ложь;
	
	Пока СчСтрок <= КолСтрок Цикл 
		СчСтрок_Стар = СчСтрок;
		СтрокаОкончанияДанных = Ложь;
		СледСтрокаТекста = ldapsearch_ПолучитьСтрокуТекстаИзСтрок(РезультатКоманды, СчСтрок, КолСтрок, СтрокаОкончанияДанных);
		
		//Ищем сперва начало, начал..
		Если КодОперации = 1 Тогда 
			Если СтрокаОкончанияДанных = Истина Тогда
				Если Не ПустаяСтрока(СледСтрокаТекста) Тогда 
					Примечание_ = Примечание_ + ?(ПустаяСтрока(Примечание_),"",Символы.ПС) + СледСтрокаТекста;
				КонецЕсли;
				Продолжить;
			КонецЕсли;
			КодОперации = 2; //2 - ищем данные
			МассивСтрок.Добавить(СледСтрокаТекста);
			
		ИначеЕсли КодОперации = 2 Тогда //2 - ищем данные
			Если Лев(СледСтрокаТекста,1) = "#" Тогда 
				КодОперации = 1; //Опять ищем начало...
				СчСтрок = СчСтрок_Стар; 
				Прервать;
			КонецЕсли;
			
			СимволДвоеточия = Найти(СледСтрокаТекста,":");
			Если СимволДвоеточия = 0 Тогда 
				КодОперации = 1; //Опять ищем начало...
				Если Не ПустаяСтрока(СледСтрокаТекста) Тогда 
					Примечание_ = Примечание_ + ?(ПустаяСтрока(Примечание_),"",Символы.ПС) + СледСтрокаТекста;
				КонецЕсли;
				Прервать;
			КонецЕсли;
			
			ИмяПоля = Лев(СледСтрокаТекста,(СимволДвоеточия-1));
			Если Не ПустаяСтрока(ИмяПоля) И Найти(" "+НРег(ТекстКоманды_Атрибуты)+" "," "+НРег(ИмяПоля)+" ") > 0 Тогда 
				ЕстьАтрибур = Истина;
			КонецЕсли;
			
			МассивСтрок.Добавить(СледСтрокаТекста);
		КонецЕсли;
	КонецЦикла;
	
	//Одну строку не расматриваем... толку нет...
	Если МассивСтрок.Количество() = 1 Или ЕстьАтрибур <> Истина Тогда 
		Примечание_Доп = "";
		Для Каждого СтрокаТекста Из МассивСтрок Цикл 
			Примечание_Доп = Примечание_Доп + ?(ПустаяСтрока(Примечание_Доп),"",Символы.ПС) + СтрокаТекста;
		КонецЦикла;
		Если Не ПустаяСтрока(Примечание_Доп) Тогда
			Примечание_ = Примечание_Доп + ?(ПустаяСтрока(Примечание_),"",Символы.ПС) + Примечание_;
		КонецЕсли;
		МассивСтрок.Очистить();
	КонецЕсли;
	
	Если Не ПустаяСтрока(Примечание_) Тогда 
		Примечание = Примечание + ?(ПустаяСтрока(Примечание),"",Символы.ПС) + Примечание_;
	КонецЕсли;
	
	Возврат МассивСтрок;
КонецФункции
&НаСервереБезКонтекста
Функция ldapsearch_ПолучитьСтруктуруСтрокиДанных(МассивСтрок, МассивСтрокГрупп)
	
	Если МассивСтрок = Неопределено Или МассивСтрок.Количество() = 0 Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	стрСтрокаДанных = Новый Структура;
	
	Для Каждого СтрокаТекста Из МассивСтрок Цикл 
		
		//Начало...
		Если Лев(СтрокаТекста,1) = "#" Тогда 
			ИмяПоля = "Примечание";
			Если Найти(СтрокаТекста,"\") > 0 Тогда 
				КодСлужебногоСимвола = КодСимвола("\");
			Иначе 
				КодСлужебногоСимвола = Неопределено;
			КонецЕсли;
			Если КодСлужебногоСимвола <> Неопределено Тогда 
				Значение = ДекодироватьURL(СтрокаТекста, КодСлужебногоСимвола, Истина);
			Иначе 
				Значение = СтрокаТекста;
			КонецЕсли;
			
		Иначе 
			//":", тут либо две двоеточия, либо одна... Если ни одной, то печалько и что-то пошло нетак...
			НомерДвоеточия = Найти(СтрокаТекста,":");
			Если НомерДвоеточия = 0 Тогда Продолжить; КонецЕсли;
			ИмяПоля = Лев(СтрокаТекста,(НомерДвоеточия-1));
			
			ДваСимвола = Сред(СтрокаТекста,НомерДвоеточия,2);
			Если ДваСимвола = "::" Тогда 
				//Двоичный вид данных
				Значение = Base64ЗначениеТекстом(СокрЛП(Сред(СтрокаТекста,(НомерДвоеточия+2))));
			Иначе 
				//Обычный...
				Значение = СокрЛП(Сред(СтрокаТекста,(НомерДвоеточия+1)));
			КонецЕсли;
			
		КонецЕсли;
		
		//Положем, не в ячейку, а в группу...
		Если НРег(ИмяПоля) = НРег("memberOf") Тогда 
			МассивСтрокГрупп.Добавить(Значение);
		Иначе 
			стрСтрокаДанных.Вставить(ИмяПоля, Значение);
		КонецЕсли;
		
		
	КонецЦикла;
	
	Возврат стрСтрокаДанных;
КонецФункции
//... парсер результата
&НаСервереБезКонтекста
Процедура ldapsearch_ПарсерРезультатаКоманды(РезультатКоманды, ТЗ_Пользователи, ТЗ_Группа, стрПараметры, Примечание, ТекстКоманды_Атрибуты)
	
	КолСтрок = СтрЧислоСтрок(РезультатКоманды);
	СчСтрок = 1;
	
	МассивСтрокГрупп = Новый Массив;
	
	Пока СчСтрок <= КолСтрок Цикл 
		
		МассивСтрок = ldapsearch_ПолучитьМассивСтрокСтрокиИзТекста(РезультатКоманды, СчСтрок, КолСтрок, Примечание, ТекстКоманды_Атрибуты);
		Если МассивСтрок = Неопределено Тогда Прервать; КонецЕсли;
		Если МассивСтрок.Количество() = 0 Тогда Продолжить; КонецЕсли;
		
		МассивСтрокГрупп.Очистить();
		стрСтрокаДанных = ldapsearch_ПолучитьСтруктуруСтрокиДанных(МассивСтрок, МассивСтрокГрупп);
		Если стрСтрокаДанных = Неопределено Тогда Продолжить; КонецЕсли;
		
		Идентификатор = СокрЛП(Новый УникальныйИдентификатор());
		
		НоваяСтрока = ТЗ_Пользователи.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока,стрСтрокаДанных);
		Если НЕ ПустаяСтрока(НоваяСтрока.userPrincipalName) Тогда 
			НоваяСтрока.АутентификацияОС = "\\"+стрПараметры.LDPA_Домен+"\"+НоваяСтрока.sAMAccountName;
		КонецЕсли;
		НоваяСтрока.Идентификатор = Идентификатор;
		
		//Наименование
		НоваяСтрока.Наименование = СокрЛП(НоваяСтрока.displayName);
		Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда 
			НоваяСтрока.Наименование = СокрЛП(НоваяСтрока.Name);
		КонецЕсли;
		
		//Отчество
		НоваяСтрока.Фамилия	 = СокрЛП(НоваяСтрока.sn);
		НоваяСтрока.Имя		 = СокрЛП(НоваяСтрока.givenName);
		НовоеИмя = "";
		НоваяСтрока.Отчество = ПолучитьОтчествоИзАД(НоваяСтрока.sn, НоваяСтрока.givenName, НоваяСтрока.Name, НовоеИмя);
		Если НЕ ПустаяСтрока(НовоеИмя) Тогда
			НоваяСтрока.Имя	 = НовоеИмя;
		КонецЕсли;
		
		НоваяСтрока.Служебный = ПустаяСтрока(НоваяСтрока.userPrincipalName);
		
		
		Для Каждого СтрокаТекст Из МассивСтрокГрупп Цикл 
			НоваяСтрокаГр = ТЗ_Группа.Добавить();
			НоваяСтрокаГр.Идентификатор = Идентификатор;
			НоваяСтрокаГр.memberOf = СтрокаТекст;
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры
#КонецОбласти
#Область Дополнительные_Функции_Процедуры
  
&НаКлиентеНаСервереБезКонтекста
Функция ЭтоОС(Знач ЧтоИщем) Экспорт   //"Linux"
	
	ЧтоИщем = НРег(ЧтоИщем);
	
	СистемнаяИнформация = Новый СистемнаяИнформация;
	Если ЧтоИщем = "win" И СтрНайти(строка(нРег(СистемнаяИнформация.ТипПлатформы)), "win")>0 Тогда //win
		Возврат Истина
	ИначеЕсли ЧтоИщем = "linux" И СтрНайти(строка(нРег(СистемнаяИнформация.ТипПлатформы)), "linux")>0 Тогда
		Возврат Истина
	ИначеЕсли ЧтоИщем = "macos" И СтрНайти(строка(нРег(СистемнаяИнформация.ТипПлатформы)), "macos")>0 Тогда
		Возврат Истина
	Иначе
		Возврат Ложь;
	КонецЕсли;	
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ЭтоСервер() Экспорт
	
	#Если Клиент Тогда
		Возврат Ложь;
	#Иначе 
		Возврат Истина;
	#КонецЕсли	
	
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователю(
		Знач ТекстСообщенияПользователю,
		Знач КлючДанных = Неопределено,
		Знач Поле = "",
		Знач ПутьКДанным = "",
		Отказ = Ложь) Экспорт
	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = ТекстСообщенияПользователю;
	Сообщение.Поле = Поле;
	
	ЭтоОбъект = Ложь;
	
#Если НЕ ТонкийКлиент И НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
	Если КлючДанных <> Неопределено
	   И XMLТипЗнч(КлючДанных) <> Неопределено Тогда
		ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
		ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
	КонецЕсли;
#КонецЕсли
	
	Если ЭтоОбъект Тогда
		Сообщение.УстановитьДанные(КлючДанных);
	Иначе
		Сообщение.КлючДанных = КлючДанных;
	КонецЕсли;
	
	Если НЕ ПустаяСтрока(ПутьКДанным) Тогда
		Сообщение.ПутьКДанным = ПутьКДанным;
	КонецЕсли;
		
	Сообщение.Сообщить();
	
	Отказ = Истина;
	
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция СгенерироватьИмяФайлаПоДате(Знач ДатаДляГенерации = Неопределено) Экспорт 
	
	Если ДатаДляГенерации = Неопределено или Не ЗначениеЗаполнено(ДатаДляГенерации) Тогда 
		ДатаДляГенерации = ТекущаяДата();
	КонецЕсли;
	
	Попытка
		УИД = СокрЛП(Новый УникальныйИдентификатор);
		УИД = "" + Формат(ДатаДляГенерации,"ДФ=yyyyMMddhhmmss; ДП=00000000000000") + Лев(УИД,8);
	Исключение
		УИД = Лев(УИД,8);
	КонецПопытки;
	
	Возврат УИД;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьЗначениеСтруктуры(Ключ,СтруктЗнач,ЗначениеПоУмолчанию=Неопределено) Экспорт 
	
	//СтруктЗнач = Новый Структура;
	
	Если ТипЗнч(СтруктЗнач) <> Тип("Структура") или ПустаяСтрока(Ключ) Тогда
		Возврат ЗначениеПоУмолчанию;
	КонецЕсли;
	
	ЗначСтр = Неопределено;
	Если СтруктЗнач.Свойство(Ключ, ЗначСтр) Тогда 
		Если ЗначСтр = Неопределено Тогда 
			Возврат ЗначениеПоУмолчанию;
		Иначе 
			Возврат ЗначСтр;
		КонецЕсли;
	Иначе 
		Возврат ЗначениеПоУмолчанию;
	КонецЕсли;
	
КонецФункции
//...
&НаКлиентеНаСервереБезКонтекста
Функция Из16ВЧисло(Знач Значение)
    Результат = 0;
    Множитель = 1;
    Пока Значение <> "" Цикл
        Результат = Результат + Множитель * (Найти("0123456789ABCDEF", Прав(Значение,1))-1);
        Множитель = Множитель * 16;
        Значение = Лев(Значение,СтрДлина(Значение)-1);
    КонецЦикла;
    Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ДекодироватьURL(URL, КодСлужногоСимвола=37, WindowsFileURI=Истина)
    ДлинаСтроки = СтрДлина(URL);
    Инд = 1;
    Результат = "";
    ПолныйКод = 0;
    ОсталосьСимволов = 0;
    Пока Инд <= ДлинаСтроки Цикл
        Код = КодСимвола(URL, Инд);
        Если Код = КодСлужногоСимвола Тогда //37
            // Символ(37) = "%"
            Код = Из16ВЧисло(Сред(URL, Инд+1, 2));
            Инд = Инд + 2;
        ИначеЕсли ОсталосьСимволов = 0 Тогда
            Если (Код = 43) и (не WindowsFileURI) Тогда
                // Символ(43) = "+"
                Код = 32; // Символ(32) = " " (пробел)
            КонецЕсли;
            Результат = Результат + Символ(Код);
            Инд = Инд + 1;
            Продолжить;
        КонецЕсли;
        Если Код <= 127 Тогда
            // Код = 0b0ххххххх
            Результат = Результат + Символ(Код);
        ИначеЕсли Код <= 191 Тогда
            // Код = 0b10хххххх
            ПолныйКод = (ПолныйКод*64) + (Код%64); // shl(ПолныйКод, 6) + (Код & 0x3F)
            ОсталосьСимволов = ОсталосьСимволов - 1;
            Если ОсталосьСимволов = 0 Тогда
                Результат = Результат + Символ(ПолныйКод);
            КонецЕсли;
        ИначеЕсли Код <= 223 Тогда
            // Код = 0b110ххххх
            ПолныйКод = Код % 32; // Код & 0x1F
            ОсталосьСимволов = 1;
        ИначеЕсли Код <= 239 Тогда
            // Код = 0b1110хххх
            ПолныйКод = Код % 16; // Код & 0x0F
            ОсталосьСимволов = 2;
        ИначеЕсли Код <= 247 Тогда
            // Код = 0b11110ххх
            ПолныйКод = Код % 8; // Код & 0x07
            ОсталосьСимволов = 3;
        ИначеЕсли Код <= 251 Тогда
            // Код = 0b111110хх
            ПолныйКод = Код % 4; // Код & 0x03
            ОсталосьСимволов = 4;
        ИначеЕсли Код <= 253 Тогда
            // Код = 0b1111110х
            ПолныйКод = Код % 2; // Код & 0x01
            ОсталосьСимволов = 5;
        КонецЕсли;
        Инд = Инд + 1;
    КонецЦикла;
    Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция Base64ЗначениеТекстом(СтрокаТекста)
	
	Если ПустаяСтрока(СтрокаТекста) Тогда 
		Возврат "";
	КонецЕсли;
	
	ДД = Base64Значение(СтрокаТекста);
	
	Поток = Новый ПотокВПамяти;
	
	Запись = Новый ЗаписьДанных(Поток);
    Запись.Записать(ДД);
    Запись.Закрыть();    
	
    Поток.Перейти(0, ПозицияВПотоке.Начало);
	Текст = Новый ЧтениеТекста(Поток, КодировкаТекста.Системная);
	Значение = Текст.Прочитать();
	Текст.Закрыть();
	
	Поток.Закрыть();
	
	Возврат Значение;
КонецФункции
//...
&НаКлиентеНаСервереБезКонтекста
Функция УдалитьДвойныеПробелыИзСтроки(ФИО)
	
	РезФун = СокрЛП(ФИО);
	РезФун = СтрЗаменить(РезФун, "  ", " ");
	Пока Найти(РезФун, "  ") > 0 Цикл 
		РезФун = СтрЗаменить(РезФун, "  ", " ");
	КонецЦикла;
	
	Возврат РезФун;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьОтчествоИзАД(Знач Фамилия, Знач Имя, Знач ФИО, НовоеИмя)
	
	Если ПустаяСтрока(Фамилия) или ПустаяСтрока(Имя) или ПустаяСтрока(ФИО) Тогда 
		Возврат "";
	КонецЕсли;
	
	Фамилия = СокрЛП(Фамилия);
	Имя = СокрЛП(Имя);
	ФИО = СокрЛП(ФИО);
	
	//Избавимся от лишних пробелов ФИО
	ФИО = УдалитьДвойныеПробелыИзСтроки(ФИО);
	Имя = УдалитьДвойныеПробелыИзСтроки(Имя);
	
	МассивСтрок = СтрРазделить(ФИО," ",Истина);
	Если МассивСтрок.Количество() <> 3 Тогда Возврат ""; КонецЕсли;
	
	МассивСтрокИмя = СтрРазделить(Имя," ",Истина);
	
	//Убрать Фамилию
	Если Найти(ФИО+" ", Фамилия+" ") = 0 Тогда Возврат ""; КонецЕсли;
	ФИО = СокрЛП(СтрЗаменить(ФИО+" ", Фамилия+" ", ""));
	
	//Убрать Имя
	Если МассивСтрокИмя.Количество() = 2 Тогда
		НовоеИмя = СокрЛП(МассивСтрокИмя[0]);
		НовоеОтчество = СокрЛП(МассивСтрокИмя[1]);
		
		//Убрать Имя
		Если Найти(ФИО+" ", НовоеИмя+" ") = 0 Тогда 
			НовоеИмя = "";
			Возврат ""; 
		КонецЕсли;
		ФИО = СокрЛП(СтрЗаменить(ФИО+" ", Фамилия+" ", ""));
		
		//Найти Отчество
		Если Найти(ФИО+" ", НовоеОтчество+" ") = 0 Тогда 
			НовоеИмя = "";
			Возврат ""; 
		КонецЕсли;
		
		ФИО = НовоеОтчество;
		
	Иначе 
		Если Найти(ФИО+" ", Имя+" ") = 0 Тогда Возврат ""; КонецЕсли;
		ФИО = СокрЛП(СтрЗаменить(ФИО+" ", Имя+" ", ""));
	КонецЕсли;
	
	Возврат ФИО;
КонецФункции
#КонецОбласти
Использовал следующий материал для написания функции:
- Интеграция 1С и Active Directory на сервере (windows) (прошлая разработка)
- Воспользовался ссылками на материалы из работы в Интеграция 1С с Active Directory на LINUX через ldapsearch
- Декодирование URL
- Перекодировка строки в UTF8
- LDAP Search Filters
- Введение в команды в Linux
- ldapsearch — утилита для поиска информации в LDAP
- Основные атрибуты Active Directory
- Active Directory и LDAP
- Пример команды ldapsearch (с SSL)
Приложил обработку, но в основном она состоит из парочки функций. Тестирование произведено на версии платформы 8.3.24.1586. Но к платформе код не имеет отношения. Версия конфигурации тоже неважна, работает на любой.
Вступайте в нашу телеграмм-группу Инфостарт
 
                                    