Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

290 / Вывод различий при сравнении таблиц и табличных документов #452

Merged
merged 3 commits into from
Dec 3, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@

#Область КонструкторыОписанийОшибки

Функция ДанныеОшибки(Ошибка, Знач Сообщение, ТипОшибки)
Функция ДеталиОшибки()

#Если Сервер Тогда
Детали = КонтекстДеталиОшибки(Истина);
Expand All @@ -486,8 +486,19 @@
Если ЗначениеЗаполнено(Детали) Тогда
ЮТКонтекстСлужебный.УстановитьЗначениеКонтекста(ИмяКонтекстаДеталиОшибки(), Неопределено);

Детали.Добавить(Сообщение);
Сообщение = СтрСоединить(Детали, Символы.ПС);
Возврат СтрСоединить(Детали, Символы.ПС);
Иначе
Возврат Неопределено;
КонецЕсли;

КонецФункции

Функция ДанныеОшибки(Ошибка, Знач Сообщение, ТипОшибки)

ДеталиОшибки = ДеталиОшибки();

Если ДеталиОшибки <> Неопределено Тогда
Сообщение = ДеталиОшибки + Символы.ПС + Сообщение;
КонецЕсли;

ДанныеОшибки = ЮТФабрикаСлужебный.ОписаниеОшибкиПропуска(ТипОшибки + ": " + Сообщение);
Expand All @@ -508,6 +519,11 @@

Описание = ИзвлечьТекстОшибки(Ошибка, ПрефиксОшибкиУтверждений());

ДеталиОшибки = ДеталиОшибки();
Если ДеталиОшибки <> Неопределено Тогда
Описание = Описание + Символы.ПС + ДеталиОшибки;
КонецЕсли;

ДанныеОшибки = ЮТФабрикаСлужебный.ОписаниеОшибкиСравнения(Описание);
ДанныеОшибки.Стек = СтекОшибки(Ошибка);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,17 @@
// Возвращаемое значение:
// Строка - Представление значения
Функция ПредставлениеЗначения(Значение) Экспорт

ЗначениеСтрокой = Строка(Значение);
ТипЗначения = ТипЗнч(Значение);

Если ПустаяСтрока(ЗначениеСтрокой) Тогда
Тип = Строка(ТипЗначения);
Возврат СтрШаблон("`<Пустое значение, Тип: %1>`", Тип);
Иначе
Возврат СтрШаблон("`%1`", ЗначениеСтрокой);
КонецЕсли;

КонецФункции

// Производит замену в переданном шаблоне параметра на переданное значение.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@

#Область СлужебныйПрограммныйИнтерфейс

Функция ТаблицыРавны(Знач Данные1, Знач Данные2) Экспорт
Функция ТабличныеДокументыРавны(Знач ПроверяемыйТабличныйДокумент, Знач ОжидаемыйТабличныйДокумент, Знач ПараметрыСравнения) Экспорт

Возврат ЮТСравнениеСлужебныйСервер.ТаблицыРавны(Данные1, Данные2);
Возврат ЮТСравнениеСлужебныйСервер.ТабличныеДокументыРавны(ПроверяемыйТабличныйДокумент, ОжидаемыйТабличныйДокумент, ПараметрыСравнения);

КонецФункции

Функция ТабличныеДокументыРавны(Знач ТабличныйДокумент1, Знач ТабличныйДокумент2) Экспорт
Функция РазличияТабличныхДокументов(Знач ПроверяемыйТабличныйДокумент, Знач ОжидаемыйТабличныйДокумент, Знач ПараметрыСравнения) Экспорт

Возврат ЮТСравнениеСлужебныйСервер.ТабличныеДокументыРавны(ТабличныйДокумент1, ТабличныйДокумент2);
Возврат ЮТСравнениеСлужебныйСервер.РазличияТабличныхДокументов(ПроверяемыйТабличныйДокумент, ОжидаемыйТабличныйДокумент, ПараметрыСравнения);

КонецФункции

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,37 +53,34 @@

Если ЮТТипыДанныхСлужебный.ЭтоСтруктура(ТипЗначения) Тогда

Результат = СтруктурыРавны(Данные1, Данные2);
Результат = СтруктурыРавны(Данные1, Данные2, ПараметрыСравнения);

ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоСоответствие(ТипЗначения) Тогда

Результат = СоответствияРавны(Данные1, Данные2);
Результат = СоответствияРавны(Данные1, Данные2, ПараметрыСравнения);

ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоМассив(ТипЗначения) Тогда

Результат = МассивыРавны(Данные1, Данные2);
Результат = МассивыРавны(Данные1, Данные2, ПараметрыСравнения);

ИначеЕсли ТипЗначения = Тип("ТабличныйДокумент") Тогда

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Результат = ЮТСравнениеСлужебныйСервер.ТабличныеДокументыРавны(Данные1, Данные2);
#Иначе
Результат = ЮТСравнениеСлужебныйВызовСервера.ТабличныеДокументыРавны(Данные1, Данные2);
#КонецЕсли
Результат = ТабличныеДокументыРавны(Данные1, Данные2, ПараметрыСравнения);

ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоПримитивныйТип(ТипЗначения) ИЛИ ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗначения) Тогда
// Возвращаем ложь, так как для этих типов должно сработать обычное равенство
Результат = Ложь;

КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off

#Если Сервер Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Если ТипЗначения = Тип("ТаблицаЗначений") Тогда

Результат = ЮТСравнениеСлужебныйСервер.ТаблицыРавны(Данные1, Данные2);
Результат = ТаблицыРавны(Данные1, Данные2, ПараметрыСравнения);

ИначеЕсли ТипЗначения = Тип("ХранилищеЗначения") Тогда

Результат = ЗначенияРавны(Данные1.Получить(), Данные2.Получить());
Результат = ЗначенияРавны(Данные1.Получить(), Данные2.Получить(), ПараметрыСравнения);

КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off
#КонецЕсли
Expand Down Expand Up @@ -158,7 +155,7 @@

#Область Сравнения

Функция СтруктурыРавны(Данные1, Данные2)
Функция СтруктурыРавны(Данные1, Данные2, ПараметрыСравнения)

Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
Expand All @@ -168,7 +165,7 @@
СтароеЗначение = Неопределено;

Если НЕ Данные2.Свойство(КлючИЗначение.Ключ, СтароеЗначение)
ИЛИ НЕ ЗначенияРавны(КлючИЗначение.Значение, СтароеЗначение) Тогда
ИЛИ НЕ ЗначенияРавны(КлючИЗначение.Значение, СтароеЗначение, ПараметрыСравнения) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Expand All @@ -177,7 +174,7 @@

КонецФункции

Функция СоответствияРавны(Данные1, Данные2)
Функция СоответствияРавны(Данные1, Данные2, ПараметрыСравнения)

Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
Expand All @@ -189,7 +186,7 @@
КлючиНовогоСоответствия.Вставить(КлючИЗначение.Ключ, Истина);
СтароеЗначение = Данные2.Получить(КлючИЗначение.Ключ);

Если НЕ ЗначенияРавны(КлючИЗначение.Значение, СтароеЗначение) Тогда
Если НЕ ЗначенияРавны(КлючИЗначение.Значение, СтароеЗначение, ПараметрыСравнения) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Expand All @@ -204,14 +201,14 @@

КонецФункции

Функция МассивыРавны(Данные1, Данные2)
Функция МассивыРавны(Данные1, Данные2, ПараметрыСравнения)

Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;

Для Индекс = 0 По Данные1.ВГраница() Цикл
Если НЕ ЗначенияРавны(Данные1[Индекс], Данные2[Индекс]) Тогда
Если НЕ ЗначенияРавны(Данные1[Индекс], Данные2[Индекс], ПараметрыСравнения) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Expand Down Expand Up @@ -612,7 +609,7 @@
ФактическаяДлина = ДлинаЗначения(ПроверяемоеЗначение);

Если ФактическаяДлина = Неопределено Тогда
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не может быть проверен на длинну значения", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибокСлужебный.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки, ПараметрыПроверки);
Возврат;
КонецЕсли;
Expand All @@ -632,7 +629,7 @@
Результат = НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение);

Если Результат = Неопределено Тогда
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не может быть проверен на содержание ожидаемого значения", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибокСлужебный.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки, ПараметрыПроверки);
КонецЕсли;

Expand All @@ -652,7 +649,7 @@
СоответствуетШаблону = СоответствуетШаблону(ПроверяемоеЗначение, ОжидаемоеЗначение);

Если СоответствуетШаблону = Неопределено Тогда
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не может быть проверен на соответствие шаблону", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибокСлужебный.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки, ПараметрыПроверки);
КонецЕсли;

Expand Down Expand Up @@ -720,4 +717,52 @@

#КонецОбласти

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Функция ТаблицыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения)

