Устанавливает поток для чтения JSON данным объектом. Если перед вызовом данного метода уже выполнялось чтение данных JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного потока.
Синтаксис
ОткрытьПоток(<Поток>, <Кодировка>)Полное описание, параметры и ограничения
ЧтениеJSON.ОткрытьПоток (JSONReader.OpenStream)
ЧтениеJSON (JSONReader)
ОткрытьПоток (OpenStream)
Доступен, начиная с версии 8.3.10.
Синтаксис:
ОткрытьПоток(<Поток>, <Кодировка>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для чтения.
<Кодировка> (необязательный)
Тип: Строка, КодировкаТекста.
Позволяет задать кодировку текста во входном потоке.
Следует указывать для потоков в кодировках:
Big5 (Big5)
UTF-32 (UTF-32)
UTF-32BE (UTF-32BE)
UTF-32LE (UTF-32LE)
UTF32_PlatformEndian (UTF32_PlatformEndian)
UTF32_OppositeEndian (UTF32_OppositeEndian)
SCSU (SCSU)
BOCU-1 (BOCU-1)
US-ASCII (US-ASCII)
ISO-8859-1 (ISO-8859-1)
iso-8859-13 (iso-8859-13)
iso-8859-15 (iso-8859-15)
iso-8859-2 (iso-8859-2)
iso-8859-3 (iso-8859-3)
iso-8859-4 (iso-8859-4)
iso-8859-6 (iso-8859-6)
iso-8859-7 (iso-8859-7)
iso-8859-8 (iso-8859-8)
iso-8859-9 (iso-8859-9)
GB_2312-80 (GB_2312-80)
cp437 (cp437)
cp737 (cp737)
cp775 (cp775)
cp850 (cp850)
cp851 (cp851)
cp852 (cp852)
cp856 (cp856)
cp857 (cp857)
cp858 (cp858)
cp860 (cp860)
cp861 (cp861)
cp862 (cp862)
cp863 (cp863)
cp864 (cp864)
cp865 (cp865)
CP868 (CP868)
cp869 (cp869)
cp874 (cp874)
cp875 (cp875)
cp922 (cp922)
cp930 (cp930)
cp933 (cp933)
cp935 (cp935)
cp937 (cp937)
cp939 (cp939)
cp1006 (cp1006)
cp1025 (cp1025)
cp1097 (cp1097)
cp1098 (cp1098)
cp1112 (cp1112)
cp1122 (cp1122)
cp1123 (cp1123)
windows-874 (windows-874)
windows-950 (windows-950)
windows-1250 (windows-1250)
windows-1252 (windows-1252)
windows-1253 (windows-1253)
windows-1254 (windows-1254)
windows-1255 (windows-1255)
windows-1256 (windows-1256)
windows-1257 (windows-1257)
windows-1258 (windows-1258)
macintosh (macintosh)
x-mac-greek (x-mac-greek)
x-mac-centraleurroman (x-mac-centraleurroman)
x-mac-turkish (x-mac-turkish)
hp-roman8 (hp-roman8)
Adobe-Standard-Encoding (Adobe-Standard-Encoding)
ISO-2022-KR (ISO-2022-KR)
ISO-2022-CN (ISO-2022-CN)
ISO-2022-CN-EXT (ISO-2022-CN-EXT)
HZ-GB-2312 (HZ-GB-2312)
windows-57002 (windows-57002)
windows-57003 (windows-57003)
windows-57004 (windows-57004)
windows-57005 (windows-57005)
windows-57007 (windows-57007)
windows-57008 (windows-57008)
windows-57009 (windows-57009)
windows-57010 (windows-57010)
windows-57011 (windows-57011)
ebcdic-ar (ebcdic-ar)
ebcdic-de (ebcdic-de)
ebcdic-dk (ebcdic-dk)
ebcdic-he (ebcdic-he)
ebcdic-xml-us (ebcdic-xml-us)
IBM037 (IBM037)
IBM278 (IBM278)
IBM280 (IBM280)
IBM284 (IBM284)
IBM285 (IBM285)
IBM290 (IBM290)
IBM297 (IBM297)
IBM367 (IBM367)
IBM420 (IBM420)
IBM424 (IBM424)
IBM500 (IBM500)
ibm-803 (ibm-803)
IBM-Thai (IBM-Thai)
ibm-867 (ibm-867)
IBM870 (IBM870)
IBM871 (IBM871)
ibm-901 (ibm-901)
ibm-902 (ibm-902)
IBM918 (IBM918)
ibm-971 (ibm-971)
IBM1026 (IBM1026)
ibm-1129 (ibm-1129)
IBM1047 (IBM1047)
ibm-1130 (ibm-1130)
ibm-1132 (ibm-1132)
ibm-1133 (ibm-1133)
ibm-1137 (ibm-1137)
IBM01140 (IBM01140)
IBM01141 (IBM01141)
IBM01142 (IBM01142)
IBM01143 (IBM01143)
IBM01144 (IBM01144)
IBM01145 (IBM01145)
IBM01146 (IBM01146)
IBM01147 (IBM01147)
IBM01148 (IBM01148)
IBM01149 (IBM01149)
ibm-1153 (ibm-1153)
ibm-1154 (ibm-1154)
ibm-1155 (ibm-1155)
ibm-1156 (ibm-1156)
ibm-1157 (ibm-1157)
ibm-1158 (ibm-1158)
ibm-1160 (ibm-1160)
ibm-1162 (ibm-1162)
ibm-1164 (ibm-1164)
ibm-1364 (ibm-1364)
ibm-1371 (ibm-1371)
ibm-1388 (ibm-1388)
ibm-1390 (ibm-1390)
ibm-1399 (ibm-1399)
ibm-4899 (ibm-4899)
ibm-4971 (ibm-4971)
ibm-4909 (ibm-4909)
ibm-5123 (ibm-5123)
ibm-8482 (ibm-8482)
ibm-16684 (ibm-16684)
.
Значение по умолчанию: UTF8.
Описание:
Устанавливает поток для чтения JSON данным объектом. Если перед вызовом данного метода уже выполнялось чтение данных JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного потока.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.10.
Методическая информация
Практические примеры
Записать и прочитать собственный JSON через ПотокВПамяти
Получаем настоящий UTF-8 поток, перемещаем его позицию к началу и читаем то же сообщение обратно. Сравниваем все поля, затем получаем байты и текст для просмотра без файла и сети.
Где и как запускать
Полный серверный общий модуль УчебныйJSON своего пустого файлового стенда УчебныйJSONВводВывод85 и отдельный полный модуль формы. В1С не запускался.
Подготовка
НОВАЯ пустая отдельная учебная файловая база на собственном Windows-компьютере; точная платформа8.5.1.1343. Имя конфигурации УчебныйJSONВводВывод85, совместимость Не использовать, язык Русский. Нет бизнес-метаданных, расширений, подписок и заданий. Все модули пусты, кроме своего учебного модуля. Рабочие базы не используются.
Конфигуратор → Общие модули → УчебныйJSON: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной код только выбранного урока. У разных уроков одинаковые имена процедур: не склеивайте их в одном модуле.
Собственная внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма: команда Выполнить, действие Выполнить, связанная с ней кнопка; реквизиты не нужны. Весь отдельный модуль формы приведён ниже. Будущая ручная подготовка: сохранить конфигурацию, обновить конфигурацию базы (F7), открыть новый собственный тонкий клиент и свою обработку.
Четыре поля пакета создаются самим кодом: sku=BOOK85, title содержит кириллицу, двойные кавычки и перевод строки, quantity — Число3, enabled — БулевоИстина. Имена ключей пригодны для Структура. Это учебный контракт, не контракт Avito или другого сервиса.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Поток = Новый ПотокВПамяти;
Запись = Новый ЗаписьJSON;
Чтение = Новый ЧтениеJSON;
ЗаписьОткрыта = Ложь;
ЧтениеОткрыто = Ложь;
Ошибка = "";
Попытка
ЗаписьОткрыта = Истина;
Запись.ОткрытьПоток(Поток, "UTF-8", Ложь);
ЗаписатьJSON(Запись, СвойПакетJSON());
Запись.Закрыть();
ЗаписьОткрыта = Ложь;
Если Не Поток.ДоступноЧтение Или Не Поток.ДоступноИзменениеПозиции Тогда
ВызватьИсключение "Свой поток должен оставаться доступным для обратного чтения";
КонецЕсли;
Если Поток.Размер() <= 0 Тогда
ВызватьИсключение "Не получены байты собственного JSON";
КонецЕсли;
Если Поток.Перейти(0, ПозицияВПотоке.Начало) <> 0 Тогда
ВызватьИсключение "JSON-читатель должен начинать с первого байта, не с конца записи";
КонецЕсли;
ЧтениеОткрыто = Истина;
Чтение.ОткрытьПоток(Поток, "UTF-8");
Пакет = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();
ЧтениеОткрыто = Ложь;
ПроверитьСвойПакетJSON(Пакет);
Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Или Данные.Размер() <= 0 Тогда
ВызватьИсключение "Нужны реальные непустые байты собственного сообщения";
КонецЕсли;
Текст = ПолучитьСтрокуИзДвоичныхДанных(Данные, КодировкаТекста.UTF8);
ЧтениеОткрыто = Истина;
Чтение.УстановитьСтроку(Текст);
ИзТекста = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();
ЧтениеОткрыто = Ложь;
ПроверитьСвойПакетJSON(ИзТекста);
Исключение
Ошибка = ОписаниеОшибки();
КонецПопытки;
ЗакрытьСвойЧитательJSON(Чтение, ЧтениеОткрыто, Ошибка);
ЗакрытьСвойПисательJSON(Запись, ЗаписьОткрыта, Ошибка);
Попытка
Поток.Закрыть();
Исключение
Ошибка = Ошибка + Символ(10) + "Закрытие собственного потока: " + ОписаниеОшибки();
КонецПопытки;
Если Ошибка <> "" Тогда
ВызватьИсключение Ошибка;
КонецЕсли;
Сообщить(Текст);
Сообщить("Два обратных чтения собственного JSON проверены; все ресурсы закрыты");
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 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.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
ПотокВПамяти создаётся пустым самим кодом. ЗаписьJSON.ОткрытьПоток получает объект потока, строковое имя кодировки UTF-8 и явное Ложь для BOM. Это не путь к файлу и не УстановитьСтроку.
ЗаписатьJSON сериализует собственную Структура в подготовленный поток. Сначала завершаем JSON-писатель; возвращаемое значение его Закрыть не выдаём за строку JSON, потому что получателем был поток.
Читаемость, возможность перемещения и непустой размер проверяются. Перейти(0,ПозицияВПотоке.Начало) должен вернуть0: без перехода reader окажется в конце записанных байтов.
ЧтениеJSON.ОткрытьПоток получает тот же поток и явную UTF-8. ПрочитатьJSON(...,Ложь) создаёт Структура. Все четыре поля проверяются по известному эталону с точными типами.
После закрытия JSON-reader ЗакрытьИПолучитьДвоичныеДанные отдаёт реальные байты и завершает собственный поток. Для просмотра переводим их в текст с КодировкаТекста.UTF8 и ещё раз разбираем этот текст, не принимая красивый вывод за доказательство сохранности данных.
На любом ошибочном пути отдельно пробуем закрыть reader, writer и собственный поток. Закрыть потока допускает повторный вызов; после ЗакрытьИПолучитьДвоичныеДанные другие рабочие методы потока не вызываются.
Как проверить результат
Будущий результат: оба обратных чтения имеют четыре правильных поля, quantity — число3, enabled — булевоИстина; кавычки, кириллица и перевод строки title восстановлены полностью. Выводится текст JSON и итог успеха.
Будущий отрицательный контроль: сразу после Пакет = ПрочитатьJSON(Чтение,Ложь); добавьте Пакет.quantity = "3";. Проверка должна отклонить пакет по типу, не сообщая успех. Верните исходный модуль после проверки.
Файл не создаётся, JSON никому не отправляется. Оба поточных метода доступны на сервере/тонком/толстом клиенте и внешнем соединении; этот урок исполнялся только в статических тестах Python, не в1С.
Ожидаемый результат
Своя Структура → реальный поток UTF-8 → проверенная Структура → байты → читаемый текст → повторно проверенная Структура.
На что обратить внимание
runtimeVerifiedScenarios=0: BSL, форма, файловые операции и сериализация в1С здесь не запускались. Проверены источники и статические контракты, а не поведение будущего клиента.
JSON не сохраняет произвольные прикладные типы автоматически. Здесь только четыре скалярных значения; ссылки, даты, двоичные вложения и функции восстановления не добавляйте без отдельного контракта.
Проверка разбирает известные имена, типы и полные значения, а не порядок свойств или одинаковый текст форматирования. Число3 и строка "3" для этого пакета различны.
Закрытие reader и writer выполняется независимо. Исходная ошибка не теряется при ошибке освобождения второго ресурса. Сообщение об успехе появляется только после всех проверок и закрытия.
ОткрытьПоток не имеет параметра ЗакрыватьПоток или LeaveOpen: не добавляйте несуществующий аргумент. Жизненный цикл собственного потока обрабатывается отдельно, доступность проверяется до перехода; фактическое поведение освобождения в1С здесь не подтверждено.
В памяти находится весь маленький учебный пакет. Название поточного API не означает ограниченный расход памяти при ПрочитатьJSON, который создаёт целый объект. Для больших внешних сообщений нужны отдельные лимиты и алгоритм.
Переданный writer параметр Кодировка — Строка; для перевода двоичных данных в текст используется настоящий enum КодировкаТекста.UTF8. Не подменяйте эти два контракта одним догаданным аргументом.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.