Как записать JSON без кавычек в ключах в 1С:Предприятие

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

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

Разберемся в стандартах: почему JSON без кавычек не существует

Для начала проанализируем саму суть проблемы. Участники обсуждения абсолютно правы: формата JSON без кавычек в ключах в официальной спецификации не существует. Согласно международному стандарту RFC 8259, любой валидный документ JSON должен строго соответствовать правилам синтаксиса, где имена свойств (ключи) обязаны быть строками, оформленными исключительно в двойные кавычки ("key": value).

Выясним причину такого жесткого ограничения. Создатель формата JSON Дуглас Крокфорд ввел обязательные кавычки для обеспечения максимальной совместимости со старым стандартом ECMAScript 3, который активно использовался в веб-индустрии в 2000-е годы. В ES3 зарезервированные ключевые слова, такие как class, default, new или function, нельзя было использовать в качестве ключей объектов без кавычек — это вызывало критические ошибки интерпретатора JavaScript. Чтобы парсеры гарантированно не ломались при обработке данных, кавычки сделали обязательными абсолютно для всех ключей.

Как же тогда называется формат, в котором кавычки у ключей отсутствуют? Здесь мы имеем дело с одним из двух вариантов:

  1. JavaScript Object Literal (литерал объекта JS) — стандартный синтаксис объявления объектов непосредственно в коде JavaScript.
  2. JSON5 (Relaxed JSON) — современная расширенная версия формата JSON, максимально приближенная к синтаксису стандартов ES5/ES6, которая допускает отсутствие кавычек у ключей-идентификаторов, использование одинарных кавычек, комментариев и других удобств.

Почему встроенные функции 1С не помогут напрямую

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

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

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

Способ 1. Использование регулярных выражений для постобработки готового JSON

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

Для реализации этого подхода в операционной системе Windows мы можем использовать стандартный COM-объект VBScript.RegExp. Разберем этот процесс по шагам на конкретном примере.

Посмотрим на пример кода, выполняющего данную операцию:


// Шаг 1. Создаем исходную структуру данных
СтруктураДанных = Новый Соответствие;
СтруктураДанных.Вставить("name", "Иван");
СтруктураДанных.Вставить("age", 30);
СтруктураДанных.Вставить("isDeveloper", Истина);

// Шаг 2. Сериализуем структуру в стандартный JSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, Символы.Таб));
ЗаписатьJSON(Запись, СтруктураДанных);
ТекстJSON = Запись.Закрыть();

// Шаг 3. Инициализируем объект регулярных выражений
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.Multiline = Истина;

// Шаблон ищет ключи в двойных кавычках, за которыми следует двоеточие: "имя_ключа":
// Используем ленивый поиск и группировку для захвата имени ключа
РегВыражение.Pattern = """([a-zA-Z_]\w*)""\s*:";

// Шаг 4. Производим замену, оставляя только имя ключа без кавычек ($1 указывает на первую группу в скобках)
Результат = РегВыражение.Replace(ТекстJSON, "$1:");

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

Способ 2. Ручная сборка строки (кастомный сериализатор)

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

Рассмотрим подробнее реализацию универсальной функции на встроенном языке 1С, которая обходит переданное Соответствие или Структуру и формирует строку в формате JavaScript-объекта:


Функция СформироватьJSОбъект(Данные) Экспорт
    СтрокаЭлементов = "";
    
    Для Каждого Элемент Из Данные Цикл
        Ключ = Элемент.Ключ; // Записываем имя ключа без кавычек
        Значение = Элемент.Значение;
        ЗначениеСтрокой = "";
        
        // Анализируем типы значений и форматируем их по правилам JS
        Если ТипЗнч(Значение) = Тип("Число") Тогда
            ЗначениеСтрокой = Формат(Значение, "ЧГ=0");
        ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
            ЗначениеСтрокой = ?(Значение, "true", "false");
        ИначеЕсли Значение = Неопределено Или Значение = Null Тогда
            ЗначениеСтрокой = "null";
        Иначе // Для строковых типов кавычки обязательны
            // Дополнительно экранируем кавычки внутри самой строки, если они есть
            ЭкранЗначение = СтрЗаменить(Значение, """", "\""");
            ЗначениеСтрокой = """" + ЭкранЗначение + """";
        КонецЕсли;
        
        // Формируем пару Ключ: Значение
        НовыйЭлемент = Ключ + ": " + ЗначениеСтрокой;
        СтрокаЭлементов = СтрокаЭлементов + ?(СтрокаЭлементов = "", "", ", ") + НовыйЭлемент;
    КонецЦикла;
    
    Возврат "{" + СтрокаЭлементов + "}";
КонецФункции

Посмотрим на пример практического вызова этой функции в модуле:


ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("id", 1024);
ПараметрыЗапроса.Вставить("status", "active");
ПараметрыЗапроса.Вставить("sendNotification", Ложь);

ТекстДляСервера = СформироватьJSОбъект(ПараметрыЗапроса);
// Результат будет: {id: 1024, status: "active", sendNotification: false}

Рекомендации по выбору решения

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

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

← На главную