$sanction[$i]['data'] = RPU::convDtP($row['data']);
        $sanction[$i]['type'] = $textzamech[$row['id_type']];
    }
    //Взять направление и профиль
    $MsSQL = RPDB::connect();
    $result = $MsSQL->prepare("select np.name np,op.name op from np,op,bup,tup,tup_gr where op.id_np=np.id AND bup.id_op=op.id AND tup.id_bup=bup.id AND tup_gr.id=tup.id AND tup_gr.gr=?");
    if (!$result->execute(array($gr['id']))) {
        throw new Exception('Ошибка при нахождении НП и ОП');
    }
    if (!($studinf = $result->fetch(PDO::FETCH_ASSOC))) {
        throw new Exception('Ошибка при нахождении НП и ОП');
    }
    //============================
    $arResult['dis'] = $dis;
    $arResult['dolg'] = $dolg;
    $arResult['sem'] = RPU::absSemForUP($gr['year'], $set);
    $arResult['napr'] = $studinf['np'];
    $arResult['prof'] = $studinf['op'];
    $arResult['unvis'] = RPU::filterBy($unvis, array('numst' => $numst));
    $arResult['sanction'] = RPU::filterBy($sanction, array('numst' => $numst));
    $arResult['irs_km'] = $irs_km;
    $arResult['error'] = false;
} catch (Exception $e) {
    if ($arParams['JSON']) {
        $arResult['error'] = $e->GetMessage();
    } else {
        RPH::errorPage($e->GetMessage());
    }
}
$template = $arParams['JSON'] ? 'json' : 'template';
$this->IncludeComponentTemplate($template);
    //Если препод - проверяем
    /*берем логин*/
    $teach = RPRole::userID();
    $dis = array($dis);
    $dis = end(RPIrro::upgradePreps($dis, false, true));
    $dis['preps'] = end(RPU::filterBy($dis['preps'][$gr['id']], array('id_tutor' => $teach)));
    if (empty($dis['preps'])) {
        RPH::errorPage('Вы не ведете предмет у этой группы');
    }
}
//Добавить информацию о перезачетах
$dis = RPIrro::upgradeOffset(array($dis), array($gr['id']));
//Берем все КМ для ТУП+Д
$dis = end(RPIrro::getKMS($dis, array($gr['id'])));
if (!$dis['kms'][$gr['id']]) {
    RPH::errorPage('Нет ни одного КМ. <a class="btn btn-info" href="/prepare/tpd/schedule/?tupd=' . $link . '">График КМ</a>');
}
$dis = RPU::e($dis);
//Приведение формата чисел к печатному
//Берем баллы студентов для связи ТУП+Д
$ball = RPU::e(RPIrro::getBalls(array($dis), array($gr['id'])));
//Взять настройки семестра
if (!$iup) {
    $semset = RPU::getAbsSem($gr['year'], $dis['sem']);
} else {
    $STH = $MsSQL->prepare('select * from link_iup_tup_d where id_link_tup_d=? AND id_iup=?');
    if ($STH->execute(array($link, $iup))) {
        if ($row = $STH->fetch()) {
            $semset = array('sem' => $row['sem']);
        }
    }
<?php

if (!RPRole::getPermitOne('journal_edit')) {
    RPH::errorPage("Ошибка доступа");
}
$myPost = json_decode(file_get_contents('php://input'), true);
$numst = RPU::reshape($myPost, 'numst', 'numst');
$id_km = RPU::reshape($myPost, 'id_km', 'id_km');
$MsSQL = RPDB::connect();
//Получаем существующие баллы в БД для измененных КМ и студентов
$result = $MsSQL->prepare('select * from st_ball where id_km IN (' . RPU::plas($id_km) . ') and numst IN (' . RPU::plas($numst) . ')');
if (!$result->execute(array_merge($id_km, $numst))) {
    throw new Exception("Ошибка получения баллов");
}
$balls = $result->fetchAll(PDO::FETCH_ASSOC);
foreach ($myPost as $val) {
    // Убрано после новости о том, что можно удалять балл
    //if($val['ball']==='') continue;
    if ($val['ball'] === 'н') {
        $val['ball'] = -1;
    }
    $b = RPU::filterBy($balls, array('id_km' => $val['id_km'], 'numst' => $val['numst']));
    if (!empty($b)) {
        if ($b['ball'] === $val['ball']) {
            continue;
        }
        $where = $val;
        unset($where['ball']);
        if ($val['ball'] === '') {
            if (!RPDB::delete('st_ball', $where)) {
                throw new Exception("Ошибка удаления бала");