База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Какие типы данных допустимы при записи структуры в JSON в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 9 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
26 августа 2026 в 16:30 #38484
При сохранении джисона какие типы в стурктуре должны быть
Ошибка при вызове метода контекста (Записать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;
Возврат Переменая ;
КонецФункции // ПолучениеФайла() -
26 августа 2026 в 16:30 #38485
Ошибка «Значение содержит данные недопустимых типов» при вызове
ЗаписатьJSONвозникает, когда в структуре или массиве есть значения, которые платформа 1С не может сериализовать в JSON.Допустимые типы для сериализации в JSON через
ЗаписатьJSON:— Примитивы: Строка, Число, Булево, Дата, Неопределено (будет null)
— Структура (ключи — строки, значения — допустимые типы)
— Массив (элементы — допустимые типы)
— ТаблицаЗначений (будет сериализована как массив структур)
— Ссылки на объекты 1С — нельзя напрямую, нужно преобразовать в строку или структуру
— Не поддерживаются: объекты, COM-объекты, сложные типы, например, реквизиты с типом «Объект», «Документ», «Справочник» и т.п.—
В вашем коде вероятно проблема в том, что в структуре есть поля, которые являются ссылками на объекты 1С (например,
СсылкаНаДокумент,Организация,Контрагент,Договор,Склади т.п.). Вы их просто приводите к строке черезСтрока(), но это не всегда корректно, особенно если это не строка, а объект.Рекомендации:
1. Для ссылок на объекты 1С используйте метод
.Представление()или.Ссылкас последующим преобразованием в строку, например:1С (Код)1ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", СсылкаНаДокумент.Представление());или
1С (Код)1ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", Строка(СсылкаНаДокумент));но лучше проверить, что именно возвращает
Строка(СсылкаНаДокумент)— иногда это не то, что ожидается.2. В табличной части тоже проверьте, что все поля — это простые типы (строки, числа, даты). Если там есть ссылки, то их тоже нужно преобразовать в строку или структуру с нужными полями.
Например:
1С (Код)1СтруктураСтроки.Вставить("Номенклатура", СтрТаблицы.Номенклатура.Представление());3. Если есть даты, они сериализуются нормально, но если есть неопределенные значения — лучше заменить на
Неопределеноили"".4. Если есть булевы — они сериализуются нормально.
—
Пример исправления для ссылок:
1С (Код)1234ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", СсылкаНаДокумент.Представление());ПолучениеДанныхИзДокумента.Вставить("ПолеОрганизация", Организация.Представление());ПолучениеДанныхИзДокумента.Вставить("ПолеОргИНН", Строка(ОрганизацияИНН));...В табличной части:
1С (Код)12СтруктураСтроки.Вставить("Номенклатура", СтрТаблицы.Номенклатура.Представление());СтруктураСтроки.Вставить("Склад", СтрТаблицы.Склад.Представление());Если
Представление()не подходит, можно взять нужные реквизиты из объекта и сформировать структуру.—
Проверка типов перед сериализацией:
Можно написать функцию, которая рекурсивно обходит структуру/массив и преобразует все ссылки в строки:
1С (Код)123456789101112131415161718192021222324252627282930Функция ПреобразоватьДляJSON(Знач)Если ТипЗнч(Знач) = Тип("Структура") ТогдаРезультат = Новый Структура;Для каждого Элемент Из Знач ЦиклРезультат.Вставить(Элемент.Ключ, ПреобразоватьДляJSON(Элемент.Значение));КонецЦикла;Возврат Результат;ИначеЕсли ТипЗнч(Знач) = Тип("Массив") ТогдаРезультат = Новый Массив;Для каждого Элемент Из Знач ЦиклРезультат.Добавить(ПреобразоватьДляJSON(Элемент));КонецЦикла;Возврат Результат;ИначеЕсли ТипЗнч(Знач) = Тип("Ссылка") ТогдаВозврат Знач.Представление();ИначеЕсли ТипЗнч(Знач) = Тип("Дата") ТогдаВозврат Знач;ИначеЕсли ТипЗнч(Знач) = Тип("Булево") ТогдаВозврат Знач;ИначеЕсли ТипЗнч(Знач) = Тип("Число") ТогдаВозврат Знач;ИначеЕсли ТипЗнч(Знач) = Тип("Строка") ТогдаВозврат Знач;ИначеЕсли Знач = Неопределено ТогдаВозврат Неопределено;Иначе// Прочие типы преобразовать в строкуВозврат Строка(Знач);КонецЕсли;КонецФункцииИ перед сериализацией делать:
1С (Код)12ДанныеДляJSON = ПреобразоватьДляJSON(ПолучениеДанныхИзДокумента);ЗаписатьJSON(ЗаписьJSON, ДанныеДляJSON);—
Итог:
— В структуре и массивах должны быть только простые типы: строки, числа, даты, булевы, структуры, массивы.
— Ссылки на объекты 1С нужно преобразовывать в строки или структуры с нужными полями.
— Не должно быть объектов, COM-объектов, сложных типов.—
Рекомендую посмотреть подробный разбор здесь:
https://helpf.pro/faq/view/1664.html
там есть примеры работы с JSON и преобразования типов.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.