Какие типы данных допустимы при записи структуры в JSON в 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Какие типы данных допустимы при записи структуры в JSON в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38484
      Фото аватараOdineski
      Участник

        При сохранении джисона какие типы в стурктуре должны быть
        Ошибка при вызове метода контекста (ЗаписатьJSON)
        {ВнешняяОбработка.СохранениеРеализацииДляАльфы.Форма.Форма.Форма(161)}: ЗаписатьJSON(ЗаписьJSON, Данные);
        {ВнешняяОбработка.СохранениеРеализацииДляАльфы.Форма.Форма.Форма(113)}: ПолучениеФайла = ПолучениеФайла(ПолучениеДанныхИзДокумента, Путь);
        по причине:
        Значение содержит данные недопустимых типов.
        Процедура Кнопка2Нажатие(Элемент)
        ПолучениеДанныхИзДокумента =Новый Структура;
        ПолучениеДанныхИзДокумента.Вставить(«ДокументРеализации»,Строка(СсылкаНаДокумент));
        ПолучениеДанныхИзДокумента.Вставить(«ПолеОрганизация»,Строка(Организация) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеОргИНН»,Строка(ОрганизацияИНН) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеСклад»,Строка(Склад) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеБанкСчет»,Строка(БанкСчет) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеКонтрагент»,Строка(Контрагент) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеДоговор», Строка(Договор) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеОснование»,Строка(Основание) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеПолучатель», Строка(Получатель));
        ПолучениеДанныхИзДокумента.Вставить(«ПолеВсегоДокумент»,Строка(ВсегоДокумент) );
        ПолучениеДанныхИзДокумента.Вставить(«ПолеНДСДокумент»,Строка(НдсДокумент));
        ПолучениеДанныхИзДокумента.Вставить(«ПолеТипЦен»,Строка(ТипЦен));
        ПолучениеДанныхИзДокумента.Вставить(«ПолеДатаДокумента»,Строка(ДатаДокумента));
        ПолучениеДанныхИзДокумента.Вставить(«ПолеНомерДокумента»,Строка(НомерДокумента));

        МассивТаблицы = Новый Массив;
        Для каждого СтрТаблицы Из ТабличнаяЧасть Цикл
        СтруктураСтроки = Новый Структура;
        СтруктураСтроки.Вставить(«Артикул»,СтрТаблицы.Артикул);
        СтруктураСтроки.Вставить(«Номенклатура»,СтрТаблицы.Номенклатура);
        СтруктураСтроки.Вставить(«Количество»,СтрТаблицы.Количество);
        СтруктураСтроки.Вставить(«ЕдИзмерения»,СтрТаблицы.ЕдИзмерения);
        СтруктураСтроки.Вставить(«Коэффицент»,СтрТаблицы.Коэффицент);
        СтруктураСтроки.Вставить(«Цена»,СтрТаблицы.Цена);
        СтруктураСтроки.Вставить(«СуммаБезСкидок»,СтрТаблицы.СуммаБезСкидок);
        СтруктураСтроки.Вставить(«ПроцентРучнойСкидки»,СтрТаблицы.ПроцентРучнойСкидки);
        СтруктураСтроки.Вставить(«Сумма»,СтрТаблицы.Сумма);
        СтруктураСтроки.Вставить(«НДС»,СтрТаблицы.НДС);
        СтруктураСтроки.Вставить(«СуммаНДС»,СтрТаблицы.СуммаНДС);
        СтруктураСтроки.Вставить(«Всего»,СтрТаблицы.Всего);
        СтруктураСтроки.Вставить(«Качество»,СтрТаблицы.Качество);
        СтруктураСтроки.Вставить(«Склад»,СтрТаблицы.Склад);
        СтруктураСтроки.Вставить(«ТиповаяОперация»,СтрТаблицы.ТиповаяОперация);
        СтруктураСтроки.Вставить(«ДатаВыработки»,СтрТаблицы.ДатаВыработки);

        МассивТаблицы.Добавить(СтруктураСтроки);
        КонецЦикла;
        ПолучениеДанныхИзДокумента.Вставить(«Массив»,МассивТаблицы);

        Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

        Диалог.Фильтр = «Файлы JSON (.json)|.json»;

        Если НЕ Диалог.Выбрать() Тогда

        Возврат;

        КонецЕсли;

        Путь = Диалог.ПолноеИмяФайла;

        // Сериализация структуры в JSON

        ПолучениеФайла = ПолучениеФайла(ПолучениеДанныхИзДокумента, Путь);
        //СтрокаJSON = СериализаторXDTO.ЗаписатьJSON(ПолучениеДанныхИзДокумента);
        //
        //Файл = Новый Файл(Путь);
        //
        //Поток = Файл.ОткрытьДляЗаписи();
        //
        //Поток.ЗаписатьСтроку(СтрокаJSON);
        //
        //Поток.Закрыть();

        //
        // ЗаписьJSON = Новый ЗаписьJSON;
        // ЗаписьJSON.ОткрытьФайл();

        //ЗаписьJSON = Новый ЗаписьJSON;
        //ПараметрыЗаписиJson = Новый ПараметрыЗаписиJSON(,Символы.Таб);
        //ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJson);
        //
        //ЗаписатьJSON(ЗаписьJSON, ПолучениеДанныхИзДокумента);
        //
        //СтрокаJSON = ЗаписьJSON.Закрыть();
        //ИмяФайла = «C:Usersuser-31DesktopОбработкиПроверкаДжисона.json»;

        //jsonстрока =ПолучениеДанныхИзДокумента.

        //Макет = ОбработкаОбъект.ПолучитьМакет(«Макет»);
        //ОбластьШапки = Макет.ПолучитьОбласть(«ШапкаДанных»);
        //ОбластьШапки

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

        Функция ПолучениеФайла(Данные, Путь)

        ЗаписьJSON = Новый ЗаписьJSON;

        ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);

        ЗаписьJSON.ОткрытьФайл(Путь, , , ПараметрыЗаписи);

        // Записываем структуру в JSON

        ЗаписатьJSON(ЗаписьJSON, Данные);

        // Закрываем поток записи

        ЗаписьJSON.Закрыть();

        //ПотокСтроки = Новый ЗаписьСтроки();
        //
        //Сериализатор = Новый СериализаторXDTO();
        //
        //Сериализатор.ЗаписатьJSON(ПотокСтроки, Даннык);
        //
        //СтрокаJSON = ПотокСтроки.Закрыть();
        //
        //
        //Файл = Новый Файл(Путь);
        //
        //Поток = Файл.ОткрытьДляЗаписи();
        //
        //Поток.ЗаписатьСтроку(СтрокаJSON);
        //
        //Поток.Закрыть();

        //СтрокаJSON = СериализаторXDTO.ЗаписатьJSON(ПолучениеДанныхИзДокумента);
        //
        // Файл = Новый Файл(Путь);
        //
        // Поток = Файл.ОткрытьДляЗаписи();
        //
        // Поток.ЗаписатьСтроку(СтрокаJSON);
        //
        // Поток.Закрыть();

        Переменая= 1;
        Возврат Переменая ;
        КонецФункции // ПолучениеФайла()

      • #38485
        bot_avaOdin — Одинэсник
        Участник

          Ошибка «Значение содержит данные недопустимых типов» при вызове ЗаписатьJSON возникает, когда в структуре или массиве есть значения, которые платформа 1С не может сериализовать в JSON.

          Допустимые типы для сериализации в JSON через ЗаписатьJSON:

          — Примитивы: Строка, Число, Булево, Дата, Неопределено (будет null)
          — Структура (ключи — строки, значения — допустимые типы)
          — Массив (элементы — допустимые типы)
          — ТаблицаЗначений (будет сериализована как массив структур)
          — Ссылки на объекты 1С — нельзя напрямую, нужно преобразовать в строку или структуру
          — Не поддерживаются: объекты, COM-объекты, сложные типы, например, реквизиты с типом «Объект», «Документ», «Справочник» и т.п.

          В вашем коде вероятно проблема в том, что в структуре есть поля, которые являются ссылками на объекты 1С (например, СсылкаНаДокумент, Организация, Контрагент, Договор, Склад и т.п.). Вы их просто приводите к строке через Строка(), но это не всегда корректно, особенно если это не строка, а объект.

          Рекомендации:

          1. Для ссылок на объекты 1С используйте метод .Представление() или .Ссылка с последующим преобразованием в строку, например:

          или

          но лучше проверить, что именно возвращает Строка(СсылкаНаДокумент) — иногда это не то, что ожидается.

          2. В табличной части тоже проверьте, что все поля — это простые типы (строки, числа, даты). Если там есть ссылки, то их тоже нужно преобразовать в строку или структуру с нужными полями.

          Например:

          3. Если есть даты, они сериализуются нормально, но если есть неопределенные значения — лучше заменить на Неопределено или "".

          4. Если есть булевы — они сериализуются нормально.

          Пример исправления для ссылок:

          В табличной части:

          Если Представление() не подходит, можно взять нужные реквизиты из объекта и сформировать структуру.

          Проверка типов перед сериализацией:

          Можно написать функцию, которая рекурсивно обходит структуру/массив и преобразует все ссылки в строки:

          И перед сериализацией делать:

          Итог:

          — В структуре и массивах должны быть только простые типы: строки, числа, даты, булевы, структуры, массивы.
          — Ссылки на объекты 1С нужно преобразовывать в строки или структуры с нужными полями.
          — Не должно быть объектов, COM-объектов, сложных типов.

          Рекомендую посмотреть подробный разбор здесь:
          https://helpf.pro/faq/view/1664.html
          там есть примеры работы с JSON и преобразования типов.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С