Skip to content

Commit

Permalink
Исправление ошибок, добавление конвертации типа number
Browse files Browse the repository at this point in the history
  • Loading branch information
thvvmas committed Jan 19, 2025
1 parent 088daa1 commit c04b20d
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
//
Функция ВалидироватьОбъекты(Знач МассивОбъектов, Знач Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы) Экспорт

Если МассивОбъектов = Неопределено Тогда
Если МассивОбъектов = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Параметр МассивОбъектов не может быть Неопределено'");
КонецЕсли;

Expand All @@ -36,7 +36,7 @@
МассивОбъектов = ПреобразоватьМассивОбъектов(МассивОбъектов);

Для Каждого ОбъектМассива Из МассивОбъектов Цикл
РезультатВалидации = Валидировать(ОбъектМассива, ИмяСхемы, Спецификация);
РезультатВалидации = Обработки.пбп_ВалидаторПакетов.Валидировать(ОбъектМассива, ИмяСхемы, Спецификация);

Если Не РезультатВалидации.Результат Тогда
ТекстСообщения = "";
Expand Down Expand Up @@ -71,9 +71,17 @@
//
Функция ВалидироватьПримитивныеТипы(Знач ВходящийМассив, Знач Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы) Экспорт

Если ВходящийМассив = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Параметр ВходящийМассив не может быть Неопределено'");
КонецЕсли;

Если Спецификация = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Параметр Спецификация не может быть Неопределено'");
КонецЕсли;

ИдентификаторыОшибокВалидации = Новый Массив;

РезультатВалидации = Валидировать(ВходящийМассив, ИмяСхемы, Спецификация);
РезультатВалидации = Обработки.пбп_ВалидаторПакетов.Валидировать(ВходящийМассив, ИмяСхемы, Спецификация);

ОшибкаВалидации = Ложь;
Если Не РезультатВалидации.Результат Тогда
Expand All @@ -94,22 +102,6 @@

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

// Возвращает список ошибок модели данных.
//
// Параметры:
// МодельДанных - Структура, Соответствие, Массив, Строка, Число - Проверяемый объект.
// ИмяСхемы - Строка - Имя схемы данных из спецификации.
// Спецификация - Строка - Спецификация OpenAPI 3.0 в формате JSON.
//
// Возвращаемое значение:
// Структура - Структура результата валидации. см. Обработки.пбп_ВалидаторПакетов.КонструкторРезультатВалидации
//
Функция Валидировать(Знач МодельДанных, Знач ИмяСхемы, Знач Спецификация) Экспорт // BSLLS:Typo-off
Обработка = Обработки.пбп_ВалидаторПакетов.Создать();
РезультатВалидации = Обработка.Валидировать(МодельДанных, ИмяСхемы, Спецификация);
Возврат РезультатВалидации;
КонецФункции

// Конвертирует передаваемое значение в значение типа JSON
//
// Параметры:
Expand Down Expand Up @@ -185,7 +177,7 @@

Для Каждого КлючИЗначение Из СвойстваОбъекта Цикл
ТипИзСхемы = КлючИЗначение.Значение.Получить("type");
Если ТипИзСхемы = "integer" Тогда
Если ТипИзСхемы = "integer" Или ТипИзСхемы = "number" Тогда
БазовоеЗначение = 0;
ИначеЕсли ТипИзСхемы = "boolean" Тогда
БазовоеЗначение = Ложь;
Expand Down Expand Up @@ -291,6 +283,9 @@
ТипИзСхемы = КлючИЗначение.Значение.Получить("type");
Если ТипИзСхемы = "integer" Тогда
ТипКолонки = КонвертироватьТипЧисло(КлючИЗначение);
ИначеЕсли ТипИзСхемы = "number" Тогда
МаксимальнаяРазрядность = 20;
ТипКолонки = КонвертироватьТипЧисло(КлючИЗначение, МаксимальнаяРазрядность);
ИначеЕсли ТипИзСхемы = "boolean" Тогда
ТипКолонки = Новый ОписаниеТипов("Булево");
ИначеЕсли ТипИзСхемы = "string" Тогда
Expand Down Expand Up @@ -517,13 +512,13 @@

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

Функция КонвертироватьТипЧисло(КлючИЗначение)
Функция КонвертироватьТипЧисло(КлючИЗначение, Разрядность = 0)

Если КлючИЗначение.Значение.Получить("maximum") <> Неопределено Тогда
КоличествоСимволов = СтрДлина(Формат(КлючИЗначение.Значение.Получить("maximum"), "ЧГ="));
ТипКолонки = пбп_Переадресация.ОписаниеТипаЧисло(КоличествоСимволов);
ТипКолонки = пбп_Переадресация.ОписаниеТипаЧисло(КоличествоСимволов, Разрядность);
Иначе
ТипКолонки = пбп_Переадресация.ОписаниеТипаЧисло(10);
ТипКолонки = пбп_Переадресация.ОписаниеТипаЧисло(10, Разрядность);
КонецЕсли;

КонецФункции
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
// Структура - Структура результата валидации. см.КонструкторРезультатВалидации
//
Функция Валидировать(Знач МодельДанных, Знач ИмяСхемы, Знач СпецификацияСтрокой) Экспорт // BSLLS:Typo-off

Спецификация = СпецификацияСтрокой;
РезультатВалидации = КонструкторРезультатВалидации();
СхемыДанныхСпецификации = пбп_ВалидаторПакетовПовтИсп.СхемыДанныхСпецификации(Спецификация);
Expand Down Expand Up @@ -112,7 +113,7 @@

Тип = ПолучитьТипOpenApiПоЗначениюСвойства(Данные.Значение);
КонецЕсли;
Если Тип = "string" Тогда
ВалидироватьСтроку(Данные, ПроверяемаяСхема);
ИначеЕсли Тип = "number" Тогда
Expand Down Expand Up @@ -225,7 +226,7 @@
// Для работы сложных схем, нам понадобятся промежуточные результаты валидации.
// Закэшируем накопленные ошибки, а после выполнения проверок вернем их на место.
КэшОшибок = Новый Массив;
ДополнитьМассив(КэшОшибок, Ошибки);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(КэшОшибок, Ошибки);
Дискриминатор = ПроверяемаяСхема.Получить("discriminator");
Если ЕстьСвойство("oneOf", ПроверяемаяСхема) Тогда
ОбработатьСвойствоOneOf(Данные, ПроверяемаяСхема.Получить("oneOf"), Дискриминатор);
Expand All @@ -238,7 +239,7 @@
ВызватьИсключение "Ошибка при разборе схемы! Не найдено ни одного из свойств oneOf, anyOf, allOf;";
КонецЕсли;

ДополнитьМассив(Ошибки, КэшОшибок);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(Ошибки, КэшОшибок);
КонецПроцедуры

Процедура ОбработатьСвойствоOneOf(Данные, МассивПроверяемыхСхем, Дискриминатор = Неопределено)
Expand All @@ -251,10 +252,10 @@
Продолжить;
КонецЕсли;
ПроверяемаяСхема = РазыменоватьСхему(ТекущаяСхема);
Ошибки = Новый Массив;
Ошибки = Новый Массив;
ВыполнитьВалидациюДанных(Данные, ПроверяемаяСхема);
Если Ошибки.Количество() = 0 Тогда
МассивИндексовСхемПрошедшихВалидацию.Добавить(Индекс);
МассивИндексовСхемПрошедшихВалидацию.Добавить(Индекс);
КонецЕсли;
Если МассивИндексовСхемПрошедшихВалидацию.Количество() > 1 Тогда
// Уже была успешная валидация по схеме, а значит это ошибка oneOf
Expand All @@ -264,15 +265,15 @@
Возврат;
КонецЕсли;

ДополнитьМассив(ПромежуточныйКэшОшибок, Ошибки);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(ПромежуточныйКэшОшибок, Ошибки);
КонецЦикла;

Если МассивИндексовСхемПрошедшихВалидацию.Количество() = 0 Тогда

ТекстОшибки = СтрШаблон("%1 <oneOf> Объект должен соответствовать хотя бы одной схеме;",
ШаблонБазовойОшибки);
Ошибки.Добавить(ТекстОшибки);
ДополнитьМассив(Ошибки, ПромежуточныйКэшОшибок);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(Ошибки, ПромежуточныйКэшОшибок);
Возврат;
КонецЕсли;
// Ровно одна схема прошла валидацию. Очистим массив ошибок, т.к. все ок. :)
Expand All @@ -293,14 +294,14 @@
Если Ошибки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ДополнитьМассив(ПромежуточныйКэшОшибок, Ошибки);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(ПромежуточныйКэшОшибок, Ошибки);
КонецЦикла;

