function AddMessage($ticketID, $arFields, &$arrFILES, $checkRights = "Y")
 {
     if (strlen($arFields["MESSAGE"]) > 0 || is_array($arFields["FILES"]) && count($arFields["FILES"]) > 0) {
         $err_mess = CTicket::err_mess() . "<br>Function: AddMessage<br>Line: ";
         global $DB, $USER;
         $bAdmin = "N";
         $bSupportTeam = "N";
         $bSupportClient = "N";
         if ($checkRights == "Y") {
             $bAdmin = CTicket::IsAdmin() ? "Y" : "N";
             $bSupportTeam = CTicket::IsSupportTeam() ? "Y" : "N";
             $bSupportClient = CTicket::IsSupportClient() ? "Y" : "N";
             $uid = intval($USER->GetID());
         } else {
             $bAdmin = "Y";
             $bSupportTeam = "Y";
             $bSupportClient = "Y";
             //if (is_object($USER)) $uid = intval($USER->GetID()); else $uid = -1;
             $uid = 0;
         }
         if ($bAdmin != "Y" && $bSupportTeam != "Y" && $bSupportClient != "Y") {
             return false;
         }
         $ticketID = intval($ticketID);
         if ($ticketID <= 0) {
             return 0;
         }
         $strSql = "SELECT RESPONSIBLE_USER_ID, LAST_MESSAGE_USER_ID, REOPEN, SITE_ID, TITLE FROM b_ticket WHERE ID='{$ticketID}'";
         $rsTicket = $DB->Query($strSql, false, $err_mess . __LINE__);
         $arTicket = $rsTicket->Fetch();
         $currentResponsibleUserID = $arTicket["RESPONSIBLE_USER_ID"];
         $siteID = $arTicket["SITE_ID"];
         $tTitle = $arTicket["TITLE"];
         $strSql = "SELECT max(C_NUMBER) MAX_NUMBER FROM b_ticket_message WHERE TICKET_ID='{$ticketID}'";
         $z = $DB->Query($strSql, false, $err_mess . __LINE__);
         $zr = $z->Fetch();
         $maxNumber = intval($zr['MAX_NUMBER']);
         if ((strlen(trim($arFields["MESSAGE_AUTHOR_SID"])) > 0 || intval($arFields["MESSAGE_AUTHOR_USER_ID"]) > 0 || intval($arFields["MESSAGE_CREATED_USER_ID"]) > 0) && ($bSupportTeam == "Y" || $bAdmin == "Y")) {
             $ownerUserID = intval($arFields["MESSAGE_AUTHOR_USER_ID"]);
             $ownerSid = "'" . $DB->ForSql($arFields["MESSAGE_AUTHOR_SID"], 2000) . "'";
             $ownerGuestID = intval($arFields["MESSAGE_AUTHOR_GUEST_ID"]) > 0 ? intval($arFields["MESSAGE_AUTHOR_GUEST_ID"]) : "null";
             $createdUserID = intval($arFields["MESSAGE_CREATED_USER_ID"]) > 0 ? intval($arFields["MESSAGE_CREATED_USER_ID"]) : intval($uid);
             $createdGuestID = intval($arFields["MESSAGE_CREATED_GUEST_ID"]) > 0 ? intval($arFields["MESSAGE_CREATED_GUEST_ID"]) : intval($_SESSION["SESS_GUEST_ID"]);
         } else {
             $ownerUserID = intval($uid);
             $ownerSid = "null";
             $ownerGuestID = intval($_SESSION["SESS_GUEST_ID"]);
             $createdUserID = intval($uid);
             $createdGuestID = intval($_SESSION["SESS_GUEST_ID"]);
         }
         if (intval($ownerGuestID) <= 0) {
             $ownerGuestID = "null";
         }
         $MessageBySupportTeam = "null";
         if ($ownerUserID <= 0) {
             $ownerUserID = "null";
         } else {
             $MessageBySupportTeam = "'N'";
             if (CTicket::IsSupportTeam($ownerUserID) || CTicket::IsAdmin($ownerUserID)) {
                 $MessageBySupportTeam = "'Y'";
             }
         }
         if ($createdUserID <= 0) {
             $createdUserID = "null";
         }
         if (intval($createdGuestID) <= 0) {
             $createdGuestID = "null";
         }
         $createdModuleName = strlen($arFields["MESSAGE_CREATED_MODULE_NAME"]) > 0 ? "'" . $DB->ForSql($arFields["MESSAGE_CREATED_MODULE_NAME"], 255) . "'" : "'support'";
         $externalID = intval($arFields["EXTERNAL_ID"]) > 0 ? intval($arFields["EXTERNAL_ID"]) : "null";
         $externalField1 = $arFields["EXTERNAL_FIELD_1"];
         if (is_set($arFields, "HIDDEN")) {
             $hidden = $arFields["HIDDEN"] == "Y" ? "Y" : "N";
         } elseif (is_set($arFields, "IS_HIDDEN")) {
             $hidden = $arFields["IS_HIDDEN"] == "Y" ? "Y" : "N";
         }
         $hidden = $hidden == "Y" ? "Y" : "N";
         $notChangeStatus = is_set($arFields, "NOT_CHANGE_STATUS") && $arFields["NOT_CHANGE_STATUS"] == "Y" ? "Y" : "N";
         $changeLastMessageDate = true;
         if ($arTicket["LAST_MESSAGE_USER_ID"] == $uid && $arTicket["REOPEN"] != "Y") {
             $changeLastMessageDate = false;
         }
         $TASK_TIME = intval($arFields["TASK_TIME"]) > 0 ? intval($arFields["TASK_TIME"]) : "null";
         if (is_set($arFields, "LOG")) {
             $log = $arFields["LOG"] == "Y" ? "Y" : "N";
         } elseif (is_set($arFields, "IS_LOG")) {
             $log = $arFields["IS_LOG"] == "Y" ? "Y" : "N";
         }
         $log = $log == "Y" ? "Y" : "N";
         if (is_set($arFields, "OVERDUE")) {
             $overdue = $arFields["OVERDUE"] == "Y" ? "Y" : "N";
         } elseif (is_set($arFields, "IS_OVERDUE")) {
             $overdue = $arFields["IS_OVERDUE"] == "Y" ? "Y" : "N";
         }
         $overdue = $overdue == "Y" ? "Y" : "N";
         $arFieldsI = array("TIMESTAMP_X" => $DB->GetNowFunction(), "DAY_CREATE" => $DB->CurrentDateFunction(), "C_NUMBER" => $maxNumber + 1, "TICKET_ID" => $ticketID, "IS_HIDDEN" => "'" . $hidden . "'", "IS_LOG" => "'" . $log . "'", "IS_OVERDUE" => "'" . $overdue . "'", "MESSAGE" => "'" . $DB->ForSql($arFields["MESSAGE"]) . "'", "MESSAGE_SEARCH" => "'" . $DB->ForSql(ToUpper($arFields["MESSAGE"])) . "'", "EXTERNAL_ID" => $externalID, "EXTERNAL_FIELD_1" => strlen($externalField1) > 0 ? "'" . $DB->ForSql($externalField1) . "'" : "null", "OWNER_USER_ID" => $ownerUserID, "OWNER_GUEST_ID" => $ownerGuestID, "OWNER_SID" => $ownerSid, "SOURCE_ID" => intval($arFields["MESSAGE_SOURCE_ID"]), "CREATED_USER_ID" => $createdUserID, "CREATED_GUEST_ID" => $createdGuestID, "CREATED_MODULE_NAME" => $createdModuleName, "MODIFIED_USER_ID" => $createdUserID, "MODIFIED_GUEST_ID" => $createdGuestID, "MESSAGE_BY_SUPPORT_TEAM" => $MessageBySupportTeam, "TASK_TIME" => $TASK_TIME, "NOT_CHANGE_STATUS" => "'" . $notChangeStatus . "'");
         CTimeZone::Disable();
         $arFieldsI["DATE_CREATE"] = $DB->CharToDateFunction(GetTime(time(), "FULL"));
         CTimeZone::Enable();
         if ($hidden != "Y" && $log != "Y" && $changeLastMessageDate == false) {
             if ($MessageBySupportTeam == "'Y'" || $maxNumber <= 0 && array_key_exists('SOURCE_SID', $arFields) && $arFields['SOURCE_SID'] === 'email') {
                 $arFieldsI["NOT_CHANGE_STATUS"] = "'N'";
             } else {
                 $arFieldsI["NOT_CHANGE_STATUS"] = "'Y'";
             }
         }
         if (intval($currentResponsibleUserID) > 0) {
             $arFieldsI["CURRENT_RESPONSIBLE_USER_ID"] = $currentResponsibleUserID;
         }
         $mid = $DB->Insert("b_ticket_message", $arFieldsI, $err_mess . __LINE__);
         if (intval($mid) > 0) {
             $not_image_extension_suffix = COption::GetOptionString("support", "NOT_IMAGE_EXTENSION_SUFFIX");
             $not_image_upload_dir = COption::GetOptionString("support", "NOT_IMAGE_UPLOAD_DIR");
             $max_size = COption::GetOptionString("support", "SUPPORT_MAX_FILESIZE");
             // сохраняем приаттаченные файлы
             $arFILES = $arFields["FILES"];
             if (is_array($arFILES) && count($arFILES) > 0) {
                 while (list($key, $arFILE) = each($arFILES)) {
                     if (strlen($arFILE["name"]) > 0) {
                         if ($bSupportTeam != "Y" && $bAdmin != "Y") {
                             $max_file_size = intval($max_size) * 1024;
                         }
                         $fes = "";
                         $upload_dir = "support";
                         if (!CFile::IsImage($arFILE["name"], $arFILE["type"])) {
                             $fes = $not_image_extension_suffix;
                             $arFILE["name"] .= $fes;
                             $upload_dir = $not_image_upload_dir;
                         }
                         if (!array_key_exists("MODULE_ID", $arFILE) || strlen($arFILE["MODULE_ID"]) <= 0) {
                             $arFILE["MODULE_ID"] = "support";
                         }
                         $fid = intval(CFile::SaveFile($arFILE, $upload_dir, $max_file_size));
                         if ($fid > 0) {
                             $md5 = md5(uniqid(mt_rand(), true) . time());
                             $arFILE["HASH"] = $md5;
                             $arFILE["FILE_ID"] = $fid;
                             $arFILE["MESSAGE_ID"] = $mid;
                             $arFILE["TICKET_ID"] = $ticketID;
                             $arFILE["EXTENSION_SUFFIX"] = $fes;
                             $arFields_fi = array("HASH" => "'" . $DB->ForSql($md5, 255) . "'", "MESSAGE_ID" => $mid, "FILE_ID" => $fid, "TICKET_ID" => $ticketID, "EXTENSION_SUFFIX" => strlen($fes) > 0 ? "'" . $DB->ForSql($fes, 255) . "'" : "null");
                             $link_id = $DB->Insert("b_ticket_message_2_file", $arFields_fi, $err_mess . __LINE__);
                             if (intval($link_id) > 0) {
                                 $arFILE["LINK_ID"] = $link_id;
                                 $arrFILES[] = $arFILE;
                             }
                         }
                     }
                 }
             }
             // если это не было скрытым сообщением или сообщение лога, то
             if ($notChangeStatus != "Y" && $hidden != "Y" && $log != "Y") {
                 // обновим ряд параметров обращения
                 if (!isset($arFields["AUTO_CLOSE_DAYS"])) {
                     $RESET_AUTO_CLOSE = "Y";
                 }
                 CTicket::UpdateLastParams($ticketID, $RESET_AUTO_CLOSE, $changeLastMessageDate, true);
                 // при необходимости создадим или удалим агенты-напоминальщики
                 //CTicketReminder::Update($ticketID);
             }
             if ($log != "Y") {
                 CSupportSearch::writeWordsInTable($mid, $siteID, $tTitle . " " . $arFields["MESSAGE"]);
             }
             //если была установлена галочка "не изменять статус обращени" - пересчитаем количество собщений
             if ($notChangeStatus == "Y" || $hidden == "Y") {
                 CTicket::UpdateMessages($ticketID);
             }
         }
     }
     return $mid;
 }