Утверждение = ПараметрыСравнения = Неопределено ИЛИ НЕ ЮТКоллекции.ЗначениеСтруктуры(ПараметрыСравнения, "Утверждение", Ложь);
Если Утверждение Тогда
Возврат ЮТСравнениеСлужебныйСервер.ТаблицыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
КонецЕсли;

Различия = ЮТСравнениеСлужебныйСервер.РазличияТаблиц(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);

ЗафиксироватьРазличия(Различия);
Возврат НЕ ЗначениеЗаполнено(Различия);

КонецФункции
#КонецЕсли

Функция ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения)

Утверждение = ПараметрыСравнения = Неопределено ИЛИ НЕ ЮТКоллекции.ЗначениеСтруктуры(ПараметрыСравнения, "Утверждение", Ложь);

Если НЕ Утверждение Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Возврат ЮТСравнениеСлужебныйСервер.ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#Иначе
//@skip-check bsl-legacy-check-expression-type
Возврат ЮТСравнениеСлужебныйВызовСервера.ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#КонецЕсли
КонецЕсли;

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Различия = ЮТСравнениеСлужебныйСервер.РазличияТабличныхДокументов(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#Иначе
//@skip-check bsl-legacy-check-expression-type
Различия = ЮТСравнениеСлужебныйВызовСервера.РазличияТабличныхДокументов(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#КонецЕсли

ЗафиксироватьРазличия(Различия);
Возврат НЕ ЗначениеЗаполнено(Различия);

КонецФункции
Comment on lines +736 to +759
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется добавить проверку типов.

Отсутствует проверка, что входные параметры являются табличными документами.

Предлагаю добавить проверку типов:

 Функция ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения)
+  // Проверка типов параметров
+  Если ТипЗнч(ПроверяемоеЗначение) <> Тип("ТабличныйДокумент") 
+    ИЛИ ТипЗнч(ОжидаемоеЗначение) <> Тип("ТабличныйДокумент") Тогда
+    ВызватьИсключение "Параметры должны быть табличными документами";
+  КонецЕсли;
+  
   Утверждение = ПараметрыСравнения = Неопределено ИЛИ НЕ ЮТКоллекции.ЗначениеСтруктуры(ПараметрыСравнения, "Утверждение", Ложь);
   // ... остальной код ...
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Функция ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения)
Утверждение = ПараметрыСравнения = Неопределено ИЛИ НЕ ЮТКоллекции.ЗначениеСтруктуры(ПараметрыСравнения, "Утверждение", Ложь);
Если НЕ Утверждение Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Возврат ЮТСравнениеСлужебныйСервер.ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#Иначе
//@skip-check bsl-legacy-check-expression-type
Возврат ЮТСравнениеСлужебныйВызовСервера.ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#КонецЕсли
КонецЕсли;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Различия = ЮТСравнениеСлужебныйСервер.РазличияТабличныхДокументов(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#Иначе
//@skip-check bsl-legacy-check-expression-type
Различия = ЮТСравнениеСлужебныйВызовСервера.РазличияТабличныхДокументов(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#КонецЕсли
ЗафиксироватьРазличия(Различия);
Возврат НЕ ЗначениеЗаполнено(Различия);
КонецФункции
Функция ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения)
// Проверка типов параметров
Если ТипЗнч(ПроверяемоеЗначение) <> Тип("ТабличныйДокумент")
ИЛИ ТипЗнч(ОжидаемоеЗначение) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "Параметры должны быть табличными документами";
КонецЕсли;
Утверждение = ПараметрыСравнения = Неопределено ИЛИ НЕ ЮТКоллекции.ЗначениеСтруктуры(ПараметрыСравнения, "Утверждение", Ложь);
Если НЕ Утверждение Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Возврат ЮТСравнениеСлужебныйСервер.ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#Иначе
//@skip-check bsl-legacy-check-expression-type
Возврат ЮТСравнениеСлужебныйВызовСервера.ТабличныеДокументыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#КонецЕсли
КонецЕсли;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Различия = ЮТСравнениеСлужебныйСервер.РазличияТабличныхДокументов(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#Иначе
//@skip-check bsl-legacy-check-expression-type
Различия = ЮТСравнениеСлужебныйВызовСервера.РазличияТабличныхДокументов(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
#КонецЕсли
ЗафиксироватьРазличия(Различия);
Возврат НЕ ЗначениеЗаполнено(Различия);
КонецФункции


Процедура ЗафиксироватьРазличия(Различия)

Для Каждого Различие Из Различия Цикл
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки(Различие);
КонецЦикла;

КонецПроцедуры
#КонецОбласти
Loading
Loading