#Область Парсер_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 = СтрокаТекст;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти