diff --git a/db/migrations/stored/R__views.sql b/db/migrations/stored/R__views.sql
index 4f61e746042c3eea62c648d806feb3a607f99e1a..1d5dac748d51e9e5b13469c566285df60a98010a 100644
--- a/db/migrations/stored/R__views.sql
+++ b/db/migrations/stored/R__views.sql
@@ -183,12 +183,12 @@ CREATE OR REPLACE VIEW `view_roadmap` AS
 
 
 CREATE OR REPLACE VIEW `view_final_report` AS
-    SELECT
-        semesters.Year           AS 'SemesterYear',
-        semesters.Num            AS 'SemesterNum',
-        study_plans.ExternalID   AS 'PlanExternalID',
-        subjects.ExternalID      AS 'SubjectExternalID',
-        record_books.ExternalID  AS 'RecordBookExternalID',
+    SELECT DISTINCT
+        semesters.Year          AS 'SemesterYear',
+        semesters.Num           AS 'SemesterNum',
+        study_plans.ExternalID  AS 'PlanExternalID',
+        subjects.ExternalID     AS 'SubjectExternalID',
+        record_books.ExternalID AS 'RecordBookExternalID',
         (
             SELECT SUM(rating_table.Rate)
             FROM rating_table
diff --git a/~dev_rating/application/classes/Controller/Api/V0/FinalReport.php b/~dev_rating/application/classes/Controller/Api/V0/FinalReport.php
index 0a6626e6f0134a3345708550587976000da3616b..3ee329c1d31b47d49f3b3123df9808a0d1410c89 100644
--- a/~dev_rating/application/classes/Controller/Api/V0/FinalReport.php
+++ b/~dev_rating/application/classes/Controller/Api/V0/FinalReport.php
@@ -1,17 +1,7 @@
 <?php
 
 class Controller_Api_V0_FinalReport extends Controller_Handler_Api {
-    public static function array_group_by($array, $key) {
-        $grouped = [];
-        foreach ($array as $value) {
-            $grouped[$value->{$key}][] = $value;
-        }
-
-        return $grouped;
-    }
-
     public function action_get_index() {
-        $finalReport = [];
 
         try {
             // Получаем год и номер семестра из query запроса
@@ -21,38 +11,21 @@ class Controller_Api_V0_FinalReport extends Controller_Handler_Api {
             // Получаем ведомость из БД
             $finalReport = Model_FinalReport::getBySemesterYearNum($year, $num);
 
-            // Группируем ведомость по планам
-            $finalReport = Controller_Api_V0_FinalReport::array_group_by($finalReport, 'PlanExternalID');
-
-            // Группируем ведомость по предметам
-            foreach ($finalReport as $planExternalID => $row) {
-                $finalReport[$planExternalID] = Controller_Api_V0_FinalReport::array_group_by($row, 'SubjectExternalID');
-            }
-
-            // Группируем ведомость по студентам (у каждого студента одна строчка с оценками, при помощи группировки делаем словарь)
-            foreach ($finalReport as $planExternalID => $disciplines) {
-                foreach ($disciplines as $subjectExternalID => $row) {
-                    $finalReport[$planExternalID][$subjectExternalID] = Controller_Api_V0_FinalReport::array_group_by($row, 'StudentExternalID');
-                }
+            $response = [];
+            /** @var Model_FinalReportItem $row */
+            foreach ($finalReport as $row) {
+                $response[$row->PlanExternalID][$row->SubjectExternalID][$row->RecordBookExternalID] = [
+                    'semester'  => $row->SemesterRate,
+                    'exam'      => [$row->ExamRate, $row->Exam2Rate, $row->Exam3Rate],
+                    'extra'     => [$row->ExtraRate, $row->Extra2Rate],
+                ];
             }
 
-            // Перебираем все строки каждого студента и сохраняем результаты в задокументированном формате
-            foreach ($finalReport as $planExternalID => $disciplines) {
-                foreach ($disciplines as $subjectExternalID => $students) {
-                    /** @var Model_FinalReportItem $row */
-                    foreach ($students as $recordBookExternalID => $row) {
-                        $finalReport[$planExternalID][$subjectExternalID][$recordBookExternalID] = [
-                            'semester'  => $row->SemesterRate,
-                            'exam'      => [$row->ExamRate, $row->Exam2Rate, $row->Exam3Rate],
-                            'extra'     => [$row->ExtraRate, $row->Extra2Rate],
-                        ];
-                    }
-                }
-            }
+            return $response;
         } catch (Exception $e) {
             $this->badRequestError($e->getMessage());
         }
 
-        return $finalReport;
+        return null;
     }
 }
diff --git a/~dev_rating/application/classes/Model/FinalReportItem.php b/~dev_rating/application/classes/Model/FinalReportItem.php
index 0ec16fc3136f28099f6ba2ad7a866583e8ca67ec..8dcbbb896027595ca0f501c25de70ca7b0e2f86e 100644
--- a/~dev_rating/application/classes/Model/FinalReportItem.php
+++ b/~dev_rating/application/classes/Model/FinalReportItem.php
@@ -5,6 +5,7 @@
  *
  * @property int SemesterYear
  * @property int SemesterNum
+ * @property string PlanExternalID
  * @property string SubjectExternalID
  * @property string RecordBookExternalID
  * @property int SemesterRate
@@ -17,8 +18,16 @@
 class Model_FinalReportItem extends Model
 {
     public function __construct($row) {
-        foreach ($row as $key => $value) {
-            $this->{$key} = $value;
-        }
+        $this->SemesterYear = isset($row['SemesterYear']) ? (int)$row['SemesterYear'] : null;
+        $this->SemesterNum = isset($row['SemesterNum']) ? (int)$row['SemesterNum'] : null;
+        $this->PlanExternalID = str_pad($row['PlanExternalID'], 9, '0', STR_PAD_LEFT);
+        $this->SubjectExternalID = $row['SubjectExternalID'];
+        $this->RecordBookExternalID = $row['RecordBookExternalID'];
+        $this->SemesterRate = isset($row['SemesterRate']) ? (int)$row['SemesterRate'] : null;
+        $this->ExamRate = isset($row['ExamRate']) ? (int)$row['ExamRate'] : null;
+        $this->Exam2Rate = isset($row['Exam2Rate']) ? (int)$row['Exam2Rate'] : null;
+        $this->Exam3Rate = isset($row['Exam3Rate']) ? (int)$row['Exam3Rate'] : null;
+        $this->ExtraRate = isset($row['ExtraRate']) ? (int)$row['ExtraRate'] : null;
+        $this->Extra2Rate = isset($row['Extra2Rate']) ? (int)$row['Extra2Rate'] : null;
     }
 }