При блокировке учетной записи уволенного сотрудника, в AD так же прописывается дата увольнения в поле Описание(Description) в виде: Уволен(а): 17 июня 2011 г.
Настраивать обработку очень просто — в процедуре ПриОткрытии() в Конфигураторе необходимо отредактировать строку поиска в LDAP в соответствии с именем своего домена и юнита в котором расположены учетки пользователей.
Процедура ПриОткрытии()
// Загрузка списка значений
СписВыб = Новый СписокЗначений;
// Здесь необходимо подставить своё значение в пределах которого будет производиться поиск:
// где dc=MYDOMAIN и dc=RU — имя Вашего домена вида MYDOMAIN.RU
// Main Office, Branch #1, Branch #2 — OU (организационные единицы) в Вашем AD
СписВыб.Добавить(«LDAP://OU=Main Office,dc=MYDOMAIN,dc=RU»);
СписВыб.Добавить(«LDAP://OU=Branch #1,dc=MYDOMAIN,dc=RU»);
СписВыб.Добавить(«LDAP://OU=Branch #2,dc=MYDOMAIN,dc=RU»);
ЭлементыФормы.ПолеВыбора.СписокВыбора = СписВыб;
// Установим текущим первое значение
ЭлементыФормы.ПолеВыбора.Значение = ЭлементыФормы.ПолеВыбора.СписокВыбора.Получить(0).Значение;
//сообщить(ЭлементыФормы.ПолеВыбора.Значение)
КонецПроцедуры
Запуск производится через Файл/Открыть
Очень удобно, хотелось бы опробовать на практике, но к сожалению количество StartMoney не позволяет.
В развитие обработки, хотелось бы обратную процедуру, то есть при приеме сотрудника создавать учетные записи.
(1) nanik,
<quote>хотелось бы обратную процедуру, то есть при приеме сотрудника создавать учетные записи</quote>Я тоже задумывался над этим, да и реализовать данную процедуру в общем-то совсем нетрудно.
Но решил не тратить время, по той причине, что, к примеру в моей организации, вначале регистрируется учетка вновь прибывшего пользователя в AD, он успешно начинает под ней работать, и по прошествии n-го количества дней, отдел кадров заводит сотрудника в 1С…
Каким образом выполняется поиск пользователя в AD?
(3) echo77,
Выборка производится по пути указанному в поле «Объект LDAP:» из юнита AD который указан в данной строке с условием WHERE objectCategory=’user’ для отбора только пользовательских учеток. Далее происходит объединение выборки полученной из AD с помощью INNER JOIN с таблицей уволенных полученной из 1С по полю DisplayName(Выводимое имя) учетной записи пользователя в AD, соответственно, указанное поле должно содержать полное ФИО сотрудника равное ФИО сотрудника в 1С.
(4) Ясно. Если сотрудник меняет фамилию, то получается что связь теряется?
(5) echo77,
Верно, но факт того, что сотрудник изменил фамилию и сразу же после этого уволился, случай из ряда вон. Опять таки, при изменении сотрудником фамилии, мы неизбежно отразим сей факт и в AD, в учетной запись изменим имя, логин, эти изменения все равно придется сделать, а после внесения изменений в AD связь вновь восстановится.
(5) echo77,
Специально смоделировал данную ситуацию: в 1С в физ.лицах сделал «Смена ФИО», в соответствии с новыми данными внес изменения в AD в учетку пользователя (поле: «Выводимое имя») — все прекрасно работает.
Можно конечно при старте обработки делать выборку из РС — ФИОФизЛиц, и сообщать о том, что изменилось ФИО с предложением привести AD в соответствие, но опять таки данная обработка носит больше инвентаризационный характер и выполняется по факту увольнения сотрудника, а к этому моменту предполагается, что соответствующие изменения свершились ранее и AD приведен в соответствие с 1С.
(7) Понятно. На какой должности вы работаете? Сколько у вас пользователей домена? Кто администрирует домен?
Не могли бы вы написать инструкцию об «интеграции» справочника сотрудники в AD в виде публикации?
(8) echo77,
Дальнейшая переписка в личке.
(0)- Я бы писал без использования vbs/js.
— Список доступных доменов лучше заполнять реально доступными доменами, а не строками для примера
— Не дает вписывать произвольную строку в поле ввода Объект LDAP
— Нет возможности сохранять настройки
— Справка к обработке будет не лишней. Ибо запускать данную штуку в AD не зная что делает кнопка «Применить«, а что кнопка «Выполнить» страшно
— Каков смысл динамического(программно) создания колонок табличного поля на форме?
(10) echo77,
(11) Было бы неплохо, чтобы в списке выбора объектов LDAP присутствовал бы доступных доменов той сети, в которой запущена данная программа.
— Непонятно почему так сложно получается список уволенных сотрудников, и на кой черт должность при увольнении если она не используется?(Я бы просто отбирал уволенных по значению поля «ДатаУвольнения» в справочнике сотрудники)
— Было бы неплохо, если бы при опущенном параметре ДатаНачала/ДатаОкончания выбирались бы все записи без ограничения
(12) echo77,
> Было бы неплохо, чтобы в списке выбора объектов LDAP присутствовал бы доступных доменов
Не совсем понятно как это нагляднее реализовать, можно к примеру получать список OU по всему домену, можно так же предварительно выбирать доверенные домены если таковые имеются проверять их на доступность и так же строить по ним список OU, но представьте какое количество будет иметь список, если к примеру администратор заводит под каждый департамент отдельный юнит, вообщем рассмотрю Ваши предложения.
> и на кой черт должность при увольнении если она не используется
Это так сказать рудимент, первоначально планировалось добавлять эту информацию в поле «Описание» вместе с фразой «Уволен(а)…», но позже отказался из соображений наглядности в AD. В следующей версии вычищу из запроса, хотя на производительность особо не влияет.
> при опущенном параметре ДатаНачала/ДатаОкончания выбирались бы все записи без ограничения
В текущей версии можно указывать только дату окончания равную текущей. Будут отобраны все по текущий момент.
Наконец-то смог скачать и проверить обработку в работе.
К сожалению результат выглядит вот так: {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
🙁
(14) nanik,
0x80005000 («указанный атрибут службы каталогов или значение не существует»). Т.е. неверно была набрана строка в поле ввода Объект LDAP. Проверьте корректность заполнения данной строки.
Данная ошибка свидетельствует о том, что
Увидеть/узнать LDAP имя домена можно скопировав нижеприведенный код в файл с расширением .vbs и запустив его на выполнение
(15) наименование домена указано верно, думаю проблема в OU. Но наименование скопировал с AD, так что опечаток не может быть. В чем еще может быть проблема?
(16) nanik,
Сделаем так, запустите нижеуказанный скрипт он пробегает по всему AD показывая наименование организационных единиц и путь к ним, проверьте соответствует ли полученная скриптом строка CN той которую вы писали в обработке:
Показать
(16) nanik,
Так же обратите внимание на то, что строка LDAP должна начинаться с LDAP:// а так же быть указана без пробелов между запятыми, имена OU пишутся как есть т.е. без кавычек или апострофов.
(18) спасибо большое.
Если указываю OU первого уровня, то выходит указанная ошибка.
СписВыб.Добавить(«LDAP://OU=Пользователи,dc=XXXXX,dc=RU»);
{Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
Если же OU второго уровня, то обработка отрабатывает на ура
СписВыб.Добавить(«LDAP://OU=ЖКХ,OU=Пользователи,dc=XXXXX,dc=RU»);
До этого тестировал именно с OU первого уровня.
Как поправить?
(19) nanik,
Скорей всего связано с тем, что в Вашем контейнере OU=Пользователи кроме учетных записей пользователей имеются так же объекты — Контакт, если это так, необходимо подправить select в функции ПолучитьСписокПользователейAD(). А именно найти строку «»WHERE objectCategory=’user'»» и заменить ее на «»WHERE objectClass=’user’ AND objectCategory=’person'»»
(20) условия выборки подправил, но это не исправило ситуацию. Что заметил, по тем OU, в которых нет пустых, работает обработка. Если же хоть есть хоть один вложенный пустой OU, то возникает ошибка: {Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
Думаю тут надо поставить заглушку, если OU не содержит элементы.
(21) nanik,
Даже не предполагал что могут быть пустые контейнеры…
Ну да ладно, вот что нужно сделать:
1. найти строку objRecordSet.MoveFirst перед ней добавить if objRecordSet.RecordCount <> 0 then
2. найти Loop после него добавить end if
Искать все в той же функции: ПолучитьСписокПользователейAD()
В коде будет выглядеть следующим образом:
(22) контейнеры потому что структура построена на основании штатного расписания. Администратор просто её продублировал. Есть такие структурные единицы, в которых люди не работают за компьютером, поэтому они и пустые.
(23) nanik,
Про контейнеры понятно…
Сообщите пожалуйста, все ли корректно отрабатывает после внесенных изменений о которых говорилось выше?
(22) исправления внес, теперь пустые подразделения отрабатываются. Но ошибка так и осталась: {Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
Стал разбираться почему же так происходит, оказалось все банально, проблема с наименования подразделений:
СписВыб.Добавить(«LDAP://OU=Отдел организации труда и з/п,OU=УСМ,OU=Пользователи,dc=XXXXX,dc=RU»);
Соответственно здесь выходит такая ошибка:
{Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (Active Directory): Был передан недопустимый путь службы каталогов
Можно ли это как-то обойти или проще всего переименовать подобные подразделения без специальных символов?
(25) nanik,
Можно указать: СписВыб.Добавить(«LDAP://OU=Отдел организации труда и з/п,OU=УСМ,OU=Пользователи,dc=XXXXX,dc=RU»); — будет работать.
Подскажите, как я понимаю Вы каждую OU добавляете в список, возможно правильнее будет добавить единственную запись СписВыб.Добавить(«LDAP://dc=XXXXX,dc=RU»); чтобы выборка из AD происходила по всем имеющимся UO, или есть какой-то глубинный смысл?
(24) начал теперь тестировать обработку на некоторых крупных подразделениях.
1 — С сотрудником часто заключают трудовой договор на определенный период. По истечению которого его увольняют и если сотрудник согласен продолжать работу, то его опять оформляют на работу. Или сотрудник поработав в одном филиале, увольняется переводом в другой филиал. То есть таких сотрудников надо исключить из обработки или организовать предупреждение.
2 — Сравнение идет по наименованию из справочника сотрудники. Например, сотрудник был устроен по внешнему совместительству или договору подряда, и в наименовании его для удобства добавлен префикс соответствующий. Такие сотрудники автоматически будут исключены из обработки.
3 — Для удобства хотелось бы дополнительный поиск по фамилии, имени и инициалу. Например, в поле Выводимое имя в замен ФИО написали по ошибке ИОФ. Или хотя бы список уволенных, которых не нашли в AD.
(26) добавляю каждое подразделение, так как с вариантом LDAP://dc=XXXXX,dc=RU получаю только ошибку
{Форма.Форма.Форма(105)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x80005000)
Что бы вычислить причину перебираю каждое подразделение.
Глубина просмотра для меня не имеет значение.
(26) еще в наименованиях подразделений используются кавычки, они тоже вызывают ошибку.
(29) nanik,
С кавычками тоже вопрос решаемый, но опять придется вносить изменения в функцию: ПолучитьСписокПользователейAD()
меняем строку:
на
Пример строки: СписВыб.Добавить(«LDAP://ou=Тестовое «»подразделение»»,dc=XXXXX,dc=RU»); — т.е если подразделение называется к примеру Тестовое «подразделение» для корректной работы необходимо заключить фразу «подразделение» в двойные кавычки.
(30) функцию ПолучитьСписокПользователейAD() исправил. Нашел в AD все подразделения, в наименовании которого присутствовал символ «/» и переименовал.
Частенько приказы на увольнение изготавливают заранее, то есть дата приказа 12.05.12, а дата увольнения, например, 25.05.12. Возможно ли таким пользователям в AD устанавливать срок действия учетной записи?
(31) nanik,
Установить значение в поле «Срок действия учетной записи» юзерской учетки в AD не сложно, но нужно понять как у Вас происходит ввод документа на увольнение в 1С или приказа, т.е. понять какую дату ставить в это поле и от куда ее брать?
(32) в табличной части документа проставляется реальная дата увольнения человека. То есть в AD надо установить срок действия учетной записи равной дате увольнения +1 день. Про +1 день: день увольнения считается рабочим днем.
(33) nanik,
Ясно, осталось понять по какому принципу устанавливать дату запрета учетной записи, либо блокировать учетку.
(34) Если текущая дата больше даты увольнения, то учетную запись отключаем. Если текущая дата меньше или равна текущей даты, то установить срок действия учетной записи.
(34) под текущей датой можно понимать дату выполнения или создать на форме реквизит с типом дата и на него ориентироваться.
(35) nanik,
Я к тому, что Вы собираетесь обработку запускать ежедневно? А если от случая к случаю, то она будет носить больше инвентаризационный характер и есть ли тогда смысл устанавливать срок истечения учетки? Проще будет ее просто заблокировать.
(37)
Про ежедневный запуск тоже вариант, но тогда надо исправить условия выборки. Так как сейчас если дата приказа например дата увольнения 27.05.12, то в выборку с 27.05.12 по 27.05.12 уволенный человек не попадет, как и на 28.05.12, только если ставить интервал с 27.05.12 по 28.05.12.
Добрый день. А вы занимались доработкой этого решения
Интересует, возможно ли его доработать таким образом, чтобы отображались в окне принятия решения не только уволенные, но и принятые (создание УЗ в АД). и переведённые по основному месту работы (обновление данных в АД) и пр. Т.е. полноценный функционал обмена данных о сотруднике из 1С в АД, но через форму согласования как у Вас на скрине.
Добрый день, вопросы принимаете по обработке?