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

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

Как работать с JSON в 1С

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

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

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

Ниже разобраны оба подхода с примерами кода, сериализация объектов 1С, обмен по HTTP, контроль ошибок и типичные проблемы с типами данных, кодировкой и датами.

Какие средства работы с JSON есть в платформе 1С

Платформа предоставляет два уровня инструментов. Первый — низкоуровневые объекты ЧтениеJSON и ЗаписьJSON, которые работают последовательно: читают или пишут документ токен за токеном (начало объекта, имя свойства, значение, конец массива и так далее). Этот способ даёт полный контроль и экономит память на больших файлах.

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

Дополнительно существуют методы ПрочитатьJSONВЗначение и ЗаписатьJSONЗначение для сериализации сложных объектов (например, таблиц значений) с сохранением типов, но они ориентированы на внутренний обмен между базами 1С и не подходят для интеграции с внешними системами.

Чтение JSON в структуру или соответствие

Самый частый сценарий — получить строку JSON из файла или ответа веб-сервиса и разобрать её в объект 1С. Для этого создаётся объект ЧтениеJSON, ему передаётся строка или поток, после чего вызывается ПрочитатьJSON:

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

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

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

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

Артикул = Данные["items"][0]["sku"];

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

Если заранее известно, что в JSON есть поля с датами в формате ISO (например, "2026-05-17T10:30:00"), их можно автоматически преобразовать в тип Дата, перечислив имена свойств третьим параметром:

Данные = ПрочитатьJSON(Чтение, Истина, "dateCreated,dateModified");

Потоковое чтение больших JSON-документов

Когда файл занимает десятки или сотни мегабайт, загрузка его целиком в соответствие может исчерпать доступную память сервера или клиента. В этом случае используется последовательный обход через методы Прочитать() и ТипТекущегоЗначения:

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Сравнение подходов к чтению

ПрочитатьJSON целиком

Подходит для документов до нескольких мегабайт; код короткий, но весь документ загружается в память.

Потоковое чтение

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

ПрочитатьJSONВЗначение

Только для обмена между базами 1С с сохранением типов; внешние системы такой формат не поймут.

Запись и формирование JSON из 1С

Для формирования JSON используется объект ЗаписьJSON и функция ЗаписатьJSON. В простейшем случае сериализуется готовая структура или соответствие:

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

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

Данные.Вставить("date", Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd"));

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

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

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

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

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

Автоматически сериализуются строки, числа, булевы значения, структуры, соответствия, массивы и значение Неопределено (превращается в null). Даты и ссылочные типы напрямую не сериализуются — дату нужно заранее преобразовать в строку, а ссылку, например, в строковое представление уникального идентификатора через Строка(Ссылка.УникальныйИдентификатор()).

Для точного контроля над структурой результата (порядок полей, обёртки, массивы внутри массивов) применяется потоковая запись методами ЗаписатьНачалоОбъекта, ЗаписатьИмяСвойства, ЗаписатьЗначение, ЗаписатьНачалоМассива и парных им методов завершения.

Порядок формирования JSON-документа
  1. 1
    Соберите данные в структуру или соответствие, заранее преобразовав даты и ссылки в строки
  2. 2
    Создайте объект ЗаписьJSON и вызовите УстановитьСтроку() или ОткрытьФайл()
  3. 3
    Вызовите ЗаписатьJSON(Запись, Данные) или сформируйте документ потоковыми методами
  4. 4
    Вызовите Закрыть() и получите готовую строку или проверьте файл
  5. 5
    Проверьте результат любым онлайн-валидатором JSON или повторным чтением через ПрочитатьJSON

Обмен JSON с внешними веб-сервисами

Типовая интеграция выглядит так: 1С формирует JSON, отправляет его в теле HTTP-запроса и разбирает ответ. Используются объекты HTTPСоединение и HTTPЗапрос:

Соединение = Новый HTTPСоединение("api.example.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос("/v1/orders");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда

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

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

Результат = ПрочитатьJSON(Чтение, Истина);

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

КонецЕсли;

Обязательно проверяйте код состояния ответа до разбора тела: при ошибках 4xx и 5xx тело часто содержит HTML-страницу ошибки или JSON другой структуры, и попытка прочитать ожидаемые поля приведёт к непонятной ошибке в другом месте кода. Также явно указывайте кодировку UTF-8 при установке и чтении тела — кириллица без указания кодировки часто превращается в нечитаемые символы.

Типичные проблемы: даты, числа, null и кодировка

В JSON нет типа «дата», поэтому каждый сервис передаёт даты по-своему: строкой ISO 8601, числом Unix-времени или собственным форматом. Перед сравнением или записью в реквизит 1С преобразуйте значение явно. Для Unix-времени используется вычисление: Дата = Дата(1970,1,1,1,0,0) + ЗначениеИзJSON с учётом часового пояса.

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

Ещё один источник сбоев — BOM (сигнатура порядка байтов) в начале файла, сохранённого сторонними программами. Если ПрочитатьJSON падает с ошибкой на внешне корректном файле, проверьте первые байты и при необходимости прочитайте файл через ЧтениеТекста с явным указанием кодировки.

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

Проверка результата и отладка

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

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

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

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

Структура разобранного JSON
Норма

Все обязательные поля присутствуют и имеют ожидаемый тип

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

Поля отсутствуют, равны Неопределено или содержат строку вместо числа

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

Строка повторно читается ПрочитатьJSON без ошибок, кириллица отображается корректно

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

Ошибка парсинга, лишние экранирования, искажённые символы

Ответ веб-сервиса
Норма

Код состояния 200 или 201, тело в ожидаемом формате

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

Код 4xx/5xx, HTML-страница вместо JSON, пустое тело

Часто задаваемые вопросы

Что выбрать: структуру или соответствие при чтении JSON?

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

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

Преобразуйте дату в строку формата ISO 8601, например через Формат(Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"), либо передайте числом Unix-время. Автоматическая сериализация типа Дата функцией ЗаписатьJSON не поддерживается — значение нужно подготовить заранее.

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

Частые причины: BOM в начале файла, неверная кодировка при чтении, недопустимые управляющие символы в строках или фактическое нарушение синтаксиса (лишняя запятая, незакрытая скобка). Прочитайте файл через ЧтениеТекста с указанием UTF-8 и проверьте содержимое валидатором.

Как прочитать большой JSON-файл, не загружая его целиком в память?

Используйте потоковое чтение: откройте файл методом ОткрытьФайл объекта ЧтениеJSON и обходите документ циклом Прочитать(). Для массивов однотипных объектов удобно дочитывать до начала очередного элемента и разбирать только его через ПрочитатьJSON.

Можно ли сериализовать ссылку на объект 1С в JSON?

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

Чем ПрочитатьJSONВЗначение отличается от ПрочитатьJSON?

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

Итог

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

Чтение JSON выполняется через ЧтениеJSON + ПрочитатьJSON (в соответствие для внешних данных), запись — через ЗаписьJSON + ЗаписатьJSON с предварительным преобразованием дат и ссылок в строки. Для больших файлов применяйте потоковое чтение, при обмене по HTTP всегда проверяйте код состояния и указывайте кодировку UTF-8.