@redesupar

Как записать данные с xml в лог в Битриксе?

Битрикс энтерпрайз. Суть проблемы: после обмена с AD и 1с по пользователям не деактивируются пользователи которые уволились. В AD вроде всё впорядке, есть проверка по полю активность и когда пользователь увольняется его убирают с группы g_portal_access, но все равно тех кого нет не деактивируются. Думаю проблема в 1с, у нас сначала тянутся пользователи с ад, потом некоторые данные идут с 1с.
Незнаю как посмотреть отправленных пользователей с 1с и AD.
1) Есть ли быстрый способ решить эту проблему?
2) Как посмотреть пользователей которые пришли во время обмена с AD?
3) Как записать в лог всех пользователей которые есть в xml с 1с?

Код получения файла и прочего с 1с

$reader = new XMLReader();
$xmlfile = GetXML("users");
if (!$reader->xml($xmlfile)){
    $error_text = date("d.m.Y H:i:s")." - Импорт сотрудников: полученный ответ от веб-сервиса не удалось открыть на чтение, как xml файл";
    hlb_import_log($error_text);
    die($error_text);
}
 $arPositions = array();
//справочник должнсотей. их меньеш чем юзеров так что сначала получим его

CModule::IncludeModule("highloadblock");
$hlblock = Bitrix\Highloadblock\HighloadBlockTable::getById(HLB_POSITIONS_ID)->fetch();
$entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$resPosition = $entity_data_class::getList(array ('order' => array ("ID" => "ASC"), 'filter' => array(), 'select' => array('*')));
while($arPosition = $resPosition->Fetch())  $arPositions[$arPosition["UF_NAME"]] =  $arPosition;
$oUser = new CUser;
while ($reader->read()):
     if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:items'){
         $data = new XMLReader();
         $data->xml($reader->readOuterXML());
         $UserFields = [];
         $AcceptedPosition = [];
         while($data->read()){
             switch ($data->name){
                 case "m:id": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["XML_ID"] = $v;  break; //внешний код
                 case "m:loginAD": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["LOGIN"] =  $data->readInnerXML(); break; //логин
                 case "m:surname_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["LAST_NAME"] =  $data->readInnerXML(); break; //фамилия
                 case "m:name_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["NAME"] =  $data->readInnerXML(); break; //имя
                 case "m:middlename_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["SECOND_NAME"] =  $data->readInnerXML(); break; //отчество
                 case "m:birthDay": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["PERSONAL_BIRTHDAY"] =  ConvertTimeStamp(strtotime($data->readInnerXML()), "SHORT", "ru"); break; //дата рождения
                 case "m:assistant":
                     $v = $data->readInnerXML(); if(strlen($v)>0){
                        $UserFields["UF_ASSISTANT"] =  CUser::GetByLogin($v)->Fetch()["ID"];
                    }
                     break; //асистент
                 case "m:position":
                     $v = $data->readInnerXML(); if(strlen($v)>0 && isset($arPositions[trim($v)]["ID"])){
                        $UserFields["UF_CUSTOM_POSITION"] =  $arPositions[trim($v)]["ID"];
                        $AcceptedPosition[$arPositions[trim($v)]["ID"]] = trim($v);
                     }
                     break; //должность
                 case "m:subdivisioncode":
                     $v = $data->readInnerXML(); if(strlen($v)>0){
                         $res = CIBlockSection::GetList(Array(), array("CODE"=>$v.""), false, array("ID"));
                         if($ar = $res->Fetch()) {
                             $UserFields["UF_DEPARTMENT"] = array($ar["ID"]);
                         }
                      }
                      break;//подразделение
             }

         }
         //обновляем юзера, если он есть
         if(strlen($UserFields["LOGIN"])>0){
             $arUser = CUser::GetByLogin($UserFields["LOGIN"])->Fetch();
            
             $UserFields['UF_EXEC_DO_IMPORT'] = 1;
             $oUser->Update($arUser["ID"], $UserFields);
             CUser::SetUserGroup($arUser['ID'], array_merge(CUser::GetUserGroup($arUser['ID']), [OSK_STAFF_GROUP_ID]));
             //немного дополним массив для дальнейших функций
             $UserFields["ID"]=$arUser["ID"];
             if(isset($UserFields["UF_CUSTOM_POSITION"]))
                 $UserFields["UF_CUSTOM_POSITION_NAME"]=$AcceptedPosition[$UserFields["UF_CUSTOM_POSITION"]];
             //надо проверить, если у юзверя не было привязки к подразделению,
             if(empty($arUser["UF_DEPARTMENT"]) || !$arUser["UF_DEPARTMENT"]){
                 //а теперь есть?
                 if(!empty($UserFields["UF_DEPARTMENT"]) && isset($UserFields["UF_DEPARTMENT"])){
                     // значит надо добавить событие в кадровых изменения - принят на работу
                     SetStatusNew($UserFields);
                 }
             } else {

                 if (is_array($arUser["UF_DEPARTMENT"])
                     && is_array($UserFields["UF_DEPARTMENT"])
                 ) {
                     // если подразделение было раньше другим,
                     if (!array_equal($arUser["UF_DEPARTMENT"], $UserFields["UF_DEPARTMENT"])) {
                         // то добавляем в историю перемещение
                         SetStatusMoved($UserFields, "Перемещение");
                     } else {
                         if ($UserFields["UF_CUSTOM_POSITION"] != $arUser["UF_CUSTOM_POSITION"] && $UserFields["UF_CUSTOM_POSITION"] > 0) {
                             //кроме того может быть и смена должности, пихаю в else т.к. если и то и то то первого будет достаточно
                             SetStatusMoved($UserFields, "Новая должность");
                         }
                    }
                 }
             }
         }
     }
 endwhile;
die("success");
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Есть ли быстрый способ решить эту проблему?


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

Как посмотреть пользователей которые пришли во время обмена с AD?


Таких логов не ведется, но можно подписаться на событие OnLdapUserFields модуля ldap и посмотреть какие приходят данные во время обмена.

Как записать в лог всех пользователей которые есть в xml с 1с?


Если мы говорим про штатный импорт, то файл последнего импорта находится в `/upload/1c_intranet/`
Судя по тому что вы привели код - у вас кастомный импорт и здесь вам нужно обратиться к разработчикам.

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

Синхронизация происходит при трех ключевых условиях:
1. LDAP Query вернул учетку.
2. Изменение учетке в AD (либо в Б24) произошли ПОСЛЕ последней успешной синхронизации.
3. Учетка не должна входить в "неимпортируемые группы"

Соответственно типовые ошибки:
1. Рассинхрон времени (например по какой-то причине время на сервере Б24 бежит впереди времени AD).
2. Шаманство с датами (иногда учетки отключают задним числом)
3. Неправильные условия (ldap query с активностью)
4. После увольнению учетку добавляют в группу, которая в Б24 помечена как несинхронизируемая
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы