Разработка и Конфигурация · 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 типа «дата» нет, поэтому внешние системы передают её строкой: «2026-05-17T10:30:00», «2026-05-17T10:30:00+03:00» или числом-секундами Unix. После ПрочитатьJSON это остаётся строкой, и сравнение или запись в реквизит типа Дата даст ошибку либо неверный результат.
Надёжный вариант — преобразовывать строки в даты вручную после парсинга. Для формата ISO 8601 в новых версиях платформы доступна функция ПрочитатьДатуJSON через объект чтения либо используйте Дата() с разбором компонентов. Для Unix-времени: Дата = Дата(1970,1,1) + UnixСекунды с поправкой на часовой пояс.
Ещё одна особенность: числа с плавающей точкой могут терять точность при неаккуратных промежуточных преобразованиях, а очень длинные целые (идентификаторы из внешних систем, 18–19 знаков) безопаснее хранить как строки, чтобы не получить округление.
Проверка результата и обработка ошибок парсинга
Строка, пришедшая извне, не гарантированно является валидным JSON. Оберните разбор в попытку/исключение и проверяйте наличие ожидаемых ключей перед использованием значений. Для Соответствия проверка выполняется через Данные.Получить("Ключ") <> Неопределено, для Структуры — через Данные.Свойство("Ключ", Значение).
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ОтветСервера);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Исключение
ЗаписьЖурналаРегистрации("Обмен", УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
ВызватьИсключение "Ответ сервиса не является корректным JSON";
КонецПопытки;
Полезно логировать исходную строку (или её начало) при ошибке — без этого восстановить, что именно прислал внешний сервис, бывает невозможно. В журнале регистрации сохраняйте хотя бы первые несколько сотен символов ответа и код HTTP-статуса, если данные пришли по HTTP.
Как проверить результат
Соответствие/Структура с ожидаемыми ключами
Неопределено или исключение при чтении
Тип Дата, корректное значение с учётом часового пояса
Строка вида 2026-05-17T10:30:00 вместо даты
Числа без округления, длинные ID сохранены как строки
ID внешней системы округлён, копейки «поплыли»
Парсится обратно без ошибок, кавычки экранированы
Сломанный 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 требуют отдельной обработки, большие файлы — потокового чтения, любой внешний ответ — попытки/исключения и логирования.