Доброго времени суток всем читающим! Работаю в компании, где сотрудников более 2.500, много подразделений и неплохая текучка в сфере торговли. Сисадмины просто "зашивались" на создании пользователей и раздаче типовых прав, заявки поступают, сисадмины помимо обслуживания ЛВС, поломки принтеров, подключения ПК и т.д. и т.п. создавали пользователей. По сути создать пользователя несложно им, но согласно регламенту в данных пользователя AD должны быть ФИО, должность, отдел, личный телефон, рабочий телефон, домашний телефон, про стандартные реквизиты понятно все, и вот тут была заминка, доступа у сисадмина к 1С: ЗУП 2.5 нет и не должно быть, а вот личные данные где ему взять? Из - за этой заминки создание пользователей занимало немало времени, сходи в кадры, возьми данные, приди к себе на рабочее место, создай пользователя, забей данные, и не дай Бог неверно. Но мой начальник решил пойти другим путем, почему бы все это дело по созданию пользователей не переложить на плечи HR-отдела, по сути HR имеют доступ в данным сотрудников, вот пусть и колотят пользаков, но тут возникает заминка, что в HR-отделе женщины с серверам на ВЫ, следовательно надо озадачить этим делом ЗУП.
Для начала попросил менеджера по персоналу выкрутить должности из ЗУП 2.5 и выделить те должности, которым нужен доступ к компьютеру, а следовательно в AD.
Создал РС по хранению пользователей домена где имееются поля ДатаСоздания, ПользовательАД, ПочтаАД, и ФизЛицо, в который изначально обработкой с простым кодом были добавлены все пользователи AD, обработку прикрепил, вдруг кому понадобится.
Так как у нас в организации несколько почтовых доменов и много организация, создал справочник, в котором указывается Организация, и записывается почтовый домен, получилось см. рис 1
Дальше встал вопрос, как реализовать синхронизацию должностей и групп доступа AD, а также определить папки (группы) где должны находится пользователи. Сначала создал справочник для подразделений и групп см. рис 2. Потом создал справочник для должностей и групп доступа см. рис 3.
На мой взгляд справочники более простой вариант для заполнения, тем более что доступ к ним только у админа 1с, который при необходимости добавляет новое подразделение, должность или почтовый домен. Изначально это конечно трудоемкий и муторный процесс, но потом все это воздается.
Следующим этапом было определено, что доступ к AD автоматом заводится только для пользователей которые устраиваются на Основное место работы, остальные идут только через согласованием с мега боссом. ))
Дальше возник вопрос как написать ФИО сотрудника в транслите, ранее эти вопросом не задавался, но решил спросить у гугла, перепробовал много разных вариантов, и решил остановится вот на этом (где взял уже не помню), но этот не мое, да простит меня автор сего дела, что не указал ссылку))
Функция Транслит(Вход)
Русский = "абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
Англ = "a;b;v;g;d;e;yo;zh;z;i;y;k;l;m;n;o;p;r;s;t;u;f;kh;ts;ch;sh;shch;;y;;e;yu;ya;A;B;V;G;D;E;Yo;Zh;Z;I;Y;K;L;M;N;O;P;R;S;T;U;F;Kh;Ts;Ch;Sh;Shch;;Y;;E;Yu;Ya";
МассивАнгл = _РазложитьСтрокуВМассивПодстрок(Англ,";");
ДлиннаВход = СтрДлина(Вход);
Выход = "";
Для а=1 По ДлиннаВход Цикл
ТекущийСимвол = Сред(Вход,а,1);
Позиция = Найти(Русский,ТекущийСимвол);
Если Позиция > 0 Тогда
Выход = Выход + МассивАнгл[Позиция-1];
Иначе
Выход = Выход + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
Возврат Выход;
КонецФункции
Функция _РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
После этого много «Пока гуглю» изучение методов создания пользователей из 1с, в итоге последующее, для документов Прием на работу, Кадровый перевод, Оплата больничного (вид больничного «беременность и роды»), Отпуск сотрудника (кадровый), Увольнение создал подписки на событие с обработкой события ПриПроведении, так как создавать пользователей необходимо не всем кадровикам, а только отвественным лицам, была создана роль "ДобавлениеУдалениеПользователейАД", проверка который проводится перед выполнением кода самой задачи, нет прав, код не выполняется))
При проведении Прием на работу :
//проверяем доступность роли
Если РольДоступна("ДобавлениеУдалениеПользователейАД") Тогда
Для Каждого ТекСтрока из Источник.РаботникиОрганизации Цикл
Если ТекСтрока.Сотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы Тогда
//проверяем доступность должности к АД
ЗапросДол = Новый Запрос;
ЗапросДол.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗапросДол.УстановитьПараметр("Организация", Источник.Организация);
ЗАпросДол.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.Должность
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация";
ВыборкаДол = ЗапросДол.Выполнить().Выгрузить();
Если ВыборкаДол.Количество() > 0 Тогда
//Проверяем если пользователь в АД
ЗапросАД = Новый Запрос;
ЗапросАД.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
ЗапросАД.Текст =
"ВЫБРАТЬ
| грсСписокПользователейАД.ДатаСоздания,
| грсСписокПользователейАД.ПользовательАД,
| грсСписокПользователейАД.ПочтаАД,
| грсСписокПользователейАД.ФизЛицо
|ИЗ
| РегистрСведений.грсСписокПользователейАД КАК грсСписокПользователейАД
|ГДЕ
| грсСписокПользователейАД.ФизЛицо = &ФизЛицо";
ВыборкаАД = ЗапросАД.Выполнить().Выбрать();
//создаем пользователя
Если ВыборкаАД.Количество() = 0 Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаИмя = Выборка.Имя+" "+ Выборка.Отчество;
CтрокаФамилия = Выборка.Фамилия;
СтрокаФИО = Выборка.Фамилия +" "+ Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
ЗапросДом = Новый Запрос;
ЗапросДом.УстановитьПараметр("Организация", Источник.Организация);
ЗапросДом.Текст =
"ВЫБРАТЬ
| грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен.ПочтоыйДомен КАК ПочтДомен
|ИЗ
| Справочник.грсСоответствиеОрганизацийИПочтовыхДоменов.ОрганизацияДомен КАК грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен
|ГДЕ
| грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен.Организация = &Организация
| И грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаДом = ЗапросДом.Выполнить().Выбрать();
ТранслиФИО = Транслит(СтрокаВход);
РС = РегистрыСведений.грсСписокПользователейАД.СоздатьМенеджерЗаписи();
РС.Активность = Истина;
РС.ДатаСоздания = ТекСтрока.ДатаПриема;
РС.ПользовательАД = ТранслиФИО;
Пока ВыборкаДом.Следующий() Цикл
РС.ПочтаАД = Нрег(РС.ПользовательАД)+ВыборкаДом.ПочтДомен;
КонецЦикла;
РС.ФизЛицо = ТекСтрока.Сотрудник.ФизЛицо;
РС.Пароль = "Z"+"z"+Формат(ТекСтрока.ДатаПриема, "ДФ=yyyyMMdd");
РС.Записать();
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗАпросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
Попытка
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = РС.ПользовательАД ;
strSam = РС.ПочтаАД;
strPWD = РС.Пароль;
objUser = objContainer.Create("User", "CN=" +CтрокаФамилия+" "+СтрокаИмя);
objUser.Put("name", CтрокаФамилия+" "+СтрокаИмя);
objUser.Put("userPrincipalName", strSam);
objUser.Put("sAMAccountName",strCN);
objUser.Put("mail", strSam);
objUser.Put("sn", CтрокаФамилия);
objUser.Put("givenName", СтрокаИмя);
objUser.Put("displayName", CтрокаФамилия+" "+СтрокаИмя);
РС = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
РС.Отбор.Объект.Установить(ТекСтрока.Сотрудник.ФизЛицо);
РС.Отбор.Вид.Установить(Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица);
РС.Прочитать();
Если РС.Количество() > 0 Тогда
Тел = РС.Получить(0).Представление;
objUser.Put("mobile", Тел);
КонецЕсли;
objUser.Put("company", Источник.Организация.Наименование);
objUser.Put("title", ТекСтрока.Должность.Наименование);
objUser.Put("department", ТекСтрока.ПодразделениеОрганизации.Наименование);
objUser.SetInfo();
objUser.userAccountControl = 512;
objUser.SetPassword(strPWD);
objUser.SetInfo();
ЗапросГруппы = НОвый Запрос;
ЗапросГруппы.УстановитьПараметр("Организация", Источник.Организация);
ЗапросГруппы.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗапросГруппы.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросГруппы.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.ГруппаБезопасности,
| грсДолжностиДляАДСписокДолжностейАД.ПутьГруппы
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Подразделение = &Подразделение";
ВыборкаГрупп = ЗапросГруппы.Выполнить().Выгрузить();
Для Каждого ТекГруппа из ВыборкаГрупп Цикл
ГруппаБезопасности = ПолучитьCOMОбъект("LDAP://" + ТекГруппа.ПутьГруппы);
ГруппаБезопасности.Add(objUser.ADsPath);
objUser.SetInfo();
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьОбщийМакет("грсМакетЛогиПарольАД");
ОбластьМакета = Макет.ПолучитьОбласть("ПользователиАД");
ОбластьМакета.Параметры.пользователь ="Сотрудник: "+ ТекСтрока.Сотрудник.ФизЛицо.Наименование;
ОбластьМакета.Параметры.логин = "Логин: "+РС.ПользовательАД;
ОбластьМакета.Параметры.логин1 = "Логин: domen\"+РС.ПользовательАД;
ОбластьМакета.Параметры.пароль ="Пароль: "+ РС.Пароль;
ОбластьМакета.Параметры.почта = "Е-mail: "+РС.ПочтаАД;
ТабДок.Вывести(ОбластьМакета);
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Показать();
//печатаем инструкции по подключению к RDP
ЗапуститьПриложение("\\file\Common\Секретари\Инструкции ИТ\Подключение к удаленному рабочему столу Linux.doc");
ЗапуститьПриложение("\\file\Common\Секретари\Инструкции ИТ\Подключение к удаленному рабочему столу Windows.docx");
Исключение
КонецПопытки;
Иначе
Сообщить("Для сотрудника " + ТекСтрока.Сотрудник.ФизЛицо + " уже создан пользователь AD", СтатусСообщения.Важное);
КонецЕсли;
Иначе
Сообщить("Для должности "+ ТекСтрока.Должность + " не назначен доступ к ИС");
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
При проведении Кадрового перемещения:
Если РольДоступна("ДобавлениеУдалениеПользователейАД") Тогда
Для Каждого Текстрока из Источник.РаботникиОрганизации Цикл
Попытка
Если ТекСтрока.Сотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы Тогда
//проверим пользователя на наличие в РС
ЗапросДол = Новый Запрос;
ЗапросДол.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗапросДол.УстановитьПараметр("Организация", Источник.Организация);
ЗАпросДол.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.Должность
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация";
ВыборкаДол = ЗапросДол.Выполнить().Выгрузить();
//проверяем создан ли пользователь в АД
Если ВыборкаДол.Количество() > 0 Тогда
ЗапросАД = Новый Запрос;
ЗапросАД.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
ЗапросАД.Текст =
"ВЫБРАТЬ
| грсСписокПользователейАД.ДатаСоздания,
| грсСписокПользователейАД.ПользовательАД,
| грсСписокПользователейАД.ПочтаАД,
| грсСписокПользователейАД.ФизЛицо
|ИЗ
| РегистрСведений.грсСписокПользователейАД КАК грсСписокПользователейАД
|ГДЕ
| грсСписокПользователейАД.ФизЛицо = &ФизЛицо";
ВыборкаАД = ЗапросАД.Выполнить().Выбрать();
ВыборкаАД.Следующий();
//создаем пользователя если не найден
Если ВыборкаАД.Количество() = 0 Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаИмя = Выборка.Имя+" "+ Выборка.Отчество;
CтрокаФамилия = Выборка.Фамилия;
СтрокаФИО = Выборка.Фамилия +" "+ Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
ЗапросДом = Новый Запрос;
ЗапросДом.УстановитьПараметр("Организация", Источник.Организация);
ЗапросДом.Текст =
"ВЫБРАТЬ
| грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен.ПочтоыйДомен КАК ПочтДомен
|ИЗ
| Справочник.грсСоответствиеОрганизацийИПочтовыхДоменов.ОрганизацияДомен КАК грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен
|ГДЕ
| грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен.Организация = &Организация
| И грсСоответствиеОрганизацийИПотовыхДоменовОрганизацияДомен.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаДом = ЗапросДом.Выполнить().Выбрать();
ТранслиФИО = Транслит(СтрокаВход);
РС = РегистрыСведений.грсСписокПользователейАД.СоздатьМенеджерЗаписи();
РС.Активность = Истина;
РС.ДатаСоздания = ТекСтрока.ДатаНачала;
РС.ПользовательАД = ТранслиФИО;
Пока ВыборкаДом.Следующий() Цикл
РС.ПочтаАД = Нрег(РС.ПользовательАД)+ВыборкаДом.ПочтДомен;
КонецЦикла;
РС.ФизЛицо = ТекСтрока.Сотрудник.ФизЛицо;
РС.Пароль = "Z"+"z"+Формат(ТекСтрока.ДатаНачала, "ДФ=yyyyMMdd");
РС.Записать();
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗАпросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
Попытка
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = РС.ПользовательАД ;
strSam = РС.ПочтаАД;
strPWD = РС.Пароль;
objUser = objContainer.Create("User", "CN=" +CтрокаФамилия+" "+СтрокаИмя);
objUser.Put("name", CтрокаФамилия+" "+СтрокаИмя);
objUser.Put("userPrincipalName", strSam);
objUser.Put("sAMAccountName",strCN);
objUser.Put("mail", strSam);
objUser.Put("sn", CтрокаФамилия);
objUser.Put("givenName", СтрокаИмя);
objUser.Put("displayName", CтрокаФамилия+" "+СтрокаИмя);
РС = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
РС.Отбор.Объект.Установить(ТекСтрока.Сотрудник.ФизЛицо);
РС.Отбор.Вид.Установить(Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица);
РС.Прочитать();
Если РС.Количество() > 0 Тогда
Тел = РС.Получить(0).Представление;
objUser.Put("mobile", Тел);
КонецЕсли;
objUser.Put("company", Источник.Организация.Наименование);
objUser.Put("title", ТекСтрока.Должность.Наименование);
objUser.Put("department", ТекСтрока.ПодразделениеОрганизации.Наименование);
objUser.SetInfo();
objUser.userAccountControl = 512;
//65536;
//objUser.AccountDisabled=1;
objUser.SetPassword(strPWD);
//objUser.pwdLastSet=0;
objUser.SetInfo();
ЗапросГруппы = НОвый Запрос;
ЗапросГруппы.УстановитьПараметр("Организация", Источник.Организация);
ЗапросГруппы.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗапросГруппы.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросГруппы.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.ГруппаБезопасности,
| грсДолжностиДляАДСписокДолжностейАД.ПутьГруппы
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Подразделение = &Подразделение";
ВыборкаГрупп = ЗапросГруппы.Выполнить().Выгрузить();
Для Каждого ТекГруппа из ВыборкаГрупп Цикл
ГруппаБезопасности = ПолучитьCOMОбъект("LDAP://" + ТекГруппа.ПутьГруппы);
ГруппаБезопасности.Add(objUser.ADsPath);
objUser.SetInfo();
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьОбщийМакет("грсМакетЛогиПарольАД");
ОбластьМакета = Макет.ПолучитьОбласть("ПользователиАД");
ОбластьМакета.Параметры.пользователь ="Сотрудник: "+ ТекСтрока.Сотрудник.ФизЛицо.Наименование;
ОбластьМакета.Параметры.логин = "Логин: "+РС.ПользовательАД;
ОбластьМакета.Параметры.логин1 = "Логин: domen\"+РС.ПользовательАД;
ОбластьМакета.Параметры.пароль ="Пароль: "+ РС.Пароль;
ОбластьМакета.Параметры.почта = "Е-mail: "+РС.ПочтаАД;
ТабДок.Вывести(ОбластьМакета);
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Показать();
ЗапуститьПриложение("\\file\Common\Секретари\Инструкции ИТ\Подключение к удаленному рабочему столу Linux.doc");
ЗапуститьПриложение("\\file\Common\Секретари\Инструкции ИТ\Подключение к удаленному рабочему столу Windows.docx");
Исключение
КонецПопытки;
//если найден пользователь
Иначе
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаИмя = Выборка.Имя+" "+ Выборка.Отчество;
CтрокаФамилия = Выборка.Фамилия;
СтрокаФИО = Выборка.Фамилия +" "+ Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
//если найден сверям должности и при различии перемещаем с новыми правами
Отбор = Новый Структура;
Отбор.Вставить("Сотрудник",ТекСтрока.Сотрудник);
СтарДанные = РегистрыСведений.РаботникиОрганизаций.ПолучитьПоследнее(Источник.Дата, Отбор);
Если Не ТекСтрока.Должность = СтарДанные.Должность или не СтарДанные.ПодразделениеОрганизации = ТекСтрока.ПодразделениеОрганизации Тогда
//не равны должности но равны подразделения
Если Не ТекСтрока.Должность = СтарДанные.Должность и СтарДанные.ПодразделениеОрганизации = ТекСтрока.ПодразделениеОрганизации Тогда
ЗапросДол = Новый Запрос;
ЗапросДол.Текст =
ЗапросДол = Новый Запрос;
ЗапросДол.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗАпросДол.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.Должность
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаДол = ЗапросДол.Выполнить().Выгрузить();
Если ВыборкаДол.Количество() > 0 Тогда
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФИО;
element_user = objContainer.GetObject("User", "CN=" +strCN);
element_user.Put("title", ТекСтрока.Должность.Наименование);
element_user.SetInfo();
ЗапросСтарГрупп = НОвый Запрос;
ЗапросСтарГрупп.УстановитьПараметр("Владелец", Источник.Организация);
ЗапросСтарГрупп.УстановитьПараметр("Должность", СтарДанные.Должность);
ЗапросСтарГрупп.УстановитьПараметр("Подразделение", СтарДанные.ПодразделениеОрганизации);
ЗапросСтарГрупп.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.ГруппаБезопасности,
| грсДолжностиДляАДСписокДолжностейАД.ПутьГруппы
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Подразделение = &Подразделение";
ВыборкаСтарГрупп = ЗапросСтарГрупп.Выполнить().Выгрузить();
Для Каждого ТекСтарГруппа из ВыборкаСтарГрупп Цикл
ГруппаБезопасности = ПолучитьCOMОбъект("LDAP://" + ТекСтарГруппа.ПутьГруппы);
ГруппаБезопасности.Remove(element_user.ADsPath);
element_user.SetInfo();
КонецЦикла;
ЗапросГруппы = НОвый Запрос;
ЗапросГруппы.УстановитьПараметр("Организация", Источник.Организация);
ЗапросГруппы.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗапросГруппы.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросГруппы.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.ГруппаБезопасности,
| грсДолжностиДляАДСписокДолжностейАД.ПутьГруппы
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Подразделение = &Подразделение";
ВыборкаГрупп = ЗапросГруппы.Выполнить().Выгрузить();
Для Каждого ТекГруппа из ВыборкаГрупп Цикл
ГруппаБезопасности = ПолучитьCOMОбъект("LDAP://" + ТекГруппа.ПутьГруппы);
ГруппаБезопасности.Add(element_user.ADsPath);
element_user.SetInfo();
КонецЦикла;
КонецЕсли;
КонецЕсли;
//равны должности но не равны подразделения
Если ТекСтрока.Должность = СтарДанные.Должность и Не СтарДанные.ПодразделениеОрганизации = ТекСтрока.ПодразделениеОрганизации Тогда
ЗапросДол = Новый Запрос;
ЗапросДол.Текст =
ЗапросДол = Новый Запрос;
ЗапросДол.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗАпросДол.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.Должность
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаДол = ЗапросДол.Выполнить().Выгрузить();
Если ВыборкаДол.Количество() > 0 Тогда
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", СтарДанные.ПодразделениеОрганизации);
ЗапросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФИО;
element_user = objContainer.GetObject("User", "CN=" +strCN);
element_user.Put("department", ТекСтрока.ПодразделениеОрганизации.Наименование);
element_user.SetInfo();
ЗапросСтарПодр = Новый Запрос;
ЗапросСтарПодр.УстановитьПараметр("Организация", Источник.Организация);
ЗапросСтарПодр.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросСтарПодр.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаСтарПодр = ЗапросСтарПодр.Выполнить().Выгрузить();
ДЛя Каждого ТекПутьСтары из ВыборкаСтарПодр Цикл
ПутьАДСтарый = СтрЗаменить(ТекПутьСтары.ГруппаАД,"/","");
КонецЦикла;
element_group = ПолучитьCOMОбъект("LDAP://"+ПутьАДСтарый+",DC=domen,DC=ru");
element_group.MoveHere("LDAP://CN=" +strCN+","+ПутьАД+",DC=domen,DC=ru", "CN=" +strCN);
element_group.SetInfo();
КонецЕсли;
КонецЕсли;
//ни подразделение ни должность не равно
Если Не ТекСтрока.Должность = СтарДанные.Должность и не СтарДанные.ПодразделениеОрганизации = ТекСтрока.ПодразделениеОрганизации Тогда
ЗапросДол = Новый Запрос;
ЗапросДол.Текст =
ЗапросДол = Новый Запрос;
ЗапросДол.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗАпросДол.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.Должность
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаДол = ЗапросДол.Выполнить().Выгрузить();
Если ВыборкаДол.Количество() > 0 Тогда
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", СтарДанные.ПодразделениеОрганизации);
ЗапросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФИО;
element_user = objContainer.GetObject("User", "CN=" +strCN);
element_user.Put("title", ТекСтрока.Должность.Наименование);
element_user.Put("department", ТекСтрока.ПодразделениеОрганизации.Наименование);
element_user.SetInfo();
ЗапросСтарГрупп = НОвый Запрос;
ЗапросСтарГрупп.УстановитьПараметр("Владелец", Источник.Организация);
ЗапросСтарГрупп.УстановитьПараметр("Должность", СтарДанные.Должность);
ЗапросСтарГрупп.УстановитьПараметр("Подразделение", СтарДанные.ПодразделениеОрганизации);
ЗапросСтарГрупп.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.ГруппаБезопасности,
| грсДолжностиДляАДСписокДолжностейАД.ПутьГруппы
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Подразделение = &Подразделение";
ВыборкаСтарГрупп = ЗапросСтарГрупп.Выполнить().Выгрузить();
Для Каждого ТекСтарГруппа из ВыборкаСтарГрупп Цикл
ГруппаБезопасности = ПолучитьCOMОбъект("LDAP://" + ТекСтарГруппа.ПутьГруппы);
ГруппаБезопасности.Remove(element_user.ADsPath);
element_user.SetInfo();
КонецЦикла;
ЗапросГруппы = НОвый Запрос;
ЗапросГруппы.УстановитьПараметр("Организация", Источник.Организация);
ЗапросГруппы.УстановитьПараметр("Должность", ТекСтрока.Должность);
ЗапросГруппы.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросГруппы.Текст =
"ВЫБРАТЬ
| грсДолжностиДляАДСписокДолжностейАД.ГруппаБезопасности,
| грсДолжностиДляАДСписокДолжностейАД.ПутьГруппы
|ИЗ
| Справочник.грсДолжностиДляАД.СписокДолжностейАД КАК грсДолжностиДляАДСписокДолжностейАД
|ГДЕ
| грсДолжностиДляАДСписокДолжностейАД.Ссылка.ПометкаУдаления = ЛОЖЬ
| И грсДолжностиДляАДСписокДолжностейАД.Должность = &Должность
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Организация = &Организация
| И грсДолжностиДляАДСписокДолжностейАД.Ссылка.Подразделение = &Подразделение";
ВыборкаГрупп = ЗапросГруппы.Выполнить().Выгрузить();
Для Каждого ТекГруппа из ВыборкаГрупп Цикл
ГруппаБезопасности = ПолучитьCOMОбъект("LDAP://" + ТекГруппа.ПутьГруппы);
ГруппаБезопасности.Add(element_user.ADsPath);
element_user.SetInfo();
КонецЦикла;
ЗапросСтарПодр = Новый Запрос;
ЗапросСтарПодр.УстановитьПараметр("Организация", Источник.Организация);
ЗапросСтарПодр.УстановитьПараметр("Подразделение", ТекСтрока.ПодразделениеОрганизации);
ЗапросСтарПодр.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаСтарПодр = ЗапросСтарПодр.Выполнить().Выгрузить();
ДЛя Каждого ТекПутьСтары из ВыборкаСтарПодр Цикл
ПутьАДСтарый = СтрЗаменить(ТекПутьСтары.ГруппаАД,"/","");
КонецЦикла;
element_group = ПолучитьCOMОбъект("LDAP://"+ПутьАДСтарый+",DC=domen,DC=ru");
element_group.MoveHere("LDAP://CN=" +strCN+","+ПутьАД+",DC=domen,DC=ru", "CN=" +strCN);
element_group.SetInfo();
КонецЕсли;
КонецЕсли;
ИНаче
//если новая должность не имеет доступа к АД лочим юзверя
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаФио = Выборка.Фамилия + " "+Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
Отбор = Новый Структура;
Отбор.Вставить("Сотрудник",ТекСтрока.Сотрудник);
СтарДанные = РегистрыСведений.РаботникиОрганизаций.ПолучитьПоследнее(Источник.Дата, Отбор);
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", СтарДанные.ПодразделениеОрганизации);
ЗАпросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФИО;
element_user = objContainer.GetObject("User", "CN=" +strCN);
element_user.userAccountControl = 2;
element_user.SetInfo();
element_group = ПолучитьCOMОбъект("LDAP://OU=user,OU=Dead,DC=domen,DC=ru");
element_group.MoveHere("LDAP://CN=" +strCN+","+ПутьАД+",DC=domen,DC=ru", "CN=" +strCN);
element_group.SetInfo();
КонецЕсли;
КонецЕСли;
КонецЕсли;
КонецЕсли;
Исключение;
КонецПопытки;
КонецЦикла;
КонецЕсли;
При проведении Отпуска:
Если РольДоступна("ДобавлениеУдалениеПользователейАД") Тогда
Для Каждого ТекСтрока из Источник.РаботникиОрганизации Цикл
Попытка;
//находим пользователя
ЗапросАД = Новый Запрос;
ЗапросАД.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
ЗапросАД.Текст =
"ВЫБРАТЬ
| грсСписокПользователейАД.ДатаСоздания,
| грсСписокПользователейАД.ПользовательАД,
| грсСписокПользователейАД.ПочтаАД,
| грсСписокПользователейАД.ФизЛицо
|ИЗ
| РегистрСведений.грсСписокПользователейАД КАК грсСписокПользователейАД
|ГДЕ
| грсСписокПользователейАД.ФизЛицо = &ФизЛицо";
ВыборкаАД = ЗапросАД.Выполнить().Выбрать();
ВыборкаАД.Следующий();
Если ВыборкаАД.Количество() > 0 Тогда
Если ТекСтрока.Сотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаФио = Выборка.Фамилия + " "+Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
//находим группу АД
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", ТекСтрока.Сотрудник.ПодразделениеОрганизации);
ЗАпросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФио;
element_user = objContainer.GetObject("User", "CN=" +strCN);
//расчитываем время блокировки пользователя = день начала отпуска
ДатаАД = Формат((НачалоДня(ТекСтрока.ДатаНачала+86400) - НАчалоДня(Дата("16010101"))), "ЧГ=0");
element_user.accountExpires = Формат(ДатаАД*10000000, "ЧГ=0");
element_user.SetInfo();
КонецЕсли;
КонецЕсли;
Исключение;
КонецПопытки;
КонецЦикла;
КонецЕСли;
При проведении больничного листа по беременности и родам:
Если РольДоступна("ДобавлениеУдалениеПользователейАД") Тогда
Если Источник.Сотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы и Источник.ПричинаНетрудоспособности = Перечисления.ПричиныНетрудоспособности.ПоБеременностиИРодам Тогда
Попытка;
//находим пользователя АД
ЗапросАД = Новый Запрос;
ЗапросАД.УстановитьПараметр("ФизЛицо", Источник.Сотрудник.ФизЛицо);
ЗапросАД.Текст =
"ВЫБРАТЬ
| грсСписокПользователейАД.ДатаСоздания,
| грсСписокПользователейАД.ПользовательАД,
| грсСписокПользователейАД.ПочтаАД,
| грсСписокПользователейАД.ФизЛицо
|ИЗ
| РегистрСведений.грсСписокПользователейАД КАК грсСписокПользователейАД
|ГДЕ
| грсСписокПользователейАД.ФизЛицо = &ФизЛицо";
ВыборкаАД = ЗапросАД.Выполнить().Выбрать();
ВыборкаАД.Следующий();
Если ВыборкаАД.Количество() > 0 Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", Источник.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаФио = Выборка.Фамилия + " "+Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
//Находим группу АД
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", Источник.Сотрудник.ПодразделениеОрганизации);
ЗАпросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФио;
element_user = objContainer.GetObject("User", "CN=" +strCN);
//начала больничного по беременности и родам
ДатаАД = Формат((НачалоДня(Источник.ДатаНачалаСобытия+86400) - НАчалоДня(Дата("16010101"))), "ЧГ=0");
element_user.accountExpires = Формат(ДатаАД*10000000, "ЧГ=0");
element_user.SetInfo();
КонецЕсли;
Исключение;
КонецПопытки;
КонецЕсли;
КонецЕсли;
Ну и при проведении увольнения:
Если РольДоступна("ДобавлениеУдалениеПользователейАД") Тогда
Для Каждого ТекСтрока из Источник.РаботникиОрганизации Цикл
попытка;
Если ТекСтрока.Сотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
Запрос.Текст =
"ВЫБРАТЬ
| ФИОФизЛицСрезПоследних.Фамилия,
| ФИОФизЛицСрезПоследних.Имя,
| ФИОФизЛицСрезПоследних.Отчество
|ИЗ
| РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
| ФИОФизЛицСрезПоследних.ФизЛицо = &ФизЛицо";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаВход = Выборка.Фамилия + Лев(Выборка.Имя, 1)+Лев(Выборка.Отчество, 1);
СтрокаФио = Выборка.Фамилия + " "+Выборка.Имя+" "+Выборка.Отчество;
КонецЦикла;
Отбор = Новый Структура;
Отбор.Вставить("Сотрудник",ТекСтрока.Сотрудник);
СтарДанные = РегистрыСведений.РаботникиОрганизаций.ПолучитьПоследнее(Источник.Дата, Отбор);
//находим группу в АД
ЗапросПуть = Новый Запрос;
ЗапросПуть.УстановитьПараметр("Организация", Источник.Организация);
ЗапросПуть.УстановитьПараметр("Подразделение", СтарДанные.ПодразделениеОрганизации);
ЗАпросПуть.Текст =
"ВЫБРАТЬ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.ГруппаАД
|ИЗ
| Справочник.грсСооветствиеПодразделенийИГрупппВАД.ГруппыАД КАК грсСооветствиеПодразделенийИГрупппВАДГруппыАД
|ГДЕ
| грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.Организация = &Организация
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Подразделение = &Подразделение
| И грсСооветствиеПодразделенийИГрупппВАДГруппыАД.Ссылка.ПометкаУдаления = ЛОЖЬ";
ВыборкаПуть = ЗапросПуть.Выполнить().Выгрузить();
ДЛя Каждого ТекПуть из ВыборкаПуть Цикл
ПутьАД = СтрЗаменить(ТекПуть.ГруппаАД,"/","");
КонецЦикла;
//находим пользователя АД
ЗапросАД = Новый Запрос;
ЗапросАД.УстановитьПараметр("ФизЛицо", ТекСтрока.Сотрудник.ФизЛицо);
ЗапросАД.Текст =
"ВЫБРАТЬ
| грсСписокПользователейАД.ДатаСоздания,
| грсСписокПользователейАД.ПользовательАД,
| грсСписокПользователейАД.ПочтаАД,
| грсСписокПользователейАД.ФизЛицо
|ИЗ
| РегистрСведений.грсСписокПользователейАД КАК грсСписокПользователейАД
|ГДЕ
| грсСписокПользователейАД.ФизЛицо = &ФизЛицо";
ВыборкаАД = ЗапросАД.Выполнить().Выбрать();
ВыборкаАД.Следующий();
Если ВыборкаАД.Количество() > 0 Тогда
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");
objContainer = ПолучитьCOMОбъект("LDAP://"+ПутьАД+",DC=domen,DC=ru");
strCN = СтрокаФио;
element_user = objContainer.GetObject("User", "CN=" +strCN);
Если ТекСтрока.ДатаУвольнения = ТекущаяДата() Тогда
element_user.userAccountControl = 2;
element_user.SetInfo();
//Лочим пользователя если увольнение в день создания документа
element_group = ПолучитьCOMОбъект("LDAP://OU=user,OU=Dead,DC=domen,DC=ru");
element_group.MoveHere("LDAP://CN=" +strCN+","+ПутьАД+",DC=domen,DC=ru", "CN=" +strCN);
element_group.SetInfo();
Иначе
//лочим пользователя если увольнение создано заранее
ДатаАД = Формат((НачалоДня(ТекСтрока.ДатаУвольнения+86400) - НАчалоДня(Дата("16010101"))), "ЧГ=0");
element_user.accountExpires = Формат(ДатаАД*10000000, "ЧГ=0");
element_user.SetInfo();
КонецЕсли;
КонецЕСли;
КонецЕсли;
Исключение;
КонецПопытки;
КонецЦикла;
КонецЕсли;
Потом сисадмины создали группу в AD которая может создавать/редактировать пользователей AD, включили в нее кадровиков. 2 дня заполнения данных по справочникам созданми изначально и передача в продакшин. Для передачи паролей пользователю, кадровикам сделал ВПФ которая берет данные созданно пользователя из РС, и кадровики отдают в руки с инструкциями пользоватлю.
Всем спасибо за внимание! Всем добра)