JSON в список на C#, нужна помощь

Денчик

Client
Регистрация
01.02.2023
Сообщения
12
Благодарностей
2
Баллы
3
Всем доброго времени суток!
Есть JSON из которого нужно 44 ключа распарсить в таблицу. Сначала просто кубиком "JSON в список" сделал, но получилось очень громоздко, хотелось бы сложить в 1 кубик, а никак не получается. Думал через JSONPath из JArray собрать нужные данные, но не в каждом объекте есть все ключи, из-за чего собрать потом списки в таблицу невозможно...

Потом попробовал построчно распарсить
C#:
for (var i = 0; i < project.Json.Count; i++)
{
    project.Lists["A"].Add(project.Json[i].article);
    project.Lists["F"].Add(project.Json[i].name);
    project.Lists["G"].Add(project.Json[i].serie);
    project.Lists["H"].Add(project.Json[i].warranty);
    project.Lists["I"].Add(project.Json[i].tnved);
    project.Lists["J"].Add(project.Json[i].texts.descript);
    project.Lists["K"].Add(project.Json[i].texts.application);
    project.Lists["L"].Add(project.Json[i].unit);
    project.Lists["M"].Add(project.Json[i].package.name);
    project.Lists["N"].Add(project.Json[i].package.qty);
    project.Lists["O"].Add(project.Json[i].package.qty_unit);
    project.Lists["P"].Add(project.Json[i].package.length);
    project.Lists["Q"].Add(project.Json[i].package.length_unit);
    project.Lists["R"].Add(project.Json[i].package.width);
    project.Lists["S"].Add(project.Json[i].package.width_unit);
    project.Lists["T"].Add(project.Json[i].package.height);
    project.Lists["U"].Add(project.Json[i].package.height_unit);
    project.Lists["V"].Add(project.Json[i].package.weight);
    project.Lists["W"].Add(project.Json[i].package.weight_unit);
    project.Lists["X"].Add(project.Json[i].package.weight_netto);
    project.Lists["Y"].Add(project.Json[i].package.weight_netto_unit);
    project.Lists["Z"].Add(project.Json[i].package.volume);
    project.Lists["AA"].Add(project.Json[i].package.volume_unit);
    project.Lists["AB"].Add(project.Json[i].container.name);
    project.Lists["AC"].Add(project.Json[i].container.qty);
    project.Lists["AD"].Add(project.Json[i].container.qty_unit);
    project.Lists["AE"].Add(project.Json[i].container.length);
    project.Lists["AF"].Add(project.Json[i].container.length_unit);
    project.Lists["AG"].Add(project.Json[i].container.width);
    project.Lists["AH"].Add(project.Json[i].container.width_unit);
    project.Lists["AI"].Add(project.Json[i].container.height);
    project.Lists["AJ"].Add(project.Json[i].container.height_unit);
    project.Lists["AK"].Add(project.Json[i].container.weight);
    project.Lists["AL"].Add(project.Json[i].container.weight_unit);
    project.Lists["AM"].Add(project.Json[i].container.weight_netto);
    project.Lists["AN"].Add(project.Json[i].container.weight_netto_unit);
    project.Lists["AO"].Add(project.Json[i].container.volume);
    project.Lists["AP"].Add(project.Json[i].container.volume_unit);
    project.Lists["AQ"].Add(project.Json[i].prices.retail);
    project.Lists["AR"].Add(project.Json[i].prices.mrc1);
    project.Lists["AS"].Add(project.Json[i].prices.mrc2);
    project.Lists["AT"].Add(project.Json[i].prices.mrc3);
    project.Lists["AU"].Add(project.Json[i].prices_currency);
    project.Lists["AV"].Add(project.Json[i].instock.stock);
    project.Lists["AW"].Add(project.Json[i].instock.unit);
}
но всплывают ошибки, из-за того, что в некоторых объектах вложенный массив "instock" пустой или не содержит нужный ключ.
Выполнение действия CSharp OwnCode. "ZennoLab.JXParser.JsonDynamic" не содержит определения для "stock"

Пробовал проверку поставить на пустой массив
C#:
for (var i = 0; i < project.Json.Count; i++)
    
    if (project.Json[i].GetMember("instock").ToString() == "[]")
    {
        project.Lists["AV"].Add("");
        project.Lists["AW"].Add("");
    }
    else
    {
        project.Lists["AV"].Add(project.Json[i].GetMember("instock").GetMember("stock"));
        project.Lists["AW"].Add(project.Json[i].GetMember("instock").GetMember("unit"));
    }
но и тут ловлю ошибки
Выполнение действия CSharp OwnCode. Ссылка на объект не указывает на экземпляр объекта.


В общем кубик "JSON в список" работает идеально, но не понятно как он это делает :(
 

Вложения

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 192
Благодарностей
825
Баллы
113
Удобно работать с JSON преобразовав его в классы например в этом сервисе
а потом собрав назад и получив удобный доступ ко всем данным
 

Денчик

Client
Регистрация
01.02.2023
Сообщения
12
Благодарностей
2
Баллы
3
Удобно работать с JSON преобразовав его в классы например в этом сервисе
Другими словами дессиреализацию сделать?
121101
Так я в ЗП сделал через кубик ее и вытаскиваю через "project.Json" та же самая структура

а потом собрав назад и получив удобный доступ ко всем данным
А вот это я не понял.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Разобрал JSON который в шапке темы.
Но, не могу сказать что это правильный способ, так как несколько раз происходит сериализация/десериализация.
Думаю как пример сгодится - сам часто разбираю JSON используя словари.

C#:
string json = project.Variables["json"].Value;
var tb = project.Tables["tb"];
Dictionary<string,object> dic = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json);

if(dic.ContainsKey("data")) {
    string json_data = Global.ZennoLab.Json.JsonConvert.SerializeObject(dic["data"]);
    Dictionary<string,object> dic_data = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_data);
    
    if(dic_data.ContainsKey("products")){
        string json_products = Global.ZennoLab.Json.JsonConvert.SerializeObject(dic_data["products"]);
        List<Dictionary<string,object>> products = Global.ZennoLab.Json.JsonConvert.DeserializeObject<List<Dictionary<string,object>>>(json_products);
        if(products.Count > 0) {
            project.SendInfoToLog(string.Format("products содержит: {0} элементов", products.Count));
            
            foreach(Dictionary<string,object> product in products) {
                List<string> row = new List<string>();
                row.Add(string.Format("{0}", product.ContainsKey("article") ? product["article"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("name") ? product["name"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("serie") ? product["serie"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("warranty") ? product["warranty"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("warranty") ? product["warranty"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("tnved") ? product["tnved"] : string.Empty));
                
                project.SendInfoToLog("+");
                if(product.ContainsKey("texts")) {
                    string json_texts = Global.ZennoLab.Json.JsonConvert.SerializeObject(product["texts"]);
                    Dictionary<string,object> texts = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_texts);
                    
                    row.Add(string.Format("{0}", texts.ContainsKey("descript") ? texts["descript"] : string.Empty));
                    row.Add(string.Format("{0}", texts.ContainsKey("application") ? texts["application"] : string.Empty));
                
                }
                else {
                    for(int i=0;i<2;i++) row.Add(string.Empty);
                }
                
                row.Add(string.Format("{0}", product.ContainsKey("unit") ? product["unit"] : string.Empty));
                
                project.SendInfoToLog("++");
                if(product.ContainsKey("package")) {
                    string json_package  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["package"]);
                    Dictionary<string,object> package = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_package);
                
                    row.Add(string.Format("{0}", package.ContainsKey("name") ? package["name"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("qty") ? package["qty"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("qty_unit") ? package["qty_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("length") ? package["length"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("length_unit") ? package["length_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("width") ? package["width"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("width_unit") ? package["width_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("height") ? package["height"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("height_unit") ? package["height_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight") ? package["weight"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight_unit") ? package["weight_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight_netto") ? package["weight_netto"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight_netto_unit") ? package["weight_netto_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("volume") ? package["volume"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("volume_unit") ? package["volume_unit"] : string.Empty));
                }
                else {
                    for(int i=0;i<15;i++) row.Add(string.Empty);
                }
                
                
                project.SendInfoToLog("+++");
                if(product.ContainsKey("container")) {
                    string json_container  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["container"]);
                    Dictionary<string,object> container = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_container);
                
                    row.Add(string.Format("{0}", container.ContainsKey("name") ? container["name"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("qty") ? container["qty"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("qty_unit") ? container["qty_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("length") ? container["length"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("length_unit") ? container["length_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("width") ? container["width"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("width_unit") ? container["width_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("height") ? container["height"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("height_unit") ? container["height_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight") ? container["weight"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight_unit") ? container["weight_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight_netto") ? container["weight_netto"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight_netto_unit") ? container["weight_netto_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("volume") ? container["volume"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("volume_unit") ? container["volume_unit"] : string.Empty));
                }
                else {
                    for(int i=0;i<15;i++) row.Add(string.Empty);
                }
                
                project.SendInfoToLog("++++");
                if(product.ContainsKey("prices")) {
                    string json_prices  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["prices"]);
                    Dictionary<string,object> prices = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_prices);
                    
                    row.Add(string.Format("{0}", prices.ContainsKey("retail") ? prices["retail"] : string.Empty));
                    row.Add(string.Format("{0}", prices.ContainsKey("mrc1") ? prices["mrc1"] : string.Empty));
                    row.Add(string.Format("{0}", prices.ContainsKey("mrc2") ? prices["mrc2"] : string.Empty));
                    row.Add(string.Format("{0}", prices.ContainsKey("mrc3") ? prices["mrc3"] : string.Empty));
        
                }
                else{
                    for(int i=0;i<4;i++) row.Add(string.Empty);
                }
                
                row.Add(string.Format("{0}", product.ContainsKey("prices_currency") ? product["prices_currency"] : string.Empty));
                
                
                project.SendInfoToLog("+++++");
                if(product.ContainsKey("instock")) {
                
                    string json_instock  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["instock"]);
                    if(json_instock != "[]") {
                        Dictionary<string,object> instock = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_instock);
                            row.Add(string.Format("{0}", instock.ContainsKey("stock") ? instock["stock"] : string.Empty));
                            row.Add(string.Format("{0}", instock.ContainsKey("unit") ? instock["unit"] : string.Empty));
                    }
                    
                    else {
                        for(int i=0;i<2;i++) row.Add(string.Empty);
                    }
                    
                }
                else{
                    for(int i=0;i<2;i++) row.Add(string.Empty);
                }
                
                lock(SyncObjects.TableSyncer) tb.AddRow(row);
            }
        }
        else {
            project.SendInfoToLog("products нет содержит элементов");
        }
    }
    else {
        project.SendInfoToLog("products не найден");
    }
    
}
else {
    project.SendInfoToLog("data не найден");
}
 
  • Спасибо
Реакции: Денчик

Денчик

Client
Регистрация
01.02.2023
Сообщения
12
Благодарностей
2
Баллы
3
Разобрал JSON который в шапке темы.
Но, не могу сказать что это правильный способ, так как несколько раз происходит сериализация/десериализация.
Думаю как пример сгодится - сам часто разбираю JSON используя словари.

C#:
string json = project.Variables["json"].Value;
var tb = project.Tables["tb"];
Dictionary<string,object> dic = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json);

if(dic.ContainsKey("data")) {
    string json_data = Global.ZennoLab.Json.JsonConvert.SerializeObject(dic["data"]);
    Dictionary<string,object> dic_data = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_data);
   
    if(dic_data.ContainsKey("products")){
        string json_products = Global.ZennoLab.Json.JsonConvert.SerializeObject(dic_data["products"]);
        List<Dictionary<string,object>> products = Global.ZennoLab.Json.JsonConvert.DeserializeObject<List<Dictionary<string,object>>>(json_products);
        if(products.Count > 0) {
            project.SendInfoToLog(string.Format("products содержит: {0} элементов", products.Count));
           
            foreach(Dictionary<string,object> product in products) {
                List<string> row = new List<string>();
                row.Add(string.Format("{0}", product.ContainsKey("article") ? product["article"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("name") ? product["name"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("serie") ? product["serie"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("warranty") ? product["warranty"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("warranty") ? product["warranty"] : string.Empty));
                row.Add(string.Format("{0}", product.ContainsKey("tnved") ? product["tnved"] : string.Empty));
               
                project.SendInfoToLog("+");
                if(product.ContainsKey("texts")) {
                    string json_texts = Global.ZennoLab.Json.JsonConvert.SerializeObject(product["texts"]);
                    Dictionary<string,object> texts = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_texts);
                   
                    row.Add(string.Format("{0}", texts.ContainsKey("descript") ? texts["descript"] : string.Empty));
                    row.Add(string.Format("{0}", texts.ContainsKey("application") ? texts["application"] : string.Empty));
               
                }
                else {
                    for(int i=0;i<2;i++) row.Add(string.Empty);
                }
               
                row.Add(string.Format("{0}", product.ContainsKey("unit") ? product["unit"] : string.Empty));
               
                project.SendInfoToLog("++");
                if(product.ContainsKey("package")) {
                    string json_package  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["package"]);
                    Dictionary<string,object> package = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_package);
               
                    row.Add(string.Format("{0}", package.ContainsKey("name") ? package["name"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("qty") ? package["qty"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("qty_unit") ? package["qty_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("length") ? package["length"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("length_unit") ? package["length_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("width") ? package["width"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("width_unit") ? package["width_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("height") ? package["height"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("height_unit") ? package["height_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight") ? package["weight"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight_unit") ? package["weight_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight_netto") ? package["weight_netto"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("weight_netto_unit") ? package["weight_netto_unit"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("volume") ? package["volume"] : string.Empty));
                    row.Add(string.Format("{0}", package.ContainsKey("volume_unit") ? package["volume_unit"] : string.Empty));
                }
                else {
                    for(int i=0;i<15;i++) row.Add(string.Empty);
                }
               
               
                project.SendInfoToLog("+++");
                if(product.ContainsKey("container")) {
                    string json_container  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["container"]);
                    Dictionary<string,object> container = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_container);
               
                    row.Add(string.Format("{0}", container.ContainsKey("name") ? container["name"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("qty") ? container["qty"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("qty_unit") ? container["qty_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("length") ? container["length"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("length_unit") ? container["length_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("width") ? container["width"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("width_unit") ? container["width_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("height") ? container["height"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("height_unit") ? container["height_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight") ? container["weight"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight_unit") ? container["weight_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight_netto") ? container["weight_netto"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("weight_netto_unit") ? container["weight_netto_unit"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("volume") ? container["volume"] : string.Empty));
                    row.Add(string.Format("{0}", container.ContainsKey("volume_unit") ? container["volume_unit"] : string.Empty));
                }
                else {
                    for(int i=0;i<15;i++) row.Add(string.Empty);
                }
               
                project.SendInfoToLog("++++");
                if(product.ContainsKey("prices")) {
                    string json_prices  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["prices"]);
                    Dictionary<string,object> prices = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_prices);
                   
                    row.Add(string.Format("{0}", prices.ContainsKey("retail") ? prices["retail"] : string.Empty));
                    row.Add(string.Format("{0}", prices.ContainsKey("mrc1") ? prices["mrc1"] : string.Empty));
                    row.Add(string.Format("{0}", prices.ContainsKey("mrc2") ? prices["mrc2"] : string.Empty));
                    row.Add(string.Format("{0}", prices.ContainsKey("mrc3") ? prices["mrc3"] : string.Empty));
       
                }
                else{
                    for(int i=0;i<4;i++) row.Add(string.Empty);
                }
               
                row.Add(string.Format("{0}", product.ContainsKey("prices_currency") ? product["prices_currency"] : string.Empty));
               
               
                project.SendInfoToLog("+++++");
                if(product.ContainsKey("instock")) {
               
                    string json_instock  =Global.ZennoLab.Json.JsonConvert.SerializeObject(product["instock"]);
                    if(json_instock != "[]") {
                        Dictionary<string,object> instock = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string,object>>(json_instock);
                            row.Add(string.Format("{0}", instock.ContainsKey("stock") ? instock["stock"] : string.Empty));
                            row.Add(string.Format("{0}", instock.ContainsKey("unit") ? instock["unit"] : string.Empty));
                    }
                   
                    else {
                        for(int i=0;i<2;i++) row.Add(string.Empty);
                    }
                   
                }
                else{
                    for(int i=0;i<2;i++) row.Add(string.Empty);
                }
               
                lock(SyncObjects.TableSyncer) tb.AddRow(row);
            }
        }
        else {
            project.SendInfoToLog("products нет содержит элементов");
        }
    }
    else {
        project.SendInfoToLog("products не найден");
    }
   
}
else {
    project.SendInfoToLog("data не найден");
}
Выходит, что в целом я мыслил правильно, просто действовал топорно. А тут прям каждый массив отдельно проверяется и распаршивается. Очень круто, спасибо, буду изучать.
 
  • Спасибо
Реакции: BAZAg

Денчик

Client
Регистрация
01.02.2023
Сообщения
12
Благодарностей
2
Баллы
3
@BAZAg переписал под себя. Теперь никаких ошибок. Большое спасибо.
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
@BAZAg переписал под себя. Теперь никаких ошибок. Большое спасибо.
Отлично! Главное что работает!
Я в большинстве случаев использую данный вариант (десериализую в словарь и перепроверяю наличие нужных ключей).
Хотя, можно конечно создать класс, и десериализовать одной строкой.
Просто, через словарь скажем так быстрее собирать код и сразу понятно как будет вести себя код (не будут появляться непредвиденные ошибки и тп), но на больших объемах возможно все же подумать над тем, как оптимизировать (когда хочется быстрее или больше потоков - тогда проблема постоянной сериализации/десериализации становится очевидной - кушает процессор больше чем нужно, возможно где-то код выполняется дольше чем хотелось бы).
 
  • Спасибо
Реакции: Денчик

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)