вторник, 26 мая 2015 г.

Интеграция корпортала Битрикс24 (коробка) с AD. О подводных камнях и о том, как я их обходила.

С детства я очень везучий человек - это передо мной не открываются автоматические двери, это я всегда вытягиваю число 13 при любой жеребьевке и это я сажусь на единственный сломанный стул из множества. Поэтому, когда я внедряю какой-либо программный продукт, обстоятельства обязательно складываются так, что всплывают, если не все его "баги" и "фичи", то добрые 90%. Я уже привыкла к этому - и это делает мою жизнь похожей на фильм.

Мое сказочное везение не подвело меня и на моем недавнем внедрении коробки Битрикс24. Внедряла в  строительной компании средней величины. Пользователей AD (Active Directory) около 400 человек, и 105 из них являются так же пользователями корпортала, остальным корпортал для работы не нужен.

Как известно, корпортал коробка лицензируется по количеству активных пользователей, поэтому импортировать в портал лишних пользователей было нельзя. Это обстоятельство в корпортативном портале Битрикс24, слава богу, предусмотрено - в настройках AD/LDAP интеграции можно исключить определенные группы пользователей AD из импорта. Исключили, пользователи синхронизировались отлично, однако структура компании построилась не правильно:



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

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

Оказалось, что с тесками - известный баг, а у меня - первый такой реальный случай в истории. (Хотя это странно. Полные тески на руководящих должностях - далеко не редкость, особенно, когда они - отец и сын. Когда я работала в одном из подразделений РЖД, у нас там чуть ли не у каждого крупного начальника был сын, названный в честь отца, работающий начальником помельче. Мы обычно называли их между собой "старший" и "младший", но ведь в документах так писать не будешь, поэтому программное обеспечение должно предусматривать такие случаи).

С тесками мы расправились, добавив пробел к имени одного из них на стороне AD.

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

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

Скопировала скрипт /bitrix/modules/main/admin/user_import.php, переименовала его в user_customimport.php, в скрипте /bitrix/admin/user_import.php подключила свой скрипт вместо стандартного. глубоко переписывать алгоритм не стала - просто вставила после импорта всех пользователей удаление пустых департаментов:

$arUsersDeps=array();
$rsDepUsers = CUser::GetList(); 

while ($arDepUser = $rsDepUsers->Fetch()) 
{
$arUsersDeps[]=$arDepUser['WORK_DEPARTMENT'];    
}

$arDepFilter = Array('IBLOCK_ID'=>$ib_id);
$db_Deplist = CIBlockSection::GetList(Array($by=>$order), $arDepFilter, true);
 
$id_section_fd=array();
while($arDepSection = $db_Deplist->Fetch())
{
if (!in_array($arDepSection['NAME'],$arUsersDeps) && $arDepSection['ID']!=773){ 
$id_section_fd[]=$arDepSection['ID']; 
}

}
 
foreach($id_section_fd as $dep_id){ 

$DB->StartTransaction();
if(!CIBlockSection::Delete($dep_id))
{
$strWarning .= 'Error.';
$DB->Rollback();
}
else
$DB->Commit();
}

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

Тогда в своем скрипте импорта пользователей я завела класс-наследник

class CLDAPCustom extends CLDAP
     {...}

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

В итоге структура департаментов из AD все же импортировалась в том виде, как должна была быть.



На самом деле получилось все равно не так, как было задумано. В компании есть департаменты, в которых нет начальника, а все сотрудники - равноправны и подчиняются напрямую сотруднику другого отдела. Система же в таких случаях "назначает" департаменту случайного руководителя. С этим решили смириться, техподдержка Битрикс пообещала учесть это как пожелание при будущих обновлениях продукта.



5 комментариев:

Артем Иванов комментирует...

Здравствуйте! Столкнулись с определенными трудностями при интеграции битрикса с AD, он почему-то импортирует только юзеров из корня и втягивает 1 департамент. Структура департаментов, указанная в AD не строится.. (пользователь AD имеет право на чтение всех веток AD) В чем может быть проблема? Я не шибко большой специалист в AD, запросил у админов данные, которые указаны в инструкции битрикса.. не взлетело (

Федор комментирует...

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

Здравствуйте, ваша статья от 26 мая 2015г. Сейчас уже сентябрь 2017 воз и ныне там.

Обещания компании Битрикс просто деморализуют.

Юлия комментирует...

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

Анонимный комментирует...

Юлия, 1) "ждать у моря погоды", 2) допиливать бесплатно или за бабки? 3) уже июнь 2019, проблема все там же, чертовы комерсы с неработающим дерьмом.

Юлия комментирует...

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