Ошибки = Новый Массив;
ТекстОшибки = СтрШаблон("%1 <anyOf> Объект должен соответствовать хотя бы одной схеме;",
ШаблонБазовойОшибки);
Ошибки.Добавить(ТекстОшибки);
ДополнитьМассив(Ошибки, ПромежуточныйКэшОшибок);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(Ошибки, ПромежуточныйКэшОшибок);

КонецПроцедуры

Expand Down Expand Up @@ -331,7 +332,7 @@
// Для обработки not, нам понадобятся промежуточные результаты валидации.
// Закэшируем накопленные ошибки, а после выполнения проверок вернем их на место.
КэшОшибок = Новый Массив;
ДополнитьМассив(КэшОшибок, Ошибки);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(КэшОшибок, Ошибки);

ОтрицательнаяСхема = ПроверяемаяСхема.Получить("not");
ОтрицательнаяСхема = РазыменоватьСхему(ОтрицательнаяСхема);
Expand All @@ -348,7 +349,7 @@
Ошибки = Новый Массив();
КонецЕсли;

ДополнитьМассив(Ошибки, КэшОшибок);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(Ошибки, КэшОшибок);

КонецПроцедуры

Expand Down Expand Up @@ -425,7 +426,7 @@
ОписаниеТипа = Новый ОписаниеТипов(ОписаниеТипа, "УникальныйИдентификатор");
КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off

Возврат ОписаниеТипа;
Возврат ОписаниеТипа;
КонецФункции

Процедура ПроверитьСтрокуНаСоответствиеФорматуИПаттерну(ЗначениеСвойства, ПроверяемаяСхема)
Expand Down Expand Up @@ -482,18 +483,18 @@

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

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

Процедура ПроверитьМинимальнуюДлину(ЗначениеСвойства, ПроверяемаяСхема)
Expand Down Expand Up @@ -643,7 +644,7 @@
Возврат;
КонецЕсли;

СвернутыйМассив = СвернутьМассив(ПроверяемыйМассив);
СвернутыйМассив = пбп_ПереадресацияКлиентСервер.СвернутьМассив(ПроверяемыйМассив);

Если Не СвернутыйМассив.Количество() = ПроверяемыйМассив.Количество() Тогда
ТекстОшибки = СтрШаблон("%1 Значения в массиве не уникальны;", ШаблонБазовойОшибки);
Expand Down Expand Up @@ -798,54 +799,6 @@
Возврат Ложь;
КонецФункции

// Возвращает копию исходного массива с уникальными значениями.
//
// Параметры:
// Массив - Массив - массив произвольных значений.
//
// Возвращаемое значение:
// Массив - массив уникальных элементов.
//
Функция СвернутьМассив(Знач Массив)
Результат = Новый Массив;
ДополнитьМассив(Результат, Массив, Истина);
Возврат Результат;
КонецФункции

// Дополняет массив МассивПриемник значениями из массива МассивИсточник.
//
// Параметры:
// МассивПриемник - Массив - массив, в который необходимо добавить значения.
// МассивИсточник - Массив - массив значений для заполнения.
// ТолькоУникальныеЗначения - Булево - если истина, то в массив будут включены только уникальные значения.
//
Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь)

Если ТолькоУникальныеЗначения Тогда

УникальныеЗначения = Новый Соответствие;

Для Каждого Значение Из МассивПриемник Цикл
УникальныеЗначения.Вставить(Значение, Истина);
КонецЦикла;

Для Каждого Значение Из МассивИсточник Цикл
Если УникальныеЗначения[Значение] = Неопределено Тогда
МассивПриемник.Добавить(Значение);
УникальныеЗначения.Вставить(Значение, Истина);
КонецЕсли;
КонецЦикла;

Иначе

Для Каждого Значение Из МассивИсточник Цикл
МассивПриемник.Добавить(Значение);
КонецЦикла;

КонецЕсли;

КонецПроцедуры

Функция ПолучитьПроверяемуюСхему(ИмяСхемы, ТекущийКонтекст)
ПроверяемаяСхема = ТекущийКонтекст.Получить(ИмяСхемы);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ВызватьИсключение НСтр("ru = 'Форма не предназначена для непосредственного открытия'");
ТекстСообщения = НСтр("ru = 'Форма не предназначена для непосредственного открытия'");
пбп_Переадресация.СообщитьПользователю(ТекстСообщения, , , , Отказ);

КонецПроцедуры

Expand Down

0 comments on commit c04b20d

Please sign in to comment.