Как элегантно и правильно сформировать JSON-строку в 1С:Предприятие 8.3

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Собрать такой JSON-пакет вручную, складывая строки и экранируя кавычки с помощью конструкции Символ(34) или бесконечного количества двойных кавычек "" — это классический путь, который приводит к трудночитаемому коду и регулярным ошибкам. Опечатка в одной запятой или кавычке ломает всю структуру запроса, а отладка превращается в рутину.

В этой статье мы подробно разберем, как уйти от «костылей» склейки строк и рассмотримы три изящных, современных и надежных способа создания JSON-строки на платформе «1С:Предприятие 8.3».


Проблема ручной склейки: почему так делать не стоит

Рассмотрим пример кода, с которого началась дискуссия на форуме:


СтрокаЗапроса = "{" + Символ(34) + "requests" + Символ(34) + ":[{" + Символ(34) + "addSheet" + ...

Этот подход имеет колоссальные недостатки:

  1. Нечитаемость. Понять структуру иерархии JSON-документа с первого взгляда невозможно.
  2. Сложность поддержки. Если во внешнем API добавится новое поле, разработчику придется аккуратно «вклиниваться» в конкатенацию строк, рискуя нарушить синтаксис.
  3. Проблемы с типами данных. При ручной сборке числа, булевы значения (true/false) и пустые значения (null) приходится форматировать вручную, учитывая региональные стандарты (например, запятую вместо точки в дробных числах 1С).

Выясним, какими инструментами располагает современная платформа 1С для элегантного решения этой задачи.


Способ 1. Самый современный и элегантный: Функция ЗаписатьЗначениеJSON (начиная с платформы 8.3.23)

Если вы работаете на современной версии платформы (8.3.23 и выше), вам доступен самый лаконичный метод сериализации. Разработчики фирмы «1С» добавили встроенную функцию ЗаписатьЗначениеJSON, которая позволяет превратить любой совместимый объект (структуру, массив, соответствие) в строку JSON буквально в одну строчку кода, минуя ручное создание потоков записи.

Давайте разберем по шагам, как построить нужную структуру данных и преобразовать ее в JSON:


// Шаг 1. Формируем вложенные параметры (сетка и цвета)
ПараметрыСетки = Новый Структура("rowCount, columnCount", 20, 12);
ЦветВкладки    = Новый Структура("red, green, blue", 1, 0.3, 0.4);

// Шаг 2. Собираем свойства листа
Свойства = Новый Структура;
Свойства.Вставить("title", "Deposits");
Свойства.Вставить("gridProperties", ПараметрыСетки);
Свойства.Вставить("tabColor", ЦветВкладки);

ДобавитьЛист = Новый Структура("properties", Свойства);

// Шаг 3. Помещаем объект в массив (так как в JSON ожидается массив "requests")
МассивЗапросов = Новый Массив;
МассивЗапросов.Добавить(Новый Структура("addSheet", ДобавитьЛист));

// Шаг 4. Объединяем все в корневой объект
ДанныеЗапроса = Новый Структура("requests", МассивЗапросов);

// Шаг 5. Получаем чистую JSON-строку в одно действие!
СтрокаЗапроса = ЗаписатьЗначениеJSON(ДанныеЗапроса);

Преимущества метода:


Способ 2. Классический: Сериализация через ЗаписьJSON (для версий платформы ниже 8.3.23)

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

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

Используя ту же переменную ДанныеЗапроса, которую мы подготовили в предыдущем примере, напишем следующий код:


// Инициализируем объект записи
ЗаписьJSON = Новый ЗаписьJSON;

// Указываем, что запись будет производиться в строковую переменную в памяти
ЗаписьJSON.УстановитьСтроку(); 

// Сериализуем наш объект в поток записи
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);

// Закрываем поток и выгружаем результат в готовую строку
СтрокаЗапроса = ЗаписьJSON.Закрыть();

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


ПараметрыНастройки = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыНастройки);

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

Способ 3. Использование функции СтрШаблон для простых и статических структур (начиная с платформы 8.3.6)

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

Вместо сложного нагромождения объектов мы можем использовать встроенную функцию СтрШаблон. Кавычки внутри строки-шаблона экранируются стандартным для языка 1С способом — их удвоением (""), а вместо динамических параметров вставляются маркеры автоподстановки (%1, %2 и т.д.).

Посмотрим на практическую реализацию:


// Задаем шаблон строки JSON с маркерами подстановки %1, %2 и т.д.
ШаблонJSON = "{""requests"":[{""addSheet"":{""properties"":{""title"":""%1"",""gridProperties"":{""rowCount"":%2,""columnCount"":%3},""tabColor"":{""red"":%4,""green"":%5,""blue"":%6}}}}]}";

// Быстро и красиво подставляем реальные переменные в шаблон
СтрокаЗапроса = СтрШаблон(ШаблонJSON, "Deposits", 20, 12, 1, 0.3, 0.4);

Этот вариант работает мгновенно, не перегружает память созданием вспомогательных объектов и позволяет визуально контролировать структуру результирующей строки.


Важное дополнение: Преодоление ограничений Структуры с помощью Соответствия

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

Что делать, если внешнее API требует от вас передать в JSON ключи с дефисами (например, "add-sheet" вместо "addSheet") или ключи, начинающиеся с цифры ("1c-integration")?

Решение очень простое: замените Структуру на объект типа Соответствие. Платформа 1С умеет корректно сериализовать соответствия в JSON-объекты, при этом ключи соответствия могут быть абсолютно любыми строками.

Проанализируем пример:


// Структура не позволила бы использовать ключ "add-sheet" из-за дефиса
ДанныеЛиста = Новый Соответствие;
ДанныеЛиста.Вставить("add-sheet", ИстинныйОбъектПараметров);

// Платформа без проблем преобразует это в валидный JSON: {"add-sheet": ...}
СтрокаЗапроса = ЗаписатьЗначениеJSON(ДанныеЛиста);

Резюме

Мы рассмотрели лучшие практики работы с JSON-строками в 1С:

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

← На главную