Глобальный контекст.Символ

Методы · Char

Преобразует код символа в строку, содержащую символ.

Синтаксис

Символ(<КодСимвола>)

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

Буква_Я = Символ(1103);
Полное описание, параметры и ограничения

Глобальный контекст.Символ (Global context.Char)

Глобальный контекст (Global context)

Символ (Char)

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

Синтаксис:
Символ(<КодСимвола>)
Параметры:

<КодСимвола> (обязательный)
Тип: Число.
Код получаемого символа. Код задается в соответствии с кодировкой Unicode.
Возвращаемое значение:
Тип: Строка.
Результирующий символ.
Описание:

Преобразует код символа в строку, содержащую символ.

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

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

Внимание: Данный метод не поддерживается при работе через COM-соединение
Пример:

Буква_Я = Символ(1103);

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

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

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

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

Записать 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-файла. При сбое останется частичный собственный результат; перечитывать его как успешный нельзя. Автоматического удаления, перезаписи, повторной попытки или запуска внешнего редактора в коде нет.

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

Включить свой готовый JSON-фрагмент через ЗаписатьБезОбработки

Собственный сериализатор готовит один объект товара. Из двух таких готовых фрагментов строим полный batch-документ и проверяем каждый восстановленный объект. Показываем, что raw-запись не экранирует и не проверяет JSON.

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

Полный серверный общий модуль Учебный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 или другого сервиса.

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

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

  1. Первый writer сериализует свою Структура обычным ЗаписатьJSON. Полученный Фрагмент содержит экранированные кавычки и перевод строки; title не вставляется в разметку конкатенацией.

  2. Перед повторным использованием читаем собственный фрагмент и проверяем четыре поля. Только затем собираем целый документ из постоянной оболочки {"batch":[...,...]} и двух одинаковых проверенных объектов.

  3. Writer заново направляется в строку. ПроверятьСтруктуру включено до открытия; при raw-вызове оно всё равно не проверяет содержимое фрагмента — так прямо описывает установленная справка.

  4. Один ЗаписатьБезОбработки получает целый готовый документ. После него не вызываются отдельные ЗаписатьКонецОбъекта/Массива: эти скобки уже содержатся в собственном тексте, а обычные состояния writer нельзя угадывать после raw-вставки.

  5. Закрыть возвращает текст без дополнительного экранирования и кавычек вокруг документа. Проверяем точное сохранение своего текста, затем отдельно разбираем весь JSON и проверяем объект batch, тип Массив, количество2 и оба полных пакета.

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

  1. Будущий результат: batch — настоящий массив из двух одинаковых объектов, а не строка JSON. В обоих объектах quantity — число3 и полностью восстановлен title.

  2. Будущий отрицательный контроль: после построения ГотовыйДокумент замените его на ГотовыйДокумент = "{""batch"":[}";. Raw-операция не обеспечивает валидность; полный ПрочитатьJSON должен отклонить повреждённый документ. Ошибка не должна стать сообщением успеха. Верните исходный модуль.

  3. Нельзя считать включённое ПроверятьСтруктуру доказательством валидности raw-фрагмента. Проверка в уроке основана на собственном источнике, полном повторном разборе и проверке схемы.

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

Готовый свой фрагмент переиспользован дважды; содержимое проверено отдельным reader после raw-записи.

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

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

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

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

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

  5. ЗаписатьБезОбработки не является безопасным способом вставить пользовательский title, ответ сайта или непроверенную строку. Для обычных значений нужен ЗаписатьJSON/ЗаписатьЗначение; чужие фрагменты здесь не принимаются.

  6. Не обещаем проверку всех свойств JSON произвольного внешнего документа, обнаружение повторяющихся ключей или защиту от XSS. В уроке малый собственный JSON фиксированной схемы и без внешних данных.

  7. Конкатенация применяется только к собственной постоянной JSON-оболочке и уже сериализованному/проверенному фрагменту. Экранировать исходное название вручную не предлагается.

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

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

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

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

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