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

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

1. Встроенный метод ЗаписатьJSON(): простой и надёжный способ

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

Основной синтаксис:

РезультатJSON = ТаблицаЗначений.ЗаписатьJSON(ПараметрыЗаписи);

Где ПараметрыЗаписи — это структура с настройками формата. Например, можно указать:

  • 📌 ДатаВФорматеUTC — для приведения дат к универсальному формату;
  • 📌 Отступ — для красивого форматирования JSON с отступами;
  • 📌 ЭкранироватьСимволы — для защиты от XSS-атак.
💡

Если вам нужно передать JSON в веб-сервис, всегда используйте параметр ЭкранироватьСимволы = Истина, чтобы избежать проблем с кавычками и спецсимволами.

Пример кода:

Таблица = Новый ТаблицаЗначений();

Таблица.Колонки.Добавить("Наименование");

Таблица.Колонки.Добавить("Цена");

Таблица.Добавить();

Таблица[0].Наименование = "Товар 1";

Таблица[0].Цена = 1000;

Параметры = Новый Структура();

Параметры.Вставить("Отступ", 4);

Параметры.Вставить("ДатаВФорматеUTC", Истина);

JSONСтрока = Таблица.ЗаписатьJSON(Параметры);

Сообщить(JSONСтрока);

⚠️ Внимание: В версиях 1С ниже 8.3.10 метод ЗаписатьJSON() отсутствует. Для старых релизов используйте альтернативные способы, описанные ниже.

2. Ручное формирование JSON через конструктор строк

Если вы работаете со старой версией платформы или вам нужно полностью контролировать структуру JSON, можно сформировать строку вручную. Этот метод требует больше кода, но даёт максимальную гибкость.

Алгоритм действий:

  1. Создать пустую строку для результата.
  2. Добавить открывающую квадратную скобку [ (JSON-массив).
  3. В цикле обойти все строки таблицы, преобразуя каждую в объект JSON.
  4. Экранировать специальные символы (кавычки, обратный слэш).
  5. Закрыть массив скобкой ].

Пример кода:

Функция ТаблицаВJSON(Таблица)

Результат = "[";

Разделитель = "";

Для Каждого Строка Из Таблица Цикл

Результат = Результат + Разделитель + "{";

РазделительСвойств = "";

Для Каждого Колонка Из Таблица.Колонки Цикл

Значение = Строка[Колонка.Имя];

Если ТипЗнч(Значение) = Тип("Строка") Тогда

Значение = """" + СтроковыеФункции.ЭкранироватьСимволыJSON(Значение) + """";

ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда

Значение = """" + Формат(Значение, "ДФ=yyyy-MM-dd") + """";

ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда

Значение = СтроковоеПредставлениеЧисла(Значение);

ИначеЕсли Значение = Неопределено Тогда

Значение = "null";

КонецЕсли;

Результат = Результат + РазделительСвойств +

"""" + Колонка.Имя + """: " + Значение;

РазделительСвойств = ", ";

КонецЦикла;

Результат = Результат + "}";

Разделитель = ", ";

КонецЦикла;

Результат = Результат + "]";

Возврат Результат;

КонецФункции

// Вспомогательная функция для экранирования

Функция ЭкранироватьСимволыJSON(Строка)

Строка = СтроковыеФункции.Заменить(Строка, """", "\""");

Строка = СтроковыеФункции.Заменить(Строка, "\", "\\");

Строка = СтроковыеФункции.Заменить(Строка, "/", "\/");

Строка = СтроковыеФункции.Заменить(Строка, Chr(13), "\r");

Строка = СтроковыеФункции.Заменить(Строка, Chr(10), "\n");

Строка = СтроковыеФункции.Заменить(Строка, Chr(9), "\t");

Возврат Строка;

КонецФункции

⚠️ Внимание: При ручном формировании JSON легко допустить ошибки в экранировании или формате данных. Всегда проверяйте результат через валидаторы вроде JSONLint.
📊 Какой способ записи JSON в 1С вы используете чаще?
Встроенный метод ЗаписатьJSON()
Ручное формирование
Специальные обработки
Другое

3. Использование объекта ЗаписьJSON для сложных структур

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

  • 🔹 Записывать данные по частям (потоковая запись);
  • 🔹 Управлять форматом чисел и дат;
  • 🔹 Обрабатывать рекурсивные структуры (например, таблицы внутри таблиц).

Пример работы с ЗаписьJSON:

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

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

Запись.ЗаписатьНачалоМассива();

Для Каждого Строка Из Таблица Цикл

Запись.ЗаписатьНачалоОбъекта();

Для Каждого Колонка Из Таблица.Колонки Цикл

Запись.ЗаписатьИмяСвойства(Колонка.Имя);

Значение = Строка[Колонка.Имя];

Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда

ЗаписатьВложеннуюТаблицу(Запись, Значение); // Рекурсивный вызов

Иначе

Запись.ЗаписатьЗначение(Значение);

КонецЕсли;

КонецЦикла;

Запись.ЗаписатьКонецОбъекта();

КонецЦикла;

Запись.ЗаписатьКонецМассива();

Результат = Запись.Закрыть();

Этот подход особенно полезен, когда таблица значений содержит:

  • 📊 Вложенные таблицы (например, список товаров с историей цен);
  • 📅 Даты в нестандартном формате;
  • 🔢 Числа с особыми правилами округления.

4. Обработка особенных типов данных в JSON

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

Тип в 1С Представление в JSON Пример кода
Дата Строка в формате ISO 8601 Формат(Дата, "ДФ=yyyy-MM-dd")
УникальныйИдентификатор Строка UUID Строка(УникальныйИдентификатор)
ХранилищеЗначения Base64-строка Base64Строка(ХранилищеЗначения.Получить())
Неопределено null Если Значение = Неопределено Тогда ...

Для работы с бинарными данными (например, картинками в ячейках таблицы) используйте кодировку Base64:

Функция БинарныеДанныеВBase64(Данные)

Возврат Base64Строка(Данные.Получить());

КонецФункции

⚠️ Внимание: При передаче больших бинарных данных (например, PDF-файлов) через JSON объём строки может превысить ограничения веб-сервисов. В таких случаях лучше использовать отдельные endpoints для загрузки файлов.
Как обработать тип "Ссылочный" (справочники, документы)?

Для ссылочных типов в JSON обычно передают либо строку с представлением объекта (Ссылка.Представление()),

либо составной идентификатор (Ссылка.УникальныйИдентификатор() + "|" + Ссылка.МетодПолученияДанных()).

В некоторых API требуется передавать только GUID объекта без дополнительных данных.

5. Оптимизация производительности при работе с большими таблицами

При записи в JSON таблиц с тысячами строк могут возникать проблемы с производительностью. Вот ключевые рекомендации для оптимизации:

  • 🚀 Используйте потоковую запись через ЗаписьJSON вместо формирования одной большой строки;
  • 🚀 Отключайте форматирование (параметр Отступ = 0), если JSON не нужен для визуального анализа;
  • 🚀 Обрабатывайте данные пакетами по 100-200 строк, если передаёте через HTTP;
  • 🚀 Кэшируйте результаты для повторных запросов одинаковых данных.

Пример оптимизированного кода для большой таблицы:

Функция ЗаписатьБольшуюТаблицуВJSON(Таблица, РазмерПакета = 200)

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

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

Запись.ЗаписатьНачалоМассива();

Индекс = 0;

Während Индекс < Таблица.Количество() Цикл

КонецПакета = Мин(Индекс + РазмерПакета - 1, Таблица.Количество() - 1);

Для Сч = Индекс По КонецПакета Цикл

Строка = Таблица[Сч];

Запись.ЗаписатьНачалоОбъекта();

// ... запись свойств строки ...

Запись.ЗаписатьКонецОбъекта();

КонецЦикла;

Индекс = Индекс + РазмерПакета;

КонецЦикла;

Запись.ЗаписатьКонецМассива();

Возврат Запись.Закрыть();

КонецФункции

🔹 Убедиться, что в таблице нет циклических ссылок

🔹 Проверить ограничения на размер JSON в целевой системе

🔹 Отключить ненужное форматирование (отступы, переносы)

🔹 Оценить целесообразность сжатия данных (gzip)

-->

6. Типичные ошибки и их решение

Даже опытные разработчики сталкиваются с проблемами при записи таблиц значений в JSON. Рассмотрим самые распространённые ошибки и способы их исправления:

Ошибка Причина Решение
Ошибка при вызове метода контекста (ЗаписатьJSON) Не поддерживается в версии платформы ниже 8.3.10 Используйте ручное формирование или обновите платформу
Некорректный формат JSON: ожидалась запятая Пропущен разделитель между объектами в массиве Проверьте логику добавления разделителей в цикле
Русские символы отображаются как \uXXXX Не указан параметр кодировки Добавьте Параметры.Вставить("КодировкаТекста", "utf-8")
Дата записывается в неверном формате Не указан параметр ДатаВФорматеUTC Явно задайте формат даты в параметрах записи

Для отладки JSON используйте следующие приёмы:

  1. Проверяйте результат через онлайн-валидаторы (JSONLint, JSONFormatter);
  2. Выводите промежуточные результаты в отладочное окно;
  3. Используйте Попытка...Исключение для перехвата ошибок сериализации.

Пример обработки ошибок:

Попытка

JSONСтрока = Таблица.ЗаписатьJSON();

Исключение

Сообщить("Ошибка записи JSON: " + ОписаниеОшибки());

// Альтернативный способ записи

JSONСтрока = ТаблицаВJSONРучной(Таблица);

КонецПопытки;

💡

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

FAQ: Частые вопросы по записи таблиц значений в JSON

Можно ли записать в JSON таблицу с вложенными таблицами значений?

Да, но для этого нужно:

  1. Использовать объект ЗаписьJSON с рекурсивной обработкой;
  2. Или вручную формировать строку с учетом вложенности;
  3. В версиях 8.3.14+ вложенные таблицы поддерживаются методом ЗаписатьJSON() автоматически.

Пример рекурсивной функции:

Процедура ЗаписатьВложеннуюТаблицу(Запись, Таблица)

Запись.ЗаписатьНачалоМассива();

Для Каждого Строка Из Таблица Цикл

Запись.ЗаписатьНачалоОбъекта();

// ... обработка колонок ...

Запись.ЗаписатьКонецОбъекта();

КонецЦикла;

Запись.ЗаписатьКонецМассива();

КонецПроцедуры

Как записать в JSON таблицу с колонками типа "ХранилищеЗначения"?

Для бинарных данных в колонках типа ХранилищеЗначения используйте кодировку Base64:

Значение = Base64Строка(Таблица[Индекс].Хранилище.Получить());

В параметрах ЗаписьJSON можно указать:

Параметры.Вставить("СериализоватьХранилищеЗначения", Истина);

Это автоматически преобразует хранилища в Base64-строки.

Почему при записи JSON русские буквы заменяются на \uXXXX?

Это происходит из-за:

  • Не указанной кодировки (по умолчанию используется Unicode-экранирование);
  • Настроек объекта ЗаписьJSON (параметр ЭкранироватьНеASCII).

Решение:

Параметры = Новый Структура();

Параметры.Вставить("КодировкаТекста", "utf-8");

Параметры.Вставить("ЭкранироватьНеASCII", Ложь);

Как записать в JSON только выбранные колонки таблицы?

Создайте новую таблицу с нужными колонками или фильтруйте данные при записи:

Функция ЗаписатьВыборочныеКолонки(Таблица, СписокКолонок)

Результат = Новый ТаблицаЗначений;

Для Каждого ИмяКолонки Из СписокКолонок Цикл

Результат.Колонки.Добавить(ИмяКолонки, Таблица.Колонки.Найти(ИмяКолонки).ТипЗначения);

КонецЦикла;

Для Каждого Строка Из Таблица Цикл

НоваяСтрока = Результат.Добавить();

Для Каждого ИмяКолонки Из СписокКолонок Цикл

НоваяСтрока[ИмяКолонки] = Строка[ИмяКолонки];

КонецЦикла;

КонецЦикла;

Возврат Результат.ЗаписатьJSON();

КонецФункции

Какая максимальная глубина вложенности поддерживается при записи JSON?

Ограничения зависят от:

  • Версии платформы (в 8.3.10+ глубина не ограничена жёстко, но зависит от стека вызовов);
  • Настроек объекта ЗаписьJSON (параметр МаксимальнаяГлубинаРекурсии);
  • Ограничений целевой системы, куда передаётся JSON.

Для глубоко вложенных структур используйте:

Параметры.Вставить("МаксимальнаяГлубинаРекурсии", 100); // Увеличение лимита