ЧтениеJSON.ОткрытьФайл

Методы · OpenFile

Открывает JSON-файл для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного файла.

Синтаксис

ОткрытьФайл(<ИмяФайла>, <Кодировка>)

Примеры платформы

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("c:/docs/data.json");
Полное описание, параметры и ограничения

ЧтениеJSON.ОткрытьФайл (JSONReader.OpenFile)

ЧтениеJSON (JSONReader)

ОткрытьФайл (OpenFile)

Доступен, начиная с версии 8.3.6.

Синтаксис:
ОткрытьФайл(<ИмяФайла>, <Кодировка>)
Параметры:

<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, содержащего текст JSON.

<Кодировка> (необязательный)
Тип: Строка, КодировкаТекста.
Позволяет задать кодировку входного файла.
Следует указывать для файлов в кодировках:
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)

Значение по умолчанию: UTF-8.
Описание:

Открывает JSON-файл для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного файла.

Доступность:

Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Пример:

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("c:/docs/data.json");

Использование в версии:

Доступен, начиная с версии 8.3.6.

Методическая информация

Практические примеры

Записать JSON в новый собственный файл и прочитать его обратно

На своём отдельном файловом стенде записываем UTF-8 JSON с новым UUID-именем только в заранее подготовленный собственный каталог. Читаем тот же созданный файл и сверяем все четыре поля; чужие файлы не открываются и ничего не удаляется.

Где и как запускать

Полный серверный общий модуль УчебныйJSON своего пустого файлового стенда УчебныйJSONВводВывод85 и отдельный полный модуль формы. В1С не запускался.

Подготовка

  1. НОВАЯ пустая отдельная учебная файловая база на собственном Windows-компьютере; точная платформа8.5.1.1343. Имя конфигурации УчебныйJSONВводВывод85, совместимость Не использовать, язык Русский. Нет бизнес-метаданных, расширений, подписок и заданий. Все модули пусты, кроме своего учебного модуля. Рабочие базы не используются.

  2. Конфигуратор → Общие модули → УчебныйJSON: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной код только выбранного урока. У разных уроков одинаковые имена процедур: не склеивайте их в одном модуле.

  3. Собственная внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма: команда Выполнить, действие Выполнить, связанная с ней кнопка; реквизиты не нужны. Весь отдельный модуль формы приведён ниже. Будущая ручная подготовка: сохранить конфигурацию, обновить конфигурацию базы (F7), открыть новый собственный тонкий клиент и свою обработку.

  4. Четыре поля пакета создаются самим кодом: sku=BOOK85, title содержит кириллицу, двойные кавычки и перевод строки, quantity — Число3, enabled — БулевоИстина. Имена ключей пригодны для Структура. Это учебный контракт, не контракт Avito или другого сервиса.

  5. ТОЛЬКО для этого файлового урока заранее вручную создайте новый собственный пустой каталог C:\1CStudy\owned-json85-6aad04c9-07f6-4540-b4ce-1e8931e2c05b. Он принадлежит только вашему учебному стенду, не является ссылкой/junction, и никто параллельно в него не пишет. Этот урок при будущем ручном запуске создаёт файл именно там; подготовка не выполнялась агентом.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Каталог = "C:\1CStudy\owned-json85-6aad04c9-07f6-4540-b4ce-1e8931e2c05b";
    СвойКаталог = Новый Файл(Каталог);
    Если Не СвойКаталог.Существует() Тогда
        ВызватьИсключение "Сначала вручную подготовьте только свой каталог учебного стенда";
    КонецЕсли;
    Если Не СвойКаталог.ЭтоКаталог() Тогда
        ВызватьИсключение "Собственный путь должен указывать на существующий каталог";
    КонецЕсли;
    Имя = Каталог + "\packet-" + Строка(Новый УникальныйИдентификатор) + ".json";
    СвойФайл = Новый Файл(Имя);
    Если СвойФайл.Существует() Тогда
        ВызватьИсключение "Существующий файл не перезаписываем";
    КонецЕсли;
    Запись = Новый ЗаписьJSON;
    Чтение = Новый ЧтениеJSON;
    ЗаписьОткрыта = Ложь;
    ЧтениеОткрыто = Ложь;
    Ошибка = "";
    Попытка
        ЗаписьОткрыта = Истина;
        Запись.ОткрытьФайл(Имя, "UTF-8", Ложь);
        ЗаписатьJSON(Запись, СвойПакетJSON());
        Запись.Закрыть();
        ЗаписьОткрыта = Ложь;
        Если Не СвойФайл.Существует() Тогда
            ВызватьИсключение "Не появился только что созданный собственный JSON-файл";
        КонецЕсли;
        Если Не СвойФайл.ЭтоФайл() Тогда
            ВызватьИсключение "Собственный результат должен быть файлом, не каталогом";
        КонецЕсли;
        ЧтениеОткрыто = Истина;
        Чтение.ОткрытьФайл(Имя, "UTF-8");
        Пакет = ПрочитатьJSON(Чтение, Ложь);
        Чтение.Закрыть();
        ЧтениеОткрыто = Ложь;
        ПроверитьСвойПакетJSON(Пакет);
    Исключение
        Ошибка = ОписаниеОшибки();
    КонецПопытки;
    ЗакрытьСвойЧитательJSON(Чтение, ЧтениеОткрыто, Ошибка);
    ЗакрытьСвойПисательJSON(Запись, ЗаписьОткрыта, Ошибка);
    Если Ошибка <> "" Тогда
        ВызватьИсключение "Свой результат или частичный файл оставлен по пути " + Имя + Символ(10) + Ошибка;
    КонецЕсли;
    Сообщить("Свой новый файл проверен и оставлен для просмотра: " + Имя);
    Сообщить("quantity — число3, enabled — булевоИстина; файлы не удалялись");
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 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.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. Сначала проверяется точная пустая учебная конфигурация и подготовленный собственный каталог. ЭтоКаталог применяем только после подтверждённого Существует: в справке метод применим к реально существующим объектам.

  2. Новое имя packet-UUID.json строится внутри строго указанного собственного каталога. Код не получает имя из пользовательского/сетевого ввода и отказывается использовать уже существующий файл.

  3. ЗаписьJSON.ОткрытьФайл получает путь, строку UTF-8 и Ложь для BOM. ЗаписатьJSON пишет четыре свои поля; writer закрывается до проверки существования и обратного чтения.

  4. ЧтениеJSON.ОткрытьФайл получает ТО ЖЕ Имя, которое только что создал этот запуск. Чтение идёт на стороне собственного файлового стенда, не на произвольно выбранном компьютере клиента/кластера.

  5. ПрочитатьJSON(...,Ложь) создаёт Структура; reader закрывается, затем сравниваются все четыре поля и типы. При ошибках writer и reader закрываются независимо, сообщается полный собственный путь.

  6. Успешный файл намеренно остаётся для ручного просмотра в текстовом редакторе. Частичный файл при сбое тоже не удаляется автоматически и не объявляется корректным.

Как проверить результат

  1. Будущий результат: в своём каталоге появляется один новый packet-UUID.json. Только после полного обратного разбора и проверки выводится его путь и сообщение успеха.

  2. Будущий отрицательный контроль без записи: переименуйте вручную свой учебный каталог. Код должен остановиться на проверке его отсутствия ещё до ОткрытьФайл. Верните название после опыта.

  3. Будущий отрицательный контроль типов: сразу после Пакет = ПрочитатьJSON(Чтение,Ложь); добавьте Пакет.quantity = "3";. Собственный файл остаётся для просмотра, но успех не выводится. Верните исходный модуль.

  4. Здесь учебный каталог не создавался, файлы не записывались/читались через1С, данные не удалялись. Эффект описан для будущего ручного запуска только в собственном стенде.

Ожидаемый результат

Будущий новый собственный файл содержит настоящий JSON; обратное чтение доказывает сохранность полей по заданному учебному контракту.

На что обратить внимание

  1. runtimeVerifiedScenarios=0: BSL, форма, файловые операции и сериализация в1С здесь не запускались. Проверены источники и статические контракты, а не поведение будущего клиента.

  2. JSON не сохраняет произвольные прикладные типы автоматически. Здесь только четыре скалярных значения; ссылки, даты, двоичные вложения и функции восстановления не добавляйте без отдельного контракта.

  3. Проверка разбирает известные имена, типы и полные значения, а не порядок свойств или одинаковый текст форматирования. Число3 и строка "3" для этого пакета различны.

  4. Закрытие reader и writer выполняется независимо. Исходная ошибка не теряется при ошибке освобождения второго ресурса. Сообщение об успехе появляется только после всех проверок и закрытия.

  5. ОткрытьФайл writer может перезаписать существующий путь. UUID и предварительный Существует уменьшают риск на изолированном собственном стенде, но НЕ являются атомарным режимом create-new и не защищают от конкурентной подмены. Не используйте урок как production-алгоритм безопасной записи.

  6. Каталог должен быть новым, личным, без junction/symlink и без процессов, которые подменяют файлы. Не заменяйте его общей папкой, каталогом платформы/проекта/конфигурации, рабочей базой или системным Temp.

  7. Урок рассчитан на собственную локальную файловую базу Windows. В клиент-серверном варианте серверный код обращается к файловой системе сервера и правам его службы; такой вариант здесь не предлагается.

  8. Транзакция базы не откатывает запись JSON-файла. При сбое останется частичный собственный результат; перечитывать его как успешный нельзя. Автоматического удаления, перезаписи, повторной попытки или запуска внешнего редактора в коде нет.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.