Как помочь сисадмину при большой текучке кадров



Хотелось бы поделиться своим опытом создания пользователей AD из 1С:ЗУП 2.5.

Доброго времени суток всем читающим! Работаю в компании, где сотрудников более 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
ЗапуститьПриложение("\fileCommonСекретариИнструкции ИТПодключение к удаленному рабочему столу Linux.doc");
ЗапуститьПриложение("\fileCommonСекретариИнструкции ИТПодключение к удаленному рабочему столу 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: "+РС.ПочтаАД;
ТабДок.Вывести(ОбластьМакета);
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Показать();

ЗапуститьПриложение("\fileCommonСекретариИнструкции ИТПодключение к удаленному рабочему столу Linux.doc");
ЗапуститьПриложение("\fileCommonСекретариИнструкции ИТПодключение к удаленному рабочему столу 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 дня заполнения данных по справочникам созданми изначально и передача в продакшин. Для передачи паролей пользователю, кадровикам сделал ВПФ которая берет данные созданно пользователя из РС, и кадровики отдают в руки с инструкциями пользоватлю. 

Всем спасибо за внимание! Всем добра)

31 Comments

  1. oldfornit

    кстати, если у вас AD выше чем 2008- можно воспользоваться soap-интерфейсом для взаимодействия с ним.

    Reply
  2. PhoenixAOD

    (1)ну 2012 серваки стоят, с soap я сталкивался только когда писал выгрузку из 1с 7.7 в Кристалл 10))) и то плюнули на все эти пляски с бубнами и просто xml в папку обмена запилили))

    Reply
  3. citicat

    При большой текучке (об этом статья и написана) надо руководствоваться законом о защите персональных данных.

    Данные вводить и нести за них ответстенность работники кадровой службы, а никак не сисадмин. Ссылка на закон здесь

    http://www.consultant.ru/document/cons_doc_LAW_213151/

    «Персональные данные: особая информация

    Персональные данные работников – это любая информация, необходимая работодателю в связи с трудовыми отношениями и касающаяся конкретного сотрудника (п. 1 ст. 3 Федерального закона от 27 июля 2006 № 152-ФЗ «О персональных данных»).

    У работодателя (организации или ИП) персональные данные работников, чаще всего, обобщаются в их личных карточках и личных делах. При этом почти каждый менеджер отела кадров или HR-специалист знает, что персональные данные допускается получать только лично от работников. Если персональные сведения возможно получить только от третьих лиц, то российское законодательство обязывает уведомить об этом работника и получить от него письменное согласие (пункт 3 части 1 статьи 86 Трудового кодекса РФ).

    Работодатели не вправе получать и обрабатывать персональные данные, которые не относятся напрямую к трудовой деятельности человека. То есть, собирать сведения, допустим, о вероисповедании сотрудников – нельзя. Ведь такая информация представляет из себя личную или семейную тайну и никак не может быть связана с выполнением трудовых обязанностей (пункт 4 части 1 статьи 86 Трудового кодекса РФ).

    Получив персональные данные, работодатель в силу требований законодательства обязан их не распространять и не раскрывать третьим лицам без согласия работника (ст. 7 Федерального закона от 27 июля 2006 № 152-ФЗ).»

    Обработка персональных данных работодателем, по общему правилу, возможна только с письменного согласия работников. Такое согласие должно включать в себя следующую информацию (части 4 статьи 9 Закона от 27 июля 2006 г. № 152-ФЗ):

    ФИО, адрес сотрудника, реквизиты паспорта (иного документа, удостоверяющего его личность), в том числе сведения о дате выдачи документа и выдавшем его органе;

    Reply
  4. PhoenixAOD

    (3)

    У работодателя (организации или ИП) персональные данные работников, чаще всего, обобщаются в их личных карточках и личных делах. При этом почти каждый менеджер отела кадров или HR-специалист знает, что персональные данные допускается получать только лично от работников. Если персональные сведения возможно получить только от третьих лиц, то российское законодательство обязывает уведомить об этом работника и получить от него письменное согласие (пункт 3 части 1 статьи 86 Трудового кодекса РФ).

    это вообще к чему тут? какие 3 лица?

    Reply
  5. chng

    (3) Вообще ваш камент, для тех кому предназначена эта статья, звучит примерно так:

    Законодатель запретил водителю автомашины, заправлять автомобиль в поле из канистры, без уведомления производителя бензина. А саму заправку должен выполнять специалист заправочной станции, где приобретен бензин, находящийся в канистре.

    🙂 Согласитесь, смешно звучит…

    Дело в том, что вы не разобрались о чем в статье идет речь.

    Автор решал рутинную и очень важную проблему — управления аккаунтами пользователей в корпоративной компьютерной сети (т.е. сети работодателя).

    Более того, предложенное решение, практически идеально разделяет ответственность за обработку ПДн, обобщенно о которой, идет речь в вашем комментарии.

    В реализованном автором механизме, за персональные данные, отвечает именно кадровик (ему положено по штату), а с автоматически созданным в сети, аккаунтом пользователя, уже управляется сетевой администратор — назначает права, раздает полномочия и т.п.

    Другими словами, Вас же не уведомляют каждый раз при расчете заработной платы, что обработали ваши данные из реестра больничных листов, его просто автоматизированно обрабатываю и включают в персонализированный расчет вашего больничного.

    Так и тут, при приеме на работу, если кандидат берется на компьютеризированное рабочее место, то при заполнении кадровиком учетной информации о работнике, автоматика создает аккаунт в корпоративной сети, чтобы работник сев за рабочее место мог начать работать. Также оформив приказ на отпуск, кадровик фактически отключил аккаунт время отпуска т.к. юридически сотрудник в находящийся в отпуске не имеет права трудиться на работе.

    При этом админам сети остается следить только за тем что находится в их компетенции — работой программного механизма, устраняя косяки в его работе и назначать не формализованные назначения привилегий…

    Так что первый выделенный вами абзац, в части «общего правила» попадает под туже строчку в согласии об обработке ПДн что и расчет зарплаты.

    Касательно части 4 статьи 9 152 ФЗ Вы перечислили очень мало данных которые должны быть в включены в согласие на обработку ПДн, особенно в все любят игнорировать п.4 и п.7.

    Reply
  6. PhoenixAOD

    (5)Вот именно, тем более у меня в организации каждый кто устраивается на работу, подписывает соглашение об обработке ПДн, хотя мне кажется уже в любой организации, если она конечно не ООО «Рога и Копыта» такое соглашение уже давно дают на подпись работнику при трудоустройстве.

    Reply
  7. TODD22

    Меня за такой код лет так 5 назад при трудоустройстве отправили учится программировать….

    Reply
  8. chng

    (7) Однако это не связанные процессы. Код работает, вы учитесь.. не просто профит, а профит+профит…

    🙂

    Reply
  9. TODD22

    (8)

    Однако это не связанные процессы.

    Не связанные с чем процессы? И о каких процессах речь?

    Reply
  10. chng

    (9)Обучение красивому написательству и работа пусть и не оптимально написанного кода — собственно об этих процессах и речь.

    Reply
  11. v3rter

    Админа нельзя отделить от персональных данных, админу как минимум нужно ФИО и фото сотрудников. Если так уж хочется отделить админа от зарплатных ведомостей персональных данных, то делайте робота с некоторой регулярной выгрузкой из ЗУП-а, а на стороне админа пусть работает скрипт. И с точки зрения безопасности так лучше — база 1С не будет запускать от имени себя код с привилегиями администратора домена.

    Reply
  12. PhoenixAOD

    (11) Задача стояла не отделить админа от ПДн, а упростить парням работу, что бы не бегали к кадрам за данными, что бы работали больше по своей текучке, а остальное пусть выполнит 1с.

    Reply
  13. v3rter

    (12) Это понятно, и звезду именно за это поставил. Считайте разделение на выгрузку и скрипт одним из вариантов дальнейшего развития системы.

    Reply
  14. TODD22

    (10)Речь не о красивости. А о грубых ошибках. Которые я сделал в тестовом задании.

    Reply
  15. PhoenixAOD

    (14)

    (10)

    Спасибо за поддержку и за критику, но на тот момент когда я это все говнокодил))) у меня вообще не было понятия как это все должно работать, Но так как я исповедую «Работает не лезь», я не стал править ничего, Если честно, я не знаю как можно из запроса вернуть NULL если должность не найдена, и вот в этом была загогулина, а сейчас это все дело предстоит перенести на 3.1, и я буду раз критике и помощи в этом деле, так как в 2.5 это все делается из одного документа, а в 3.1 это разные документы, и ТЧ там совсем другие, я бы выкладывал свои наработки и хотелось бы услышать критику и советы, как бы это сделать было более правильно.

    Reply
  16. PhoenixAOD

    (13)к сожалению скрипты я писать не умею((( но это идея хорошая)) можно попробовать ее в 3.1 запустить)) когда то же надо учиться писать скрипты))

    Reply
  17. chng

    (14) А разве это был пост про Ваши ошибки, зачем было начинать троллить ТС-а?

    В отличии от франчей, на производстве, в большинстве случаев, работу оценивают по принципу выполняет свою функцию или нет.

    (16)Скрипт это худшая по сравнению с кодом в 1С идея, и вот почему:

    Схема со скриптом, порождает еще одну точку администрирования и лишний процесс передачи инфы, от процесса подготовившего информацию (владелец админ 1С) в скрипт который потом по каким-либо причинам накосячит в АД (владелец админ АД).

    Согласование формата передачи, правка и администрирование скрипта, чья будет зона ответственности?

    Второй минус схемы со скриптом, это необходимость разных скриптов для АД и ЛДАП, а в коде 1С это можно учесть сразу или доработать по мере потребности, главное, что будет уверенность в однообразности результата.

    ИМХО, надежней решать эту проблему именно кодом в 1С, тем более что с АД она работает нормально не вообще не помню с какой версии версии платформы…

    Конечно, если по уму, то 1С-овцы должны были отдельный модуль для этого в БСП запилить, тем более что большая часть у них уже реализована, но им как обычно пофиг…

    Reply
  18. TODD22

    (17)

    А разве это был пост про Ваши ошибки, зачем было начинать троллить ТС-а?

    ТС делает такие же грубые ошибки. Вы считаете нормой писать и выкладывать код который содержит грубые ошибки? Его так то другие смотрят… учатся…

    В отличии от франчей, на производстве, в большинстве случаев, работу оценивают по принципу выполняет свою функцию или нет.

    Это был не франч. А крупная торговая компания. Это как раз во франчах оценивают работает или нет. А в крупных компаниях очень часто смотрят на то какой код пишут сотрудники.

    За последний месяц второй раз встречаю код написанный по принципу «выполняет свою функцию». Только он отлично выполняет свою функцию на 10-100 документах. А когда их стало 3000 тогда код выполняющий свою функцию стал выполнятся по 30-40 минут.

    Второй код выполняет свою функцию в сети розничных на рабочем месте кассира. И он отлично работает только до обеда пока количество чеков не превысило 50-70 штук. После этого проведение одного чека занимает 8 минут!

    Но функцию же свою выполняет….

    Reply
  19. chng

    (18)Коллега, я не имел желания вас задеть или обидеть, поэтому если это невольно получилось, прошу прощения.

    Думаю, что таки пост ТС-а о другом, поэтому тему о Вас и вашей работе, лучше оставить, чтобы не развивать никому не нужный тут флэйм.

    Не буду комментировать ваш последний пост, просто скажу, в (15) посте, ТС конкретно попросил помощи, можете помочь, помогите, не можете или не хотите помочь, тогда не стоит развивать тему про одинокого дартаньяна… 🙂

    Reply
  20. TODD22

    (19)Давайте ТС будет за себя сам говорить или вам то же хочется побыть дартаньяном?

    Reply
  21. v3rter

    (16) Или можно разделить конфигурацию на две части: выгрузку и админку. И пусть каждая запускается со своим уровнем прав: выгрузка — с правами отдела персонала на своём сервере, загрузка — у Вас, в Вашей личной админской конфигурации 1С с правами админа домена. Так спокойнее и безопаснее, считаю.

    Reply
  22. chng

    (21) А смысл? Зачем админу АД отдельно осуществлять загрузку если по определению понятно, что как минимум один раз в день он ее обязан делать (большая движуха кадров определяет это требование). Такое разделение приведет к тому, что в какой-то (как обычно самый «важный» момент) админ не сделает ее вовремя и в результате, чьи-то полномочия не применятся — в разборке, крайним останется админ АД.

    Зачем боятся автоматики, если она проверена и правильно отрабатывает? ИМХО не стоит придумывать лишнюю «страховку», которая на самом деле ни от чего не страхует, но обязательно послужит скрытой причиной производственного конфликта.

    Другое дело, сделать оповещение админа (смс или например речевым информатором по IP-телефонии) об изменениях в составе пользователей, а самих пользователей парковать в специально созданном для этого контейнере, для дальнейшей обработки админами.

    Еще можно упорядочить внесение изменений в АД например двумя моментами, скажем до обеда и в конце рабочего дня. Но это уже зависит от конкретной ситуации в боевой системе.

    Reply
  23. PhoenixAOD

    (20)Да я уже сказал за себя, и был бы рад услышал советы и подсказки) Так как сейчас все это дело надо на 3.1 будет перекинуть, и чем все будет правильнее и оптимальнее, да и посмотреть как правильно пишется код я бы с удовольствием) Я сам учился медотом наития кодить, ну и вопросу тут на форуме конечно))

    Reply
  24. PhoenixAOD

    (21)Очень не удачная идея распиливать это на две части)) соглашусь с (22), создание нужно в реальном времени) оформили человека, отдали логин и пароль, дальше принимают или увольняют)) админу некогда этим заниматься, у админа своих проблем хватает)

    Reply
  25. v3rter

    Ну если никого ничем не смущает 1С ЗУП, запущенная с правами админа домена…

    Reply
  26. chng

    (25)Ну если точнее выразиться, то сервер запущенный с полномочиями создания пользователей, не особо смущает, у него и так полномочий системных может быть навешано не мало. А правильная раздача полномочий для системных процессов, ну так в этом суть работы админов…

    Думаю один раз правильно настроить права и полномочия процессу для админов проще, чем каждый день, неизвестное количество раз дергаться на создание или перенос по контейнерам, пользователей домена.

    Но соглашусь с тем, что работу данного механизма надо проектировать, оценивая реальную архитектуру сети и разные риски в том или ином случае.

    Reply
  27. dungeonkeeper

    Это ж насколько должна быть большая «текучка», чтоб заморочиться на такой инструмент.

    Хотя вещь полезная. Посмотрел с любопытством, но возникли некоторые вопросы сразу.

    Вот, например, при увольнении лочится учетка. А ведь по факту человек еще в этот день работает и даже может еще несколько дней проработать.

    Я тоже начал такой инструмент мудрить, но не доделал и бросил.

    Приходит с обходным листом при приеме и увольнении, тут же при них и создаю или помечаю себе, что завтра-послезавтра надо заблокировать.

    Еще не забыть что-то сделать с почтовым ящиком, аккаунтом на сайте, удаленным доступом и т.д.

    По этому замутил свою конфигурацию, где и хочу хранить все нужные данные. Времени нет совсем.

    P.S.

    Проще все это сделать на каком-нить бесплатном движке типа Joomla. Типа HelpDesk, туда же прикрутить заявки от пользователей и еще много всего.

    Чет понесло меня…

    Reply
  28. PhoenixAOD

    (27)текучка достаточная что бы заморочиться этим))) а по сути, день в день увольнение это очень большая редкость, и тут уже админы нужны, а по сути обычно за 2 недели же готовятся документы на увольнение.

    Reply
  29. v3rter

    (28)

    обычно за 2 недели же готовятся документы на увольнение

    Обычно админам сообщают в день увольнения, а то и задним числом )

    Reply
  30. PhoenixAOD

    (29)а теперь не сообщают, зачем админу это знать) у нас админы узнают, что человек увольняется когда приходят с обходым к ним.

    Reply
  31. user752750

    Думаю, в этом случае проще 1IDM приобрести, и перекладывать ни на кого не придется и управление доступом автоматизировано будет (там тебе из ЗУП вся нужная инфа для доступа подгрузится и учетки с правами можно автоматом выдавать, блокировать, и все что угодно)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *