Вопрос об отсутствии в платформе 1С прямого метода для превращения объекта ТаблицаЗначений в строку JSON (аналогично тому, как это реализовано для простых структур и массивов) является классическим для разработчиков. Особенно остро эта проблема встает при необходимости передачи данных между базами через COM-соединение или при разработке HTTP-сервисов. Рассмотрим подробнее, почему фирма «1С» до сих пор не добавила такую «кнопку», и разберем наиболее эффективные способы решения этой задачи самостоятельно.
Проанализируем архитектурную ситуацию. Основная причина отсутствия метода ЗаписатьJSON(ТаблицаЗначений) кроется в неопределенности типов данных. Формат JSON крайне ограничен: он понимает числа, строки, булево, массивы и объекты (словари). В то же время ТаблицаЗначений в 1С — это сложный объект, колонки которого могут содержать:
СправочникСсылка, ДокументСсылка).UUID).NULL и Неопределено.Платформа не может автоматически решить, как именно разработчик хочет представить, например, ссылку на контрагента: как GUID, как Наименование или как структуру со всеми реквизитами. Из-за этой многозначности 1С оставляет логику подготовки данных (сериализации) на усмотрение программиста.
Выясним, какой метод является общепринятым. Чаще всего таблицу значений преобразуют в Массив структур. Каждая структура в таком массиве представляет собой строку таблицы, где ключи — это имена колонок, а значения — данные ячеек. Этот формат наиболее удобен для принимающей стороны (особенно для веб-интерфейсов), так как он самодокументирован (формат «ключ-значение»).
Разберем по шагам процесс реализации:
Массив.ТаблицаЗначений в цикле.Структура, заполняя её значениями из колонок.ЗаписьJSON.Посмотрим на пример кода:
Функция ПреобразоватьТЗвJSON(ТаблицаДанных) Экспорт
МассивРезультат = Новый Массив;
Колонки = ТаблицаДанных.Колонки;
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
СтруктураСтроки = Новый Структура;
Для Каждого Колонка Из Колонки Цикл
// Здесь можно добавить логику обработки сложных типов (например, Дата или Ссылка)
СтруктураСтроки.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
МассивРезультат.Добавить(СтруктураСтроки);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивРезультат);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Проанализируем ситуацию, когда данных очень много. Формат «массив структур» избыточен, так как в каждой строке повторяются имена колонок. Это значительно увеличивает объем передаваемой строки. Если важна компактность, стоит использовать формат «массив массивов» (по аналогии с CSV).
В этом случае первым элементом общего массива идет список имен колонок, а последующими — массивы со значениями строк. Рассмотрим реализацию:
Функция ПреобразоватьТЗвКомпактныйJSON(ТаблицаДанных) Экспорт
ОбщийМассив = Новый Массив;
// Формируем заголовок с именами колонок
МассивКолонок = Новый Массив;
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
МассивКолонок.Добавить(Колонка.Имя);
КонецЦикла;
ОбщийМассив.Добавить(МассивКолонок);
// Добавляем данные строк
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
МассивСтроки = Новый Массив;
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
МассивСтроки.Добавить(СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
ОбщийМассив.Добавить(МассивСтроки);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ОбщийМассив, ПараметрыЗаписи);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Разберем критически важный нюанс, упомянутый в обсуждении. Если вы используете COM-соединение для получения данных из другой базы, ни в коем случае не делайте перебор строк таблицы на стороне «принимающей» базы. Каждое обращение к ячейке СтрокаТЗ.Колонка через COM — это полноценный сетевой вызов (round-trip), что катастрофически замедляет работу на больших таблицах.
Правильная стратегия:
ПрочитатьJSON().Передача одной строки объемом в несколько мегабайт выполняется в десятки раз быстрее, чем перебор тысячи строк через COM-интерфейс.
При использовании ЗаписатьJSON платформа 1С автоматически обрабатывает стандартные типы. Однако стоит помнить:
"2023-10-27T10:00:00"). Это стандарт де-факто, который понимает большинство систем.ЗаписатьJSON может выдать ошибку или пустой результат, если не указать настройки сериализации. Рекомендуется предварительно преобразовывать ссылки в строки (Строка(Ссылка)) или получать их UUID.РаботаСJSON. Там часто уже реализованы универсальные функции превращения любых коллекций в формат JSON с учетом всех нюансов платформы.Таким образом, хотя «волшебной кнопки» в 1С нет, реализация собственной функции преобразования ТаблицыЗначений позволяет гибко настроить формат передачи данных под конкретные нужды проекта, соблюдая баланс между читаемостью кода и производительностью системы.