Устанавливает строку, содержащую текст JSON для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанной строки.
Синтаксис
УстановитьСтроку(<СтрокаJSON>)Примеры платформы
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку("{}");Полное описание, параметры и ограничения
ЧтениеJSON.УстановитьСтроку (JSONReader.SetString)
ЧтениеJSON (JSONReader)
УстановитьСтроку (SetString)
Доступен, начиная с версии 8.3.6.
Синтаксис:
УстановитьСтроку(<СтрокаJSON>)
Параметры:
<СтрокаJSON> (обязательный)
Тип: Строка.
Строка, содержащая текст в формате JSON.
Описание:
Устанавливает строку, содержащую текст JSON для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанной строки.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Пример:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку("{}");
Использование в версии:
Доступен, начиная с версии 8.3.6.
Методическая информация
Практические примеры
Сформировать учебный отчёт и прочитать его JSON без публикации данных
Из контролируемого исключения создаём настоящий ОтчетОбОшибке, добавляем собственное описание и проверяем JSON-представление, не выводя весь отчёт в сообщения.
Где и как запускать
Полный модуль собственной управляемой формы: клиентская команда и клиентская функция создания контролируемого отчёта. В последнем уроке есть также серверная проверка политики.
Подготовка
Используйте собственную пустую учебную базу УчебнаяКонфигурацияСинтаксиса и отдельного учебного пользователя. Создайте управляемую обработку с командой ВыполнитьПример. Полный код каждого урока вставляйте в отдельную копию модуля формы.
Запускайте в тонком клиенте Windows или поддерживаемом толстом клиенте. Здесь не пример мобильного сервера: методы записи/отправки отчёта по справке клиентские.
Создаётся только контролируемое исключение с учебным сообщением. Не провоцируйте аварийное завершение 1С и не подменяйте его реальной рабочей ошибкой, содержащей персональные данные.
Отчёт автоматически использует настройки пользователя. До опыта вручную настройте в собственной базе запрет включения имени пользователя, сведений базы, подробного текста, системной информации и снимков. Просматривайте интерактивный отчёт перед сохранением/отправкой; сам конструктор не является анонимизацией.
&НаКлиенте
Процедура ВыполнитьПример(Команда)
Отчет = СоздатьСобственныйУчебныйОтчет();
Отчет.Описание = "Учебный сценарий: проверка собственной книги, количество 3";
Отчет.ДополнительныеДанные = Новый Структура("Ключ,Количество", "guide-book", 3);
Сообщить(Отчет.Описание = "Учебный сценарий: проверка собственной книги, количество 3");
Сообщить(Отчет.ДополнительныеДанные.Ключ = "guide-book");
Сообщить(Отчет.ДополнительныеДанные.Количество = 3);
Сообщить(СтрНайти(Отчет.ИнформацияОбОшибке.Описание, "Учебная ошибка проверки книги") > 0);
Сообщить("Приложенных файлов: " + Строка(Отчет.ДополнительныеФайлы.Количество()));
ТекстJSON = Отчет.ПолучитьТекстОтчета();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Попытка
Прочитано = ПрочитатьJSON(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Сообщить("JSON прочитан; тип корня: " + Строка(ТипЗнч(Прочитано)));
Сообщить("Длина JSON в символах: " + Строка(СтрДлина(ТекстJSON)));
КонецПроцедуры
&НаКлиенте
Функция СоздатьСобственныйУчебныйОтчет()
Попытка
ВызватьИсключение "Учебная ошибка проверки книги guide-book";
Исключение
Информация = ИнформацияОбОшибке();
Возврат Новый ОтчетОбОшибке(Информация);
КонецПопытки;
КонецФункцииРазбор по шагам
ИнформацияОбОшибке получаем внутри Исключение, пока обрабатывается именно наше контролируемое исключение. Объект передаётся обязательным аргументом конструктора ОтчетОбОшибке.
Описание и ДополнительныеДанные отчёта изменяемы. ИнформацияОбОшибке и ссылка на массив ДополнительныеФайлы доступны только для чтения; не присваиваем им новые объекты.
ПолучитьТекстОтчета возвращает JSON. Читаем его стандартным JSON-читателем и закрываем читатель как при успехе, так и при ошибке.
Не угадываем английские/русские ключи схемы отчёта и не требуем заранее конкретный тип корня: показываем фактически прочитанный тип и длину.
Справка говорит, что поля, запрещённые к отправке или требующие разрешения, не инициализируются в этом тексте. Это не означает, что любой отчёт автоматически обезличен; всё равно проверяйте настройки и содержимое в собственной базе.
ТекстJSON и разобранный объект не выводим целиком. Даже диагностический JSON может содержать сведения приложения; длина в символах не равна размеру UTF-8 файла.
Как проверить результат
Четыре логических проверки дают Истина; ошибка содержит собственное учебное сообщение.
JSON успешно читается либо выдаётся реальная ошибка формата. Нет записи архива или отправки: в уроке только получение текста.
Ожидаемый результат
Создан настоящий отчёт из контролируемой ошибки и разобран его текст без публикации содержимого.
На что обратить внимание
Не выдумывайте структуру JSON-отчёта: контракт полей здесь не описан.
Показано управление отчётом, а не анонимизация реального стека и не отправка в поддержку.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Включить свой готовый JSON-фрагмент через ЗаписатьБезОбработки
Собственный сериализатор готовит один объект товара. Из двух таких готовых фрагментов строим полный batch-документ и проверяем каждый восстановленный объект. Показываем, что raw-запись не экранирует и не проверяет JSON.
Где и как запускать
Полный серверный общий модуль УчебныйJSON своего пустого файлового стенда УчебныйJSONВводВывод85 и отдельный полный модуль формы. В1С не запускался.
Подготовка
НОВАЯ пустая отдельная учебная файловая база на собственном Windows-компьютере; точная платформа8.5.1.1343. Имя конфигурации УчебныйJSONВводВывод85, совместимость Не использовать, язык Русский. Нет бизнес-метаданных, расширений, подписок и заданий. Все модули пусты, кроме своего учебного модуля. Рабочие базы не используются.
Конфигуратор → Общие модули → УчебныйJSON: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной код только выбранного урока. У разных уроков одинаковые имена процедур: не склеивайте их в одном модуле.
Собственная внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма: команда Выполнить, действие Выполнить, связанная с ней кнопка; реквизиты не нужны. Весь отдельный модуль формы приведён ниже. Будущая ручная подготовка: сохранить конфигурацию, обновить конфигурацию базы (F7), открыть новый собственный тонкий клиент и свою обработку.
Четыре поля пакета создаются самим кодом: sku=BOOK85, title содержит кириллицу, двойные кавычки и перевод строки, quantity — Число3, enabled — БулевоИстина. Имена ключей пригодны для Структура. Это учебный контракт, не контракт Avito или другого сервиса.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Запись = Новый ЗаписьJSON;
Чтение = Новый ЧтениеJSON;
ЗаписьОткрыта = Ложь;
ЧтениеОткрыто = Ложь;
Ошибка = "";
Попытка
Запись.ПроверятьСтруктуру = Истина;
ЗаписьОткрыта = Истина;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, СвойПакетJSON());
Фрагмент = Запись.Закрыть();
ЗаписьОткрыта = Ложь;
ЧтениеОткрыто = Истина;
Чтение.УстановитьСтроку(Фрагмент);
Собственный = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();
ЧтениеОткрыто = Ложь;
ПроверитьСвойПакетJSON(Собственный);
ГотовыйДокумент = "{""batch"":[" + Фрагмент + "," + Фрагмент + "]}";
ЗаписьОткрыта = Истина;
Запись.УстановитьСтроку();
Если Не Запись.ПроверятьСтруктуру Тогда
ВызватьИсключение "Проверка обычных операций writer не должна быть отключена";
КонецЕсли;
Запись.ЗаписатьБезОбработки(ГотовыйДокумент);
Текст = Запись.Закрыть();
ЗаписьОткрыта = Ложь;
Если Текст <> ГотовыйДокумент Тогда
ВызватьИсключение "Raw-запись должна сохранить собственный готовый текст, не строковое значение JSON";
КонецЕсли;
ЧтениеОткрыто = Истина;
Чтение.УстановитьСтроку(Текст);
Документ = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();
ЧтениеОткрыто = Ложь;
Если ТипЗнч(Документ) <> Тип("Структура") Тогда
ВызватьИсключение "Нужен собственный объект с полем batch";
КонецЕсли;
Если Документ.Количество() <> 1 Или Не Документ.Свойство("batch", Пакеты) Тогда
ВызватьИсключение "Должно остаться только собственное поле batch";
КонецЕсли;
Если ТипЗнч(Пакеты) <> Тип("Массив") Тогда
ВызватьИсключение "batch должен быть массивом, не текстом с квадратными скобками";
КонецЕсли;
Если Пакеты.Количество() <> 2 Тогда
ВызватьИсключение "В batch должно быть ровно два собственных объекта";
КонецЕсли;
Для Каждого Пакет Из Пакеты Цикл
ПроверитьСвойПакетJSON(Пакет);
КонецЦикла;
Исключение
Ошибка = ОписаниеОшибки();
КонецПопытки;
ЗакрытьСвойЧитательJSON(Чтение, ЧтениеОткрыто, Ошибка);
ЗакрытьСвойПисательJSON(Запись, ЗаписьОткрыта, Ошибка);
Если Ошибка <> "" Тогда
ВызватьИсключение Ошибка;
КонецЕсли;
Сообщить(Текст);
Сообщить("Два собственных JSON-объекта batch проверены; raw не заменяет проверку документа");
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция СвойПакетJSON()
Возврат Новый Структура("sku,title,quantity,enabled", "BOOK85",
"Книга ""JSON""" + Символ(10) + "Учебная строка", 3, Истина);
КонецФункции
Процедура ПроверитьСвойПакетJSON(Пакет)
Если ТипЗнч(Пакет) <> Тип("Структура") Тогда
ВызватьИсключение "Нужен собственный JSON-объект, прочитанный в Структура";
КонецЕсли;
Эталон = СвойПакетJSON();
Если Пакет.Количество() <> Эталон.Количество() Тогда
ВызватьИсключение "В учебном пакете должно быть ровно четыре поля";
КонецЕсли;
Для Каждого Пара Из Эталон Цикл
Если Не Пакет.Свойство(Пара.Ключ, Факт) Тогда
ВызватьИсключение "Не найдено обязательное поле " + Пара.Ключ;
КонецЕсли;
Если ТипЗнч(Факт) <> ТипЗнч(Пара.Значение) Или Факт <> Пара.Значение Тогда
ВызватьИсключение "Не совпали тип или полное значение поля " + Пара.Ключ;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗакрытьСвойЧитательJSON(Чтение, ЧтениеОткрыто, Ошибка)
Если ЧтениеОткрыто Тогда
Попытка
Чтение.Закрыть();
ЧтениеОткрыто = Ложь;
Исключение
Ошибка = Ошибка + Символ(10) + "Закрытие своего JSON-читателя: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура ЗакрытьСвойПисательJSON(Запись, ЗаписьОткрыта, Ошибка)
Если ЗаписьОткрыта Тогда
Попытка
Запись.Закрыть();
ЗаписьОткрыта = Ложь;
Исключение
Ошибка = Ошибка + Символ(10) + "Закрытие своего JSON-писателя: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецПроцедурыУчебныйJSONВводВывод85.Форма
Своя внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма → Модуль
Полный отдельный модуль формы с вызовом своего серверного общего модуля; не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныйJSON.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Первый writer сериализует свою Структура обычным ЗаписатьJSON. Полученный Фрагмент содержит экранированные кавычки и перевод строки; title не вставляется в разметку конкатенацией.
Перед повторным использованием читаем собственный фрагмент и проверяем четыре поля. Только затем собираем целый документ из постоянной оболочки {"batch":[...,...]} и двух одинаковых проверенных объектов.
Writer заново направляется в строку. ПроверятьСтруктуру включено до открытия; при raw-вызове оно всё равно не проверяет содержимое фрагмента — так прямо описывает установленная справка.
Один ЗаписатьБезОбработки получает целый готовый документ. После него не вызываются отдельные ЗаписатьКонецОбъекта/Массива: эти скобки уже содержатся в собственном тексте, а обычные состояния writer нельзя угадывать после raw-вставки.
Закрыть возвращает текст без дополнительного экранирования и кавычек вокруг документа. Проверяем точное сохранение своего текста, затем отдельно разбираем весь JSON и проверяем объект batch, тип Массив, количество2 и оба полных пакета.
Как проверить результат
Будущий результат: batch — настоящий массив из двух одинаковых объектов, а не строка JSON. В обоих объектах quantity — число3 и полностью восстановлен title.
Будущий отрицательный контроль: после построения ГотовыйДокумент замените его на ГотовыйДокумент = "{""batch"":[}";. Raw-операция не обеспечивает валидность; полный ПрочитатьJSON должен отклонить повреждённый документ. Ошибка не должна стать сообщением успеха. Верните исходный модуль.
Нельзя считать включённое ПроверятьСтруктуру доказательством валидности raw-фрагмента. Проверка в уроке основана на собственном источнике, полном повторном разборе и проверке схемы.
Ожидаемый результат
Готовый свой фрагмент переиспользован дважды; содержимое проверено отдельным reader после raw-записи.
На что обратить внимание
runtimeVerifiedScenarios=0: BSL, форма, файловые операции и сериализация в1С здесь не запускались. Проверены источники и статические контракты, а не поведение будущего клиента.
JSON не сохраняет произвольные прикладные типы автоматически. Здесь только четыре скалярных значения; ссылки, даты, двоичные вложения и функции восстановления не добавляйте без отдельного контракта.
Проверка разбирает известные имена, типы и полные значения, а не порядок свойств или одинаковый текст форматирования. Число3 и строка "3" для этого пакета различны.
Закрытие reader и writer выполняется независимо. Исходная ошибка не теряется при ошибке освобождения второго ресурса. Сообщение об успехе появляется только после всех проверок и закрытия.
ЗаписатьБезОбработки не является безопасным способом вставить пользовательский title, ответ сайта или непроверенную строку. Для обычных значений нужен ЗаписатьJSON/ЗаписатьЗначение; чужие фрагменты здесь не принимаются.
Не обещаем проверку всех свойств JSON произвольного внешнего документа, обнаружение повторяющихся ключей или защиту от XSS. В уроке малый собственный JSON фиксированной схемы и без внешних данных.
Конкатенация применяется только к собственной постоянной JSON-оболочке и уже сериализованному/проверенному фрагменту. Экранировать исходное название вручную не предлагается.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.