Имя: Пароль:
1C
1C 7.7
v7: Структура JSON файла для работы онлайн касс через Web
,
0 brenli
 
12.12.19
14:59
Всем привет.
Пишу обработку которая будет представлять из себя класс состоящий из объектов и методов описанных через web для генерации запросов.

Вот пример объекта Оператор

//Функция ОбъектОператор(name, vatin)
//name  - Имя и/или должность оператора открывающего смену (тег 1021) (тип - Строка, + )
//vatin - ИНН оператора (тег 1203)(тип - Строка, по умолчанию - не используется)
Функция ОбъектОператор(name, vatin="")

    name  = СокрЛП(name);
    vatin = СокрЛП(vatin);
    
    Если ПустаяСтрока(name)=1 Тогда
        Сообщить(" ОбъектОператор  Параметр - name не заполнен!");
        Возврат "null";
    КонецЕсли;
    
    MainSection = "
    |""operator"":{
    |""name"":"""+name+"""
    |";    
    
    vatinStr = """vatin"":"""+vatin+"""";
          
    Comma = ",";
    CCurlyBrace = "}";  
    Ent         = РазделительСтрок;
    
    result      = MainSection+Ent;
    
    Если ПустоеЗначение(vatin)=0 Тогда  
        result = result+Comma+vatinStr+Ent;
    КонецЕсли;                      
    
    result = result + CCurlyBrace;
                                  
    Возврат result;
КонецФункции

Вопрос заключается в том - как правильнее генерировать структуру JSON
описать сразу все элементы (даже не обязательные и даже если они не нужны или не используются), а в переменные подставлять значения,
либо как делаю я - сначала проверяю и если поле (параметр) дополнительных (не основных параметров) не заполнены - то просто данная секция не добавляется в строку вывода, НО минус этого в том -
что приходится писать очень много условий друг за другом. Согласен что можно создать функцию и проверять параметры в ней , но это тоже не совсем красиво будет до 15 раз вызов функции, да и запутаться можно будет.
Интересует ваше мнение
1 Garykom
 
гуру
12.12.19
15:06
Сделай обратную хрен вот этому коду:

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

//======================================================================
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON)
    Результат = СоздатьОбъект("СписокЗначений");
    
    ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");
    ТекстJSON = СтрЗаменить(ТекстJSON, """", "");    
    Если Лев(ТекстJSON, 1) = "{" Тогда
        ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
    ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
        МассивДанных = СоздатьОбъект("СписокЗначений");
        ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
        
        Результат.Вставить("Значение", МассивДанных);
    КонецЕсли;
        
    Возврат Результат;
КонецФункции


Т.е. создается обычный СЗ и заполняется, натравливается твой код и получается на выходе JSON.
2 Garykom
 
гуру
12.12.19
15:10
(1)+ Минус что тут и массив и объект в виде СпискаЗначений а не разных структур представлены.
Изначальный код я дернул откуда то для 8-ки и быстро перефигачил для 7.7 хорошо бы допилить его.
3 brenli
 
12.12.19
15:15
(1)  За этот код спасибо, ответы им буду разбирать.

А структуру генерировать с помощью кода это будет не наглядно и сложно для восприятия.
Я практически для всех объектов и действий сделал функции обертки и итоговый JSON запрос собирается как из конструктора.
4 brenli
 
12.12.19
15:17
+(3)  все равно придется проверять что добавлять, а что нет
5 Garykom
 
гуру
12.12.19
15:20
(3) Как раз наоборот для 7чников очень удобно и наглядно работать с привычными ТЗ и СЗ.
Пишут например
лСЗ = СоздатьОбъект("СписокЗначений");
лСЗ.ДобавитьЗначение("Параметр1","Значение1");
лСЗ.ДобавитьЗначение("Параметр2","Значение2");

Затем нечто вроде
ТекстJSON = ПолучитьJSON(лСЗ);

И на выходе готовый:
{
"Параметр1": "Значение1",
"Параметр2": "Значение2"
}
6 victuan1
 
13.12.19
05:21
Если обработка делается как класс (1с++ ?), то можно использовать объект ИндексированнаяТаблица
7 brenli
 
13.12.19
06:38
(6) Нет. Штатными средствами. Класс чисто условный смысл.
Делаю как пародию на ООП.
Закон Брукера: Даже маленькая практика стоит большой теории.