При интеграции 1С с внешними веб-сервисами, REST API и сторонними приложениями разработчики постоянно сталкиваются с необходимостью отправки данных в формате JSON. Зачастую это небольшие запросы, содержащие настройки, параметры или команды.
Собрать такой JSON-пакет вручную, складывая строки и экранируя кавычки с помощью конструкции Символ(34) или бесконечного количества двойных кавычек "" — это классический путь, который приводит к трудночитаемому коду и регулярным ошибкам. Опечатка в одной запятой или кавычке ломает всю структуру запроса, а отладка превращается в рутину.
В этой статье мы подробно разберем, как уйти от «костылей» склейки строк и рассмотримы три изящных, современных и надежных способа создания JSON-строки на платформе «1С:Предприятие 8.3».
Рассмотрим пример кода, с которого началась дискуссия на форуме:
СтрокаЗапроса = "{" + Символ(34) + "requests" + Символ(34) + ":[{" + Символ(34) + "addSheet" + ...
Этот подход имеет колоссальные недостатки:
Выясним, какими инструментами располагает современная платформа 1С для элегантного решения этой задачи.
Если вы работаете на современной версии платформы (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(ДанныеЗапроса);
Преимущества метода:
true / false.Если ваша конфигурация работает на более ранних версиях платформы 1С, использовать функцию ЗаписатьЗначениеJSON напрямую не получится. Однако это не повод возвращаться к ручной склейке строк. Мы можем применить классический объект ЗаписьJSON.
Существует заблуждение, что ЗаписьJSON обязательно требует записи файла на диск. На самом деле метод УстановитьСтроку() позволяет выполнять всю работу непосредственно в оперативной памяти компьютера.
Используя ту же переменную ДанныеЗапроса, которую мы подготовили в предыдущем примере, напишем следующий код:
// Инициализируем объект записи
ЗаписьJSON = Новый ЗаписьJSON;
// Указываем, что запись будет производиться в строковую переменную в памяти
ЗаписьJSON.УстановитьСтроку();
// Сериализуем наш объект в поток записи
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
// Закрываем поток и выгружаем результат в готовую строку
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Полезный нюанс: По умолчанию 1С форматирует JSON с отступами и переносами строк для удобства чтения человеком. Если вам нужно передать максимально компактную строку по сети (минифицировать трафик), вы можете явно отключить переносы строк с помощью параметров записи:
ПараметрыНастройки = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыНастройки);
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Иногда структура 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С:
ЗаписатьЗначениеJSON — это самый элегантный и современный однострочный метод.ЗаписьJSON и УстановитьСтроку(), чтобы не производить файловых операций.СтрШаблон.Соответствие вместо Структуры.Применение этих подходов убережет ваш код от досадных синтаксических ошибок, сделает его понятным для коллег по разработке и существенно ускорит поддержку интеграционных механизмов.