mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-02-01 13:17:58 +02:00
OZON: Тест структуры полей товара
This commit is contained in:
parent
d8920f6f03
commit
6bf89d827e
4
.github/workflows/oint_test_full_en.yml
vendored
4
.github/workflows/oint_test_full_en.yml
vendored
@ -1182,6 +1182,10 @@ jobs:
|
||||
if: ${{ cancelled() }} == false
|
||||
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./src/en/OInt/tests/Modules/internal/OPI_Tests.os "OzonAPI_AttributesAndFeatures"
|
||||
|
||||
- name: Uploading and updating products
|
||||
if: ${{ cancelled() }} == false
|
||||
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./src/en/OInt/tests/Modules/internal/OPI_Tests.os "OzonAPI_UploadingAndUpdatingProducts"
|
||||
|
||||
- name: Записать логи
|
||||
if: ${{ cancelled() }} == false
|
||||
uses: actions/cache/save@v3
|
||||
|
4
.github/workflows/oint_test_full_ru.yml
vendored
4
.github/workflows/oint_test_full_ru.yml
vendored
@ -1182,6 +1182,10 @@ jobs:
|
||||
if: ${{ cancelled() }} == false
|
||||
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./src/ru/OInt/tests/Modules/internal/OPI_Тесты.os "ОзонАПИ_АтрибутыИХарактеристики"
|
||||
|
||||
- name: Загрузка и обновление товаров
|
||||
if: ${{ cancelled() }} == false
|
||||
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./src/ru/OInt/tests/Modules/internal/OPI_Тесты.os "ОзонАПИ_ЗагрузкаИОбновлениеТоваров"
|
||||
|
||||
- name: Записать логи
|
||||
if: ${{ cancelled() }} == false
|
||||
uses: actions/cache/save@v3
|
||||
|
262
.github/workflows/os/docs_examples.os
vendored
262
.github/workflows/os/docs_examples.os
vendored
@ -1,262 +0,0 @@
|
||||
#Использовать osparser
|
||||
#использовать "../../../src/ru/OInt/tools/"
|
||||
|
||||
Перем МодульТестов;
|
||||
Перем Парсер;
|
||||
Перем ОбластьТестов;
|
||||
Перем КаталогСохранения;
|
||||
Перем КаталогЗаписиЗначений;
|
||||
Перем ТекущаяСтруктураЗначений;
|
||||
Перем СоответствиеТестов;
|
||||
Перем ПутьКСоответствиюТестов;
|
||||
Перем ТекущаяБиблиотека;
|
||||
|
||||
Процедура ПриСозданииОбъекта()
|
||||
|
||||
ПутьКТестам = "./src/ru/OInt/tests/Modules/internal/OPI_Тесты.os";
|
||||
ОбластьТестов = "АтомарныеТесты";
|
||||
КаталогСохранения = "./docs/ru/examples/";
|
||||
КаталогЗаписиЗначений = "./docs/ru/data/";
|
||||
|
||||
ПутьКСоответствиюТестов = "./service/tests_set.json";
|
||||
ЧтениеJSON = Новый ЧтениеJSON();
|
||||
ЧтениеJSON.ОткрытьФайл(ПутьКСоответствиюТестов);
|
||||
СоответствиеТестов = ПрочитатьJSON(ЧтениеJSON, Истина);
|
||||
ЧтениеJSON.Закрыть();
|
||||
|
||||
Парсер = Новый ПарсерВстроенногоЯзыка;
|
||||
|
||||
МодульТестов = Новый ТекстовыйДокумент();
|
||||
МодульТестов.Прочитать(ПутьКТестам);
|
||||
|
||||
Начало = 0;
|
||||
Окончание = 0;
|
||||
|
||||
ПолучитьГраницыОбластиТестов(Начало, Окончание);
|
||||
|
||||
ДокументАтомарныхТестов = Новый ТекстовыйДокумент();
|
||||
|
||||
Для Н = Начало По Окончание Цикл
|
||||
ДокументАтомарныхТестов.ДобавитьСтроку(МодульТестов.ПолучитьСтроку(Н));
|
||||
КонецЦикла;
|
||||
|
||||
МодульТестов = ДокументАтомарныхТестов;
|
||||
|
||||
РазобратьТесты();
|
||||
|
||||
ЗаписьJSON = Новый ЗаписьJSON();
|
||||
ЗаписьJSON.ОткрытьФайл(ПутьКСоответствиюТестов);
|
||||
ЗаписатьJSON(ЗаписьJSON, СоответствиеТестов);
|
||||
ЗаписьJSON.Закрыть();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьГраницыОбластиТестов(Начало, Окончание)
|
||||
|
||||
ТекстМодуля = МодульТестов.ПолучитьТекст();
|
||||
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
|
||||
|
||||
ВложенныеОбласти = 0;
|
||||
|
||||
Для Каждого Объявление Из СтруктураМодуля.Объявления Цикл
|
||||
|
||||
Если Строка(Объявление.Тип) = "ИнструкцияПрепроцессораОбласть" Тогда
|
||||
|
||||
Если Объявление.Имя = ОбластьТестов Тогда
|
||||
Начало = Объявление.Начало.НомерСтроки;
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(Начало) Тогда
|
||||
ВложенныеОбласти = ВложенныеОбласти + 1;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если Строка(Объявление.Тип) = "ИнструкцияПрепроцессораКонецОбласти" И ЗначениеЗаполнено(Начало) Тогда
|
||||
|
||||
Если ВложенныеОбласти = 0 Тогда
|
||||
Окончание = Объявление.Начало.НомерСтроки;
|
||||
Прервать;
|
||||
Иначе
|
||||
ВложенныеОбласти = ВложенныеОбласти - 1;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура РазобратьТесты()
|
||||
|
||||
ТекстМодуля = МодульТестов.ПолучитьТекст();
|
||||
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
|
||||
|
||||
Для Каждого Объявление Из СтруктураМодуля.Объявления Цикл
|
||||
|
||||
Если Строка(Объявление.Тип) = "ОбъявлениеМетода" Тогда
|
||||
РазобратьМетод(Объявление.Начало.НомерСтроки, Объявление.Сигнатура.Имя);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура РазобратьМетод(НомерСтроки, Имя)
|
||||
|
||||
РазбитоеИмя = СтрРазделить(Имя, "_", Ложь);
|
||||
|
||||
Если РазбитоеИмя.Количество() <> 2 Тогда
|
||||
Сообщить("Метод " + Имя + " был найден но не обработан", СтатусСообщения.ОченьВажное);
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ТекстТекущейСтроки = МодульТестов.ПолучитьСтроку(НомерСтроки + 1);
|
||||
ТекстПримера = "";
|
||||
|
||||
ТекущаяСтруктураЗначений = Новый Структура();
|
||||
|
||||
ПрошлаяПустая = Ложь;
|
||||
Пока СтрНайти(ТекстТекущейСтроки, "END") = 0 И СтрНайти(ТекстТекущейСтроки, "КонецПроцедуры") = 0 Цикл
|
||||
|
||||
ТекущаяПустая = Ложь;
|
||||
ЭтоСкип = СтрНайти(ТекстТекущейСтроки, "SKIP") <> 0;
|
||||
ЭтоЛог = СтрНайти(ТекстТекущейСтроки, "ЗаписатьЛог") <> 0;
|
||||
|
||||
Если Не ЗначениеЗаполнено(СокрЛП(ТекстТекущейСтроки))
|
||||
Или ЭтоСкип Или ЭтоЛог Тогда
|
||||
ТекущаяПустая = Истина;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЭтоСкип И Не ЭтоЛог Тогда
|
||||
Если Не (ТекущаяПустая И ПрошлаяПустая) Тогда
|
||||
ТекстПримера = ТекстПримера + Символы.ПС + ПреобразоватьТекст(ТекстТекущейСтроки);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
НомерСтроки = НомерСтроки + 1;
|
||||
ТекстТекущейСтроки = МодульТестов.ПолучитьСтроку(НомерСтроки);
|
||||
|
||||
ПрошлаяПустая = ТекущаяПустая;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Каталог = КаталогСохранения + РазбитоеИмя[0];
|
||||
ОбъектКаталога = Новый Файл(Каталог);
|
||||
|
||||
Если Не ОбъектКаталога.Существует() Тогда
|
||||
СоздатьКаталог(Каталог);
|
||||
КонецЕсли;
|
||||
|
||||
ТекстПримера = СтрЗаменить(ТекстПримера, Символы.Таб, " ");
|
||||
ТекстПримера = " " + СокрЛП(ТекстПримера);
|
||||
ТекстПримера = СтрЗаменить(ТекстПримера, " " + Символы.ПС + " " + Символы.ПС, Символы.ПС);
|
||||
ТекстПримера = СтрЗаменить(ТекстПримера, Символы.ПС + " " + Символы.ПС, Символы.ПС);
|
||||
|
||||
ПутьПримера = Каталог + "/" + РазбитоеИмя[1] + ".txt";
|
||||
|
||||
ФайлПримера = Новый ТекстовыйДокумент();
|
||||
ФайлПримера.УстановитьТекст(ТекстПримера);
|
||||
ФайлПримера.Записать(ПутьПримера);
|
||||
|
||||
СоответствиеТестов.Вставить(Имя, Истина);
|
||||
|
||||
Если ЗначениеЗаполнено(ТекущаяСтруктураЗначений) Тогда
|
||||
|
||||
КаталогЗначений = КаталогЗаписиЗначений + РазбитоеИмя[0];
|
||||
ОбъектКаталога = Новый Файл(КаталогЗначений);
|
||||
|
||||
Если Не ОбъектКаталога.Существует() Тогда
|
||||
СоздатьКаталог(КаталогЗначений);
|
||||
КонецЕсли;
|
||||
|
||||
ПутьДанных = КаталогЗначений + "/" + РазбитоеИмя[1] + ".json";
|
||||
ФайлДанных = Новый Файл(ПутьДанных);
|
||||
|
||||
Если ФайлДанных.Существует() Тогда
|
||||
|
||||
ЧтениеJSON = Новый ЧтениеJSON();
|
||||
ЧтениеJSON.ОткрытьФайл(ПутьДанных, "UTF-8");
|
||||
|
||||
СтараяСтруктураЗначений = ПрочитатьJSON(ЧтениеJSON, Истина);
|
||||
ЧтениеJSON.Закрыть();
|
||||
|
||||
Для Каждого ЭлементСтруктуры Из СтараяСтруктураЗначений Цикл
|
||||
ТекущаяСтруктураЗначений.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ЗаписьJSON = Новый ЗаписьJSON;
|
||||
ЗаписьJSON.ОткрытьФайл(ПутьДанных, , , Новый ПараметрыЗаписиJSON());
|
||||
ЗаписатьJSON(ЗаписьJSON, ТекущаяСтруктураЗначений);
|
||||
ЗаписьJSON.Закрыть();
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПреобразоватьТекст(Текст)
|
||||
|
||||
ЕстьRU = СтрНайти(Текст, "ПараметрыФункции") <> 0;
|
||||
ЕстьEN = СтрНайти(Текст, "FunctionParameters") <> 0;
|
||||
|
||||
Если ЕстьRU Или ЕстьEN Тогда
|
||||
|
||||
РазбитоеЗначение = СтрРазделить(Текст, "=", Ложь);
|
||||
|
||||
ИмяПараметра = ОпределитьИмяПараметра(Текст, ?(ЕстьRU, "ПараметрыФункции", "FunctionParameters"));
|
||||
|
||||
Попытка
|
||||
Значение = OPI_ПолучениеДанныхТестов.ПолучитьПараметр(ИмяПараметра);
|
||||
Исключение
|
||||
ОО = ОписаниеОшибки();
|
||||
Возврат Текст;
|
||||
КонецПопытки;
|
||||
|
||||
ЗакрытьСекретныеДанные(Значение, ИмяПараметра);
|
||||
|
||||
Если РазбитоеЗначение.Количество() = 2 Тогда
|
||||
ТекущаяСтруктураЗначений.Вставить(СокрЛП(РазбитоеЗначение[0]), Значение);
|
||||
КонецЕсли;
|
||||
|
||||
ОпределениеПараметра = "ПараметрыФункции[""" + ИмяПараметра + """]";
|
||||
Текст = СтрЗаменить(Текст, ОпределениеПараметра, """" + Строка(Значение) + """");
|
||||
|
||||
ОпределениеПараметра = "FunctionParameters[""" + ИмяПараметра + """]";
|
||||
Текст = СтрЗаменить(Текст, ОпределениеПараметра, """" + Строка(Значение) + """");
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Текст;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ОпределитьИмяПараметра(Текст, Коллекция)
|
||||
|
||||
НачалоПараметра = СтрНайти(Текст, Коллекция + "[""") + 18;
|
||||
КонецПараметра = СтрНайти(Текст, """]");
|
||||
Имя = Сред(Текст, НачалоПараметра, КонецПараметра - НачалоПараметра);
|
||||
|
||||
Возврат Имя;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗакрытьСекретныеДанные(Значение, ИмяПараметра)
|
||||
|
||||
МассивПризнаковСекретов = Новый Массив;
|
||||
МассивПризнаковСекретов.Добавить("Secret");
|
||||
МассивПризнаковСекретов.Добавить("Token");
|
||||
МассивПризнаковСекретов.Добавить("Key");
|
||||
МассивПризнаковСекретов.Добавить("Refresh");
|
||||
|
||||
Для Каждого Признак Из МассивПризнаковСекретов Цикл
|
||||
Если СтрНайти(нРег(ИмяПараметра), нРег(Признак)) <> 0 Тогда
|
||||
Значение = Лев(Значение, Цел(СтрДлина(Значение) / 2)) + "...";
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
ПриСозданииОбъекта();
|
1
docs/en/examples/Ozon/GetProductStructure.txt
Normal file
1
docs/en/examples/Ozon/GetProductStructure.txt
Normal file
@ -0,0 +1 @@
|
||||
Result = OPI_Ozon.GetProductStructure();
|
1
docs/ru/examples/Ozon/ПолучитьСтруктуруТовара.txt
Normal file
1
docs/ru/examples/Ozon/ПолучитьСтруктуруТовара.txt
Normal file
@ -0,0 +1 @@
|
||||
Результат = OPI_Ozon.ПолучитьСтруктуруТовара();
|
File diff suppressed because it is too large
Load Diff
@ -3216,6 +3216,16 @@ Procedure OzonAPI_AttributesAndFeatures() Export
|
||||
|
||||
EndProcedure
|
||||
|
||||
Procedure OzonAPI_UploadingAndUpdatingProducts() Export
|
||||
|
||||
TestParameters = New Structure;
|
||||
OPI_TestDataRetrieval.ParameterToCollection("Ozon_ClientID" , TestParameters);
|
||||
OPI_TestDataRetrieval.ParameterToCollection("Ozon_ApiKey" , TestParameters);
|
||||
|
||||
Ozon_GetProductStructure(TestParameters);
|
||||
|
||||
EndProcedure
|
||||
|
||||
#EndRegion
|
||||
|
||||
#EndRegion
|
||||
@ -11316,6 +11326,18 @@ Procedure Ozon_SearchAttributeValue(FunctionParameters)
|
||||
|
||||
EndProcedure
|
||||
|
||||
Procedure Ozon_GetProductStructure(FunctionParameters)
|
||||
|
||||
Result = OPI_Ozon.GetProductStructure();
|
||||
|
||||
// END
|
||||
|
||||
OPI_TestDataRetrieval.WriteLog(Result, "GetProductStructure", "Ozon");
|
||||
|
||||
Check_Structure(Result);
|
||||
|
||||
EndProcedure
|
||||
|
||||
#EndRegion
|
||||
|
||||
#EndRegion
|
||||
|
@ -243,7 +243,8 @@ Function GetTestTable() Export
|
||||
NewTest(TestTable, "VKT_CommonMethods" , "Common methods" , VKT);
|
||||
NewTest(TestTable, "VKT_ChatManagment" , "Chat managment" , VKT);
|
||||
|
||||
NewTest(TestTable, "OzonAPI_AttributesAndFeatures" , "Attributes and features" , Ozon);
|
||||
NewTest(TestTable, "OzonAPI_AttributesAndFeatures" , "Attributes and features" , Ozon);
|
||||
NewTest(TestTable, "OzonAPI_UploadingAndUpdatingProducts" , "Uploading and updating products" , Ozon);
|
||||
|
||||
Return TestTable;
|
||||
|
||||
|
@ -243,7 +243,8 @@ Function GetTestTable() Export
|
||||
NewTest(TestTable, "VKT_CommonMethods" , "Common methods" , VKT);
|
||||
NewTest(TestTable, "VKT_ChatManagment" , "Chat managment" , VKT);
|
||||
|
||||
NewTest(TestTable, "OzonAPI_AttributesAndFeatures" , "Attributes and features" , Ozon);
|
||||
NewTest(TestTable, "OzonAPI_AttributesAndFeatures" , "Attributes and features" , Ozon);
|
||||
NewTest(TestTable, "OzonAPI_UploadingAndUpdatingProducts" , "Uploading and updating products" , Ozon);
|
||||
|
||||
Return TestTable;
|
||||
|
||||
|
@ -3216,6 +3216,16 @@ Procedure OzonAPI_AttributesAndFeatures() Export
|
||||
|
||||
EndProcedure
|
||||
|
||||
Procedure OzonAPI_UploadingAndUpdatingProducts() Export
|
||||
|
||||
TestParameters = New Structure;
|
||||
OPI_TestDataRetrieval.ParameterToCollection("Ozon_ClientID" , TestParameters);
|
||||
OPI_TestDataRetrieval.ParameterToCollection("Ozon_ApiKey" , TestParameters);
|
||||
|
||||
Ozon_GetProductStructure(TestParameters);
|
||||
|
||||
EndProcedure
|
||||
|
||||
#EndRegion
|
||||
|
||||
#EndRegion
|
||||
@ -11316,6 +11326,18 @@ Procedure Ozon_SearchAttributeValue(FunctionParameters)
|
||||
|
||||
EndProcedure
|
||||
|
||||
Procedure Ozon_GetProductStructure(FunctionParameters)
|
||||
|
||||
Result = OPI_Ozon.GetProductStructure();
|
||||
|
||||
// END
|
||||
|
||||
// !OInt OPI_TestDataRetrieval.WriteLog(Result, "GetProductStructure", "Ozon");
|
||||
|
||||
Check_Structure(Result);
|
||||
|
||||
EndProcedure
|
||||
|
||||
#EndRegion
|
||||
|
||||
#EndRegion
|
||||
|
@ -3216,6 +3216,16 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ОзонАПИ_ЗагрузкаИОбновлениеТоваров() Экспорт
|
||||
|
||||
ПараметрыТеста = Новый Структура;
|
||||
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Ozon_ClientID" , ПараметрыТеста);
|
||||
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Ozon_ApiKey" , ПараметрыТеста);
|
||||
|
||||
Ozon_ПолучитьСтруктуруТовара(ПараметрыТеста);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
@ -11316,6 +11326,18 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура Ozon_ПолучитьСтруктуруТовара(ПараметрыФункции)
|
||||
|
||||
Результат = OPI_Ozon.ПолучитьСтруктуруТовара();
|
||||
|
||||
// END
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтруктуруТовара", "Ozon");
|
||||
|
||||
Проверка_Структура(Результат);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -244,6 +244,7 @@
|
||||
НовыйТест(ТаблицаТестов, "ВКТ_УправлениеЧатами" , "Управление чатами" , ВКТ);
|
||||
|
||||
НовыйТест(ТаблицаТестов, "ОзонАПИ_АтрибутыИХарактеристики" , "Атрибуты и характеристики" , Озон);
|
||||
НовыйТест(ТаблицаТестов, "ОзонАПИ_ЗагрузкаИОбновлениеТоваров" , "Загрузка и обновление товаров" , Озон);
|
||||
|
||||
Возврат ТаблицаТестов;
|
||||
|
||||
|
@ -244,6 +244,7 @@
|
||||
НовыйТест(ТаблицаТестов, "ВКТ_УправлениеЧатами" , "Управление чатами" , ВКТ);
|
||||
|
||||
НовыйТест(ТаблицаТестов, "ОзонАПИ_АтрибутыИХарактеристики" , "Атрибуты и характеристики" , Озон);
|
||||
НовыйТест(ТаблицаТестов, "ОзонАПИ_ЗагрузкаИОбновлениеТоваров" , "Загрузка и обновление товаров" , Озон);
|
||||
|
||||
Возврат ТаблицаТестов;
|
||||
|
||||
|
@ -3216,6 +3216,16 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ОзонАПИ_ЗагрузкаИОбновлениеТоваров() Экспорт
|
||||
|
||||
ПараметрыТеста = Новый Структура;
|
||||
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Ozon_ClientID" , ПараметрыТеста);
|
||||
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Ozon_ApiKey" , ПараметрыТеста);
|
||||
|
||||
Ozon_ПолучитьСтруктуруТовара(ПараметрыТеста);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
@ -11316,6 +11326,18 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура Ozon_ПолучитьСтруктуруТовара(ПараметрыФункции)
|
||||
|
||||
Результат = OPI_Ozon.ПолучитьСтруктуруТовара();
|
||||
|
||||
// END
|
||||
|
||||
// !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтруктуруТовара", "Ozon");
|
||||
|
||||
Проверка_Структура(Результат);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
Loading…
x
Reference in New Issue
Block a user