Продолжение разработки Интеграция 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. Но к платформе код не имеет отношения. Версия конфигурации тоже неважна, работает на любой.