Skip to content

Conversation

@Stivo182
Copy link

@Stivo182 Stivo182 commented Sep 6, 2025

No description provided.

@coderabbitai
Copy link

coderabbitai bot commented Sep 6, 2025

Walkthrough

Добавлена поддержка типа ТаблицаЗначений в сериализаторе и десериализаторе: новые ветки диспетчеризации, преобразование таблиц в/из 2D массива с первой строкой заголовков. В сериализаторе добавлена экспортная функция. Тесты расширены для вложенных и корневых случаев.

Changes

Cohort / File(s) Summary
Deserialization: ТаблицаЗначений
src/Классы/ДесериализаторJson.os
Добавлена ветка для Тип("ТаблицаЗначений") в диспетчере. Реализована приватная ПреобразоватьТаблицуЗначений: создание колонок по первой строке массива, заполнение строк с рекурсивной десериализацией ячеек.
Serialization: ТаблицаЗначений
src/Классы/СериализаторJson.os
Добавлена поддержка сериализации ТаблицаЗначений: новая ветка в ПреобразоватьОбъектСериализации и экспортная Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений). Формирование массива: заголовки из Колонки.Имя, затем строки с рекурсивной сериализацией ячеек.
Tests: десериализация
tests/Десериализация.os
Тесты десериализации таблиц: вложенная таблица в объекте и корневая таблица. Проверка типов, длин, доступа по имени/индексу, смешанных типов значений и вложенных структур.
Tests: тестовый класс
tests/Классы/ТестовыйКласс.os
Добавлена экспортная сериализуемая переменная Таблица типа ТаблицаЗначений с атрибутами &Сериализуемое и &Тип("ТаблицаЗначений").
Tests: сериализация
tests/Сериализация.os
Расширены проверки сериализации класса с полем Таблица и добавлен экспортный тест СериализацияКорневойТаблицыЗначений для корневого сценария.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Тест
  participant Клиент as СериализаторJson
  participant Типы as ПреобразоватьОбъектСериализации
  participant Функц as ПреобразоватьТаблицуЗначений

  Тест->>Клиент: Сериализовать(ТаблицаЗначений)
  Клиент->>Типы: ПреобразоватьОбъектСериализации(ТаблицаЗначений)
  alt Тип == ТаблицаЗначений
    Типы->>Функц: ПреобразоватьТаблицуЗначений(Таблица)
    note right of Функц: Сбор заголовков и строк<br/>рекурсивная сериализация ячеек
    Функц-->>Типы: Массив [заголовки, ...строки]
  end
  Типы-->>Клиент: Массив
  Клиент-->>Тест: JSON массива
Loading
sequenceDiagram
  autonumber
  actor Тест
  participant Клиент as ДесериализаторJson
  participant Типы as ПреобразоватьОбъектДесериализации
  participant Функц as ПреобразоватьТаблицуЗначений

  Тест->>Клиент: Десериализовать(JSON массива, Тип(ТаблицаЗначений)|влож.)
  Клиент->>Типы: ПреобразоватьОбъектДесериализации(Массив, Тип ТаблицаЗначений)
  alt Тип == ТаблицаЗначений
    Типы->>Функц: ПреобразоватьТаблицуЗначений(Массив, Тип)
    note right of Функц: Первая строка — заголовки<br/>создать колонки, заполнить строки
    Функц-->>Типы: ТаблицаЗначений
  end
  Типы-->>Клиент: ТаблицаЗначений
  Клиент-->>Тест: ТаблицаЗначений
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

Прыг-скок по строкам — я за главами слежу,
Шапку в первый ряд, затем ячейки разложу.
Табличный хрум-хрум — массивчиком лечу,
В JSON морковку, обратно — в кручёную кашу.
Уши навострил: всё сходится — пишу! 🥕🐇

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
src/Классы/СериализаторJson.os (1)

96-117: Микро-оптимизация: кэшировать коллекцию колонок.

Ссылаться на ТаблицаЗначений.Колонки один раз и переиспользовать переменную чуть уменьшит накладные расходы в двойном цикле.

 Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений) Экспорт
 	
 	Результат = Новый Массив();
 
-	ИменаКолонок = Новый Массив();
-	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
+	Колонки = ТаблицаЗначений.Колонки;
+	ИменаКолонок = Новый Массив();
+	Для Каждого Колонка Из Колонки Цикл
 		ИменаКолонок.Добавить(Колонка.Имя);
 	КонецЦикла;
 	Результат.Добавить(ИменаКолонок);
 
-	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
+	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
 		ЗначенияКолонок = Новый Массив();
-		Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
+		Для Каждого Колонка Из Колонки Цикл
 			ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]);
 			ЗначенияКолонок.Добавить(ПреобразованноеЗначение);
 		КонецЦикла;
 		Результат.Добавить(ЗначенияКолонок);
 	КонецЦикла;
tests/Классы/ТестовыйКласс.os (1)

49-50: Опционально: инициализировать Таблица в конструкторе.

Это упростит сценарии, где поле читается до присвоения в тестах.

 Процедура ПриСозданииОбъекта()
+	Если Таблица = Неопределено Тогда
+		Таблица = Новый ТаблицаЗначений();
+	КонецЕсли;
 КонецПроцедуры
tests/Десериализация.os (1)

388-412: Корневой кейс ТаблицаЗначений — ок.

Кейс с вложенной структурой закрывает смешанные типы. Можно добавить негативные тесты: пустой массив, заголовок не массив, дубли колонок.

Могу накидать сценарии/фикстуры для этих случаев по желанию.

tests/Сериализация.os (1)

281-315: Корневая сериализация ТаблицаЗначений — ок; можно усилить round‑trip.

Дополнительно можно десериализовать полученный JSON обратно в Тип("ТаблицаЗначений") и сверить содержимое.

Готов добавить вспомогательный ассерт для обратного преобразования.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fdf6ee3 and 95999e6.

📒 Files selected for processing (5)
  • src/Классы/ДесериализаторJson.os (2 hunks)
  • src/Классы/СериализаторJson.os (2 hunks)
  • tests/Десериализация.os (3 hunks)
  • tests/Классы/ТестовыйКласс.os (1 hunks)
  • tests/Сериализация.os (3 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
{src/**/*.os,tests/**/*.os}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

{src/**/*.os,tests/**/*.os}: All source code, comments, and identifiers must be in Russian language
Follow OneScript naming conventions: CamelCase (using Russian characters) for identifiers
Ensure all .os files are UTF-8 encoded with BOM

Files:

  • tests/Классы/ТестовыйКласс.os
  • tests/Десериализация.os
  • src/Классы/ДесериализаторJson.os
  • tests/Сериализация.os
  • src/Классы/СериализаторJson.os
{src/Классы/**/*.os,tests/Классы/**/*.os}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Use OneScript annotations &Сериализуемое and &Несериализуемое to control serialization in classes

Files:

  • tests/Классы/ТестовыйКласс.os
  • src/Классы/ДесериализаторJson.os
  • src/Классы/СериализаторJson.os
🧠 Learnings (1)
📚 Learning: 2025-08-21T05:54:45.305Z
Learnt from: CR
PR: nixel2007/jason#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-21T05:54:45.305Z
Learning: Applies to {src/Классы/**/*.os,tests/Классы/**/*.os} : Use OneScript annotations &Сериализуемое and &Несериализуемое to control serialization in classes

Applied to files:

  • tests/Классы/ТестовыйКласс.os
  • tests/Десериализация.os
  • tests/Сериализация.os
🔇 Additional comments (8)
src/Классы/ДесериализаторJson.os (1)

71-72: Ветка для ТаблицаЗначений в диспетчере — хорошо.

Маршрутизация на специализированный конвертер выглядит корректно и согласована с сериализатором.

src/Классы/СериализаторJson.os (2)

58-59: Поддержка ТаблицаЗначений в сериализаторе — ок.

Ветка интеграции аккуратно вписана в существующий диспетчер.


1-22: Удостовериться, что все .os файлы (включая изменённые) имеют кодировку UTF-8 с BOM. Проверьте вручную или добавьте соответствующую проверку в CI.

tests/Классы/ТестовыйКласс.os (1)

41-44: Поле Таблица с аннотациями — корректно.

&Сериализуемое + &Тип("ТаблицаЗначений") согласованы с логикой сериализатора/десериализатора.

tests/Десериализация.os (2)

20-24: Добавление среза JSON для Таблица — ок.

Входной формат (заголовок + строки) соответствует новой десериализации.


49-55: Проверки содержимого Таблица — ок.

Дот‑нотация по именам колонок и тип булево покрыты.

tests/Сериализация.os (2)

37-46: Подготовка Таблица в тестовом классе — ок.

Имена колонок и строки соответствуют ожидаемому JSON‑представлению.


92-99: Проверки сериализованной Таблица как массива — ок.

Размер и порядок заголовков/строк валидируются корректно.

Comment on lines +106 to +144
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Добавить проверку типа входных данных и усилить валидацию заголовка.

Сейчас вызов Количество() у Объект без проверки приведёт к ошибке при несоответствии типа (не массив). Также при не‑массиве в первой строке функция молча возвращает пустую таблицу — стоит логировать. Дополнительно имеет смысл обезопаситься от нестроковых и дублирующих имён колонок (иначе возможны исключения платформы).

Предлагаемый патч:

 Функция ПреобразоватьТаблицуЗначений(Объект, ТипОбъекта)
-		
-	Результат = Новый ТаблицаЗначений;
-	КоличествоЭлементов = Объект.Количество();
+		
+	Результат = Новый ТаблицаЗначений;
+	Если ТипЗнч(Объект) <> Тип("Массив") Тогда
+		Лог.Предупреждение("Ожидался массив для десериализации ТаблицыЗначений, получено: %1", ТипЗнч(Объект));
+		Возврат Результат;
+	КонецЕсли;
+	КоличествоЭлементов = Объект.Количество();
@@
-	ИменаКолонок = Объект[0];
-	Если Не ТипЗнч(ИменаКолонок) = Тип("Массив") Тогда
-		Возврат Результат;
-	КонецЕсли;
+	ИменаКолонок = Объект[0];
+	Если ТипЗнч(ИменаКолонок) <> Тип("Массив") Тогда
+		Лог.Предупреждение("Первая строка JSON-представления ТаблицыЗначений должна быть массивом заголовков.");
+		Возврат Результат;
+	КонецЕсли;
@@
-	Для Каждого ИмяКолонки Из ИменаКолонок Цикл
-		Результат.Колонки.Добавить(ИмяКолонки);
-	КонецЦикла;
+	УникальныеИмена = Новый МножествоСоответствие;
+	Для Каждого ИмяКолонки Из ИменаКолонок Цикл
+		Если ТипЗнч(ИмяКолонки) <> Тип("Строка") Тогда
+			ИмяКолонки = Строка(ИмяКолонки);
+		КонецЕсли;
+		Если УникальныеИмена.Содержит(ИмяКолонки) Тогда
+			Лог.Предупреждение("Дублирующее имя колонки '%1' пропущено.", ИмяКолонки);
+			Продолжить;
+		КонецЕсли;
+		УникальныеИмена.Добавить(ИмяКолонки);
+		Результат.Колонки.Добавить(ИмяКолонки);
+	КонецЦикла;

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
В файле src/Классы/ДесериализаторJson.os около строк 106–144: текущая функция
сразу вызывает Объект.Количество() и предполагает, что первая строка — массив
имён колонок; это ломается при неверном типе входа и позволяет нестроковые или
дублирующиеся имена колонок. Исправьте так: сначала проверить ТипЗнч(Объект) =
Тип("Массив") и только после этого вызывать Количество(), при несоответствии
логировать и вернуть пустую ТаблицаЗначений; затем проверить, что ИменаКолонок —
массив, иначе лог и возврат; при обработке имени колонки обеспечить, что
элементы массива имён приводятся к строке или пропускаются, и обеспечить
уникальность имён (отслеживать уже добавленные и при коллизии добавлять суффикс
или пропускать) прежде чем вызывать Результат.Колонки.Добавить; таким образом
предотвращаются исключения и улучшается валидация заголовка.

@coveralls
Copy link

Coverage Status

coverage: 89.252% (-1.1%) from 90.361%
when pulling 95999e6 on Stivo182:feat/value-table-serialization
into fdf6ee3 on nixel2007:master.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants