К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как преобразовать строку в JSON в 1С

Как преобразовать строку в JSON в 1С: объекты ПрочитатьJSON и ЗаписатьJSON, работа с массивами и датами, типичные ошибки парсинга, проверка результата.

Задача преобразования строки в JSON возникает в 1С постоянно: при обмене с сайтом, интеграции с REST API, чтении ответов банковских сервисов и обработке файлов настроек. Во встроенном языке для этого есть штатные объекты ЧтениеJSON, ЗаписьJSON и глобальные функции ПрочитатьJSON / ЗаписатьJSON, поэтому сторонние библиотеки обычно не нужны.

Важно сразу разделить два направления работы. «Преобразовать строку в JSON» чаще всего означает одно из двух: либо распарсить готовую JSON-строку в структуру данных 1С (чтение), либо наоборот — сериализовать значение 1С в строку формата JSON (запись). Ниже разобраны оба сценария с готовым кодом, проверкой результата и разбором ошибок.

Механизмы доступны в тонком, толстом и веб-клиенте, а также на сервере, начиная с версий платформы 8.3.6 и выше. В более старых релизах штатных средств нет, и приходится использовать COM-объекты или внешние компоненты — это отдельный случай, который тоже кратко рассмотрен.

Чтение JSON-строки через ЧтениеJSON и ПрочитатьJSON

Основной способ распарсить строку — создать объект ЧтениеJSON, установить в него строку методом УстановитьСтроку() и вызвать глобальную функцию ПрочитатьJSON(). По умолчанию результат возвращается в виде Соответствие, где ключи — строки, а значения — примитивы, массивы или вложенные соответствия.

СтрокаJSON = "{""Номенклатура"":""Товар 1"",""Цена"":150.5,""Активен"":true}";

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(СтрокаJSON);

Данные = ПрочитатьJSON(Чтение); // Соответствие

Чтение.Закрыть();

Цена = Данные["Цена"]; // 150.5

Если вторым параметром ПрочитатьJSON передать Истина, результат будет представлен в виде Структура. Это удобнее для обращения через точку (Данные.Цена), но накладывает ограничение: имена свойств JSON должны быть допустимыми идентификаторами 1С. Ключи с дефисами, пробелами или начинающиеся с цифры при таком режиме вызовут ошибку.

Массивы JSON преобразуются в Массив 1С, значение null — в Неопределено, логические true/false — в Истина/Ложь, числа — в Число. Строки остаются строками, даже если внутри лежит дата в формате ISO — про обработку дат ниже.

Запись значения 1С в строку JSON

Обратная задача — сформировать JSON-строку из данных 1С — решается объектом ЗаписьJSON и функцией ЗаписатьJSON. Для простых типов (структуры, соответствия, массивы, примитивы) сериализация выполняется автоматически.

Данные = Новый Структура;

Данные.Вставить("Номенклатура", "Товар 1");

Данные.Вставить("Цена", 150.5);

Данные.Вставить("Активен", Истина);

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

ЗаписатьJSON(Запись, Данные);

СтрокаJSON = Запись.Закрыть();

// {"Номенклатура":"Товар 1","Цена":150.5,"Активен":true}

Если нужно сериализовать ссылочный объект (например, элемент справочника) или значение, которое не сериализуется напрямую, используйте СериализаторXDTO совместно с ЗаписьJSON, либо предварительно сформируйте структуру с нужными полями вручную. Ручная сборка структуры — самый управляемый вариант: вы явно решаете, какие поля и в каком виде уйдут наружу.

Последовательный (потоковый) разбор больших JSON

Когда JSON-файл велик — десятки и сотни мегабайт от выгрузки сайта или кассовой системы — загружать его целиком в память через ПрочитатьJSON нерационально. Объект ЧтениеJSON поддерживает последовательное чтение: метод Прочитать() перемещается по узлам, а свойство ТипТекущегоЗначения сообщает, что именно встретилось — начало объекта, имя свойства, значение или конец массива.

Чтение = Новый ЧтениеJSON;

Чтение.ОткрытьФайл("C:\Обмен\catalog.json");

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда

ИмяПоля = Чтение.ТекущееЗначение;

КонецЕсли;

КонецЦикла;

Чтение.Закрыть();

Потоковый подход требует больше кода, но позволяет обрабатывать файл порциями и пропускать ненужные ветки. Признак того, что он нужен: при чтении целиком растёт потребление памяти сервера или клиента и обработка занимает неприемлемое время.

Маршрут решения

Как выбрать способ разбора

JSON небольшой, структура известна заранееИспользуйте ПрочитатьJSON — один вызов, результат в Соответствие или Структуру
Ключи JSON содержат дефисы, пробелы или начинаются с цифрыТолько режим Соответствие (без второго параметра Истина)
Файл большой, память ограниченаПоследовательное чтение через ЧтениеJSON.Прочитать() в цикле
Нужно восстановить типы 1С (ссылки, даты) автоматическиПрочитатьJSON с параметрами восстановления или СериализаторXDTO

Обработка дат и нестандартных типов

Даты — самая частая ловушка. В стандарте JSON типа «дата» нет, поэтому внешние системы передают её строкой: «2026-05-17T10:30:00», «2026-05-17T10:30:00+03:00» или числом-секундами Unix. После ПрочитатьJSON это остаётся строкой, и сравнение или запись в реквизит типа Дата даст ошибку либо неверный результат.

Надёжный вариант — преобразовывать строки в даты вручную после парсинга. Для формата ISO 8601 в новых версиях платформы доступна функция ПрочитатьДатуJSON через объект чтения либо используйте Дата() с разбором компонентов. Для Unix-времени: Дата = Дата(1970,1,1) + UnixСекунды с поправкой на часовой пояс.

Ещё одна особенность: числа с плавающей точкой могут терять точность при неаккуратных промежуточных преобразованиях, а очень длинные целые (идентификаторы из внешних систем, 18–19 знаков) безопаснее хранить как строки, чтобы не получить округление.

Типичные ошибки
01
Чтение в Структуру при ключах с дефисами — ошибка выполнения; используйте Соответствие
02
Сравнение строки-даты с датой без преобразования — неверные отборы и пустые результаты запросов
03
Обращение к отсутствующему ключу Соответствия без проверки — получаете Неопределено и ошибку дальше по коду
04
Экранирование кавычек вручную при сборке JSON конкатенацией — ломается на первом же значении с кавычкой или переносом строки
05
Чтение большого файла целиком в память — зависание клиента или падение сервера по памяти

Проверка результата и обработка ошибок парсинга

Строка, пришедшая извне, не гарантированно является валидным JSON. Оберните разбор в попытку/исключение и проверяйте наличие ожидаемых ключей перед использованием значений. Для Соответствия проверка выполняется через Данные.Получить("Ключ") <> Неопределено, для Структуры — через Данные.Свойство("Ключ", Значение).

Попытка

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(ОтветСервера);

Данные = ПрочитатьJSON(Чтение);

Чтение.Закрыть();

Исключение

ЗаписьЖурналаРегистрации("Обмен", УровеньЖурналаРегистрации.Ошибка,,,

ОписаниеОшибки());

ВызватьИсключение "Ответ сервиса не является корректным JSON";

КонецПопытки;

Полезно логировать исходную строку (или её начало) при ошибке — без этого восстановить, что именно прислал внешний сервис, бывает невозможно. В журнале регистрации сохраняйте хотя бы первые несколько сотен символов ответа и код HTTP-статуса, если данные пришли по HTTP.

Контрольные точки

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

Тип результата ПрочитатьJSON
Норма

Соответствие/Структура с ожидаемыми ключами

Тревожный признак

Неопределено или исключение при чтении

Значения дат после разбора
Норма

Тип Дата, корректное значение с учётом часового пояса

Тревожный признак

Строка вида 2026-05-17T10:30:00 вместо даты

Числа и идентификаторы
Норма

Числа без округления, длинные ID сохранены как строки

Тревожный признак

ID внешней системы округлён, копейки «поплыли»

Сформированная JSON-строка
Норма

Парсится обратно без ошибок, кавычки экранированы

Тревожный признак

Сломанный JSON при значениях с кавычками или переносами

Ограничения и альтернативные подходы

Штатные ЧтениеJSON/ЗаписьJSON доступны с платформы 8.3.6. На более старых версиях применяют разбор через COMОбъект("MSScriptControl.ScriptControl") с JScript, внешние компоненты или ручной парсер — все эти варианты медленнее, хуже сопровождаются и требуют особой осторожности с безопасностью (ScriptControl фактически выполняет код). По возможности переносите обмен на актуальную платформу.

Для обмена между двумя базами 1С, где нужно передать ссылки и сложные типы без потерь, JSON не всегда лучший выбор: механизмы XDTO, ЗначениеВСтрокуВнутр или планы обмена сохраняют типы платформы автоматически. JSON оправдан там, где второй стороной является внешняя система — сайт, мобильное приложение, банк, маркетплейс.

При формировании JSON никогда не собирайте строку конкатенацией вручную — используйте ЗаписьJSON. Ручная сборка гарантированно ломается на значениях с кавычками, обратными слешами, переносами строк и спецсимволами, а найти такую ошибку в реальном обмене бывает очень трудно.

Частые вопросы

Чем отличается ПрочитатьJSON от последовательного чтения через ЧтениеJSON.Прочитать()?

ПрочитатьJSON загружает весь документ в память и возвращает готовое Соответствие или Структуру — это удобно для небольших ответов. Последовательное чтение идёт по узлам по одному и подходит для больших файлов, но требует писать логику обхода вручную.

Почему ПрочитатьJSON с параметром Истина выдаёт ошибку на моём JSON?

Параметр Истина включает режим Структуры, где имена ключей должны быть допустимыми идентификаторами 1С. Ключи с дефисами, пробелами, кириллицей в смешанном написании или начинающиеся с цифры несовместимы с этим режимом — уберите параметр и работайте через Соответствие.

Как преобразовать дату из JSON в дату 1С?

JSON не имеет типа «дата», поэтому значение приходит строкой (обычно ISO 8601) или числом Unix-времени. Для ISO-строки используйте штатные средства разбора даты платформы или самостоятельный разбор компонентов; для Unix-времени — Дата(1970,1,1) плюс количество секунд с учётом часового пояса.

Что делать со значением null в JSON?

После ПрочитатьJSON значение null превращается в Неопределено. Перед использованием проверяйте ключ на Неопределено, особенно для числовых полей и вложенных объектов — обращение к свойству Неопределено вызовет ошибку выполнения.

Можно ли сериализовать в JSON элемент справочника напрямую?

Напрямую ЗаписатьJSON ссылочные объекты не сериализует осмысленно. Либо сформируйте Структуру с нужными полями вручную, либо используйте СериализаторXDTO совместно с ЗаписьJSON, если нужен формат, совместимый с механизмами XDTO платформы.

Как обработать очень большой JSON-файл без зависания?

Откройте файл через ЧтениеJSON.ОткрытьФайл() и читайте последовательно в цикле Пока Чтение.Прочитать(). Обрабатывайте записи порциями, сбрасывая промежуточные данные, и не накапливайте весь результат в памяти.

Итог

Что важно запомнить

Чтение строки JSON — ЧтениеJSON плюс ПрочитатьJSON (Соответствие по умолчанию, Структура с ограничениями на ключи). Формирование — ЗаписьJSON и ЗаписатьJSON, никогда не конкатенацией. Даты и null требуют отдельной обработки, большие файлы — потокового чтения, любой внешний ответ — попытки/исключения и логирования.