Открывает файл для записи JSON. Позволяет указать тип кодировки, который будет использован для записи файла JSON, а также использование BOM.
Синтаксис
ОткрытьФайл(<ИмяФайла>, <Кодировка>, <ДобавлятьBOM>, <Параметры>)Полное описание, параметры и ограничения
ЗаписьJSON.ОткрытьФайл (JSONWriter.OpenFile)
ЗаписьJSON (JSONWriter)
ОткрытьФайл (OpenFile)
Доступен, начиная с версии 8.3.6.
Синтаксис:
ОткрытьФайл(<ИмяФайла>, <Кодировка>, <ДобавлятьBOM>, <Параметры>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, в который будет записываться текст JSON.
<Кодировка> (необязательный)
Тип: Строка.
В качестве типа кодировки может быть указана одна из возможных кодировок текста. В этом случае файл будет записан в соответствующей кодировке. Если же в качестве параметра указана пустая строка или ничего не указано, то для записи файла будет использована кодировка UTF8.
Поддерживаемые коды кодировок:
UTF-8
UTF-16
UTF-16BE
UTF-16LE
ISO-8859-1
US-ASCII
gb18030
iso-8859-2
iso-8859-3
iso-8859-4
iso-8859-5
iso-8859-6
iso-8859-7
iso-8859-8
iso-8859-9
iso-8859-13
iso-8859-15
Shift_JIS
EUC-JP
Big5
Big5-HKSCS
GBK
GB2312
GB_2312-80
EUC-KR
KSC_5601
windows-949
windows-874
cp866
KOI8-R
KOI8-U
windows-1250
windows-1251
windows-1252
windows-1253
windows-1254
windows-1255
windows-1256
windows-1257
windows-1258
macintosh
x-mac-cyrillic
ISO-2022-JP
ISO-2022-KR
ISO-2022-CN
ISO-2022-CN-EXT
HZ-GB-2312
Значение по умолчанию: UTF8.
<ДобавлятьBOM> (необязательный)
Тип: Булево.
Определяет, будет ли добавлен маркер порядка байт (BOM) к результирующему файлу JSON.
Внимание. Стандарт RFC7159 настоятельно рекомендует не добавлять маркер порядка байт (BOM) к документу JSON .
Значение по умолчанию: Ложь.
<Параметры> (необязательный)
Тип: ПараметрыЗаписиJSON.
Параметры, используемые при открытии файла для настройки записи в формате JSON.
Описание:
Открывает файл для записи JSON. Позволяет указать тип кодировки, который будет использован для записи файла JSON, а также использование BOM.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.3.6.
Методическая информация
Практические примеры
Записать JSON в новый собственный файл и прочитать его обратно
На своём отдельном файловом стенде записываем UTF-8 JSON с новым UUID-именем только в заранее подготовленный собственный каталог. Читаем тот же созданный файл и сверяем все четыре поля; чужие файлы не открываются и ничего не удаляется.
Где и как запускать
Полный серверный общий модуль УчебныйJSON своего пустого файлового стенда УчебныйJSONВводВывод85 и отдельный полный модуль формы. В1С не запускался.
Подготовка
НОВАЯ пустая отдельная учебная файловая база на собственном Windows-компьютере; точная платформа8.5.1.1343. Имя конфигурации УчебныйJSONВводВывод85, совместимость Не использовать, язык Русский. Нет бизнес-метаданных, расширений, подписок и заданий. Все модули пусты, кроме своего учебного модуля. Рабочие базы не используются.
Конфигуратор → Общие модули → УчебныйJSON: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной код только выбранного урока. У разных уроков одинаковые имена процедур: не склеивайте их в одном модуле.
Собственная внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма: команда Выполнить, действие Выполнить, связанная с ней кнопка; реквизиты не нужны. Весь отдельный модуль формы приведён ниже. Будущая ручная подготовка: сохранить конфигурацию, обновить конфигурацию базы (F7), открыть новый собственный тонкий клиент и свою обработку.
Четыре поля пакета создаются самим кодом: sku=BOOK85, title содержит кириллицу, двойные кавычки и перевод строки, quantity — Число3, enabled — БулевоИстина. Имена ключей пригодны для Структура. Это учебный контракт, не контракт Avito или другого сервиса.
ТОЛЬКО для этого файлового урока заранее вручную создайте новый собственный пустой каталог 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.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Сначала проверяется точная пустая учебная конфигурация и подготовленный собственный каталог. ЭтоКаталог применяем только после подтверждённого Существует: в справке метод применим к реально существующим объектам.
Новое имя packet-UUID.json строится внутри строго указанного собственного каталога. Код не получает имя из пользовательского/сетевого ввода и отказывается использовать уже существующий файл.
ЗаписьJSON.ОткрытьФайл получает путь, строку UTF-8 и Ложь для BOM. ЗаписатьJSON пишет четыре свои поля; writer закрывается до проверки существования и обратного чтения.
ЧтениеJSON.ОткрытьФайл получает ТО ЖЕ Имя, которое только что создал этот запуск. Чтение идёт на стороне собственного файлового стенда, не на произвольно выбранном компьютере клиента/кластера.
ПрочитатьJSON(...,Ложь) создаёт Структура; reader закрывается, затем сравниваются все четыре поля и типы. При ошибках writer и reader закрываются независимо, сообщается полный собственный путь.
Успешный файл намеренно остаётся для ручного просмотра в текстовом редакторе. Частичный файл при сбое тоже не удаляется автоматически и не объявляется корректным.
Как проверить результат
Будущий результат: в своём каталоге появляется один новый packet-UUID.json. Только после полного обратного разбора и проверки выводится его путь и сообщение успеха.
Будущий отрицательный контроль без записи: переименуйте вручную свой учебный каталог. Код должен остановиться на проверке его отсутствия ещё до ОткрытьФайл. Верните название после опыта.
Будущий отрицательный контроль типов: сразу после Пакет = ПрочитатьJSON(Чтение,Ложь); добавьте Пакет.quantity = "3";. Собственный файл остаётся для просмотра, но успех не выводится. Верните исходный модуль.
Здесь учебный каталог не создавался, файлы не записывались/читались через1С, данные не удалялись. Эффект описан для будущего ручного запуска только в собственном стенде.
Ожидаемый результат
Будущий новый собственный файл содержит настоящий JSON; обратное чтение доказывает сохранность полей по заданному учебному контракту.
На что обратить внимание
runtimeVerifiedScenarios=0: BSL, форма, файловые операции и сериализация в1С здесь не запускались. Проверены источники и статические контракты, а не поведение будущего клиента.
JSON не сохраняет произвольные прикладные типы автоматически. Здесь только четыре скалярных значения; ссылки, даты, двоичные вложения и функции восстановления не добавляйте без отдельного контракта.
Проверка разбирает известные имена, типы и полные значения, а не порядок свойств или одинаковый текст форматирования. Число3 и строка "3" для этого пакета различны.
Закрытие reader и writer выполняется независимо. Исходная ошибка не теряется при ошибке освобождения второго ресурса. Сообщение об успехе появляется только после всех проверок и закрытия.
ОткрытьФайл writer может перезаписать существующий путь. UUID и предварительный Существует уменьшают риск на изолированном собственном стенде, но НЕ являются атомарным режимом create-new и не защищают от конкурентной подмены. Не используйте урок как production-алгоритм безопасной записи.
Каталог должен быть новым, личным, без junction/symlink и без процессов, которые подменяют файлы. Не заменяйте его общей папкой, каталогом платформы/проекта/конфигурации, рабочей базой или системным Temp.
Урок рассчитан на собственную локальную файловую базу Windows. В клиент-серверном варианте серверный код обращается к файловой системе сервера и правам его службы; такой вариант здесь не предлагается.
Транзакция базы не откатывает запись JSON-файла. При сбое останется частичный собственный результат; перечитывать его как успешный нельзя. Автоматического удаления, перезаписи, повторной попытки или запуска внешнего редактора в коде нет.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.