JSON в 1С

13.06.19

Разработка - Универсальные функции

Функция для преобразования в JSON.
Функция JSON(Значение) Экспорт

    Разделитель="";
   
    ТипЗн=ТипЗнч(Значение);

    Если ТипЗн=Тип("Строка") Тогда
        Стр=""""+Маскировать(Значение)+""""

    ИначеЕсли ТипЗн=Тип("Число") ИЛИ ТипЗнч(Значение)=Тип("Булево") Тогда
        Стр=XMLСтрока(Значение)

    ИначеЕсли ТипЗн=Тип("Дата") Тогда
        Стр=""""+?(ЗначениеЗаполнено(Значение),XMLСтрока(Значение),"")+""""

    ИначеЕсли ТипЗн=Тип("Структура") Тогда
        Стр="{";
        Для Каждого Параметр Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+""""+Параметр.Ключ+""":"+JSON(Параметр.Значение);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+"}";

    ИначеЕсли ТипЗн=Тип("Массив") Тогда
        Стр="[";
        Для Каждого Элемент Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+JSON(Элемент);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+"]";

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

    ИначеЕсли Значение=Неопределено Тогда
        Стр="null"

    Иначе
        Стр=""""+Маскировать(Значение)+""""
    КонецЕсли;

    Возврат Стр
КонецФункции

Функция ФорматированныйJSON(Значение,Отступ="") Экспорт
    Разделитель="";
   
    ТипЗн=ТипЗнч(Значение);

    Если ТипЗн=Тип("Строка") Тогда
        Стр=""""+Маскировать(Значение)+""""

    ИначеЕсли ТипЗн=Тип("Число") ИЛИ ТипЗнч(Значение)=Тип("Булево") Тогда
        Стр=XMLСтрока(Значение)

    ИначеЕсли ТипЗн=Тип("Дата") Тогда
        Стр=""""+?(ЗначениеЗаполнено(Значение),XMLСтрока(Значение),"")+""""

    ИначеЕсли ТипЗн=Тип("Структура") Тогда
        Стр="{";
        Для Каждого Параметр Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+Отступ+""""+Параметр.Ключ+""":"+ФорматированныйJSON(Параметр.Значение,Отступ+Символы.Таб);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+Отступ+"}";

    ИначеЕсли ТипЗн=Тип("Массив") Тогда
        Стр="[";
        Для Каждого Элемент Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+Отступ+ФорматированныйJSON(Элемент,Отступ);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+Отступ+"]";

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

    ИначеЕсли Значение=Неопределено Тогда
        Стр="null"

    Иначе
        Стр=""""+Маскировать(Значение)+""""
    КонецЕсли;

    Возврат Стр
КонецФункции

Функция Маскировать(Знач Стр)
    Стр=СтрЗаменить(Стр,Символы.ПС,"\n");
    Стр=СтрЗаменить(Стр,Символы.ВК,"\r");
    Стр=СтрЗаменить(Стр,"""","\""");
    Стр=СтрЗаменить(Стр,"'","\'");
    Возврат Стр
КонецФункции

Примеры вызовов функции JSON:

Структура=Новый Структура("sIP,sDefaultGateway,nNode,nRing");

ЗаполнитьЗначенияСвойств(Структура,Источник);
Структура.Вставить("Error",Новый Структура("Code,Description",0,"OK"));
Возврат JSON(Структура)

или так

Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Абоненты");
Возврат JSON(Запрос.Выполнить().Выгрузить());

Просьба не пинать, так как это моя первая публикация.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3343    Abysswalker    8    

44

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    6221    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    48385    dimanich70    83    

169

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7267    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    60423    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9042    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Душелов 4024 26.10.09 13:59 Сейчас в теме
А почему ссылочные типы не сериализовать?
3. BigB 193 26.10.09 14:14 Сейчас в теме
(1) да как то не было надобности, но впринцепе можно сделать
2. Трактор 1275 26.10.09 14:06 Сейчас в теме
Прикольно. И главное жизненно. Можно AJAJ делать без обточки в ПХП.
4. PRoman 73 27.10.09 10:37 Сейчас в теме
а как обратно преобразовать?
5. BigB 193 28.10.09 10:19 Сейчас в теме
(4) как напишу - выложу
6. BigB 193 17.11.09 15:58 Сейчас в теме
7. xzorkiix 35 18.10.13 13:05 Сейчас в теме
Спасибо, сберегло время на разборы.
8. TitanLuchs 619 11.04.14 16:44 Сейчас в теме
Спасибо автору, сберег время
9. Elisy 957 28.11.14 08:01 Сейчас в теме
По скорости, если кому-то интересно. Сериализация Json работает очень медленно по сравнению с XML-сериализацией.
Оптимизация делалась для веб-сайта http://www.oboi.kg
На данных из примерно 5 тысяч записей таблицы значений перевод в XML уменьшил время обработки со 120 секунд (2 минуты) до 4 секунд.
Трактор; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация