Почему в 1С нет встроенной функции преобразования ТаблицыЗначений в JSON и как это реализовать?

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

Вопрос об отсутствии в платформе 1С прямого метода для превращения объекта ТаблицаЗначений в строку JSON (аналогично тому, как это реализовано для простых структур и массивов) является классическим для разработчиков. Особенно остро эта проблема встает при необходимости передачи данных между базами через COM-соединение или при разработке HTTP-сервисов. Рассмотрим подробнее, почему фирма «1С» до сих пор не добавила такую «кнопку», и разберем наиболее эффективные способы решения этой задачи самостоятельно.

Почему функции нет «в коробке»?

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

  1. Ссылки на объекты метаданных (СправочникСсылка, ДокументСсылка).
  2. Перечисления.
  3. Уникальные идентификаторы (UUID).
  4. Хранилища значений с двоичными данными.
  5. Типизированные NULL и Неопределено.

Платформа не может автоматически решить, как именно разработчик хочет представить, например, ссылку на контрагента: как GUID, как Наименование или как структуру со всеми реквизитами. Из-за этой многозначности 1С оставляет логику подготовки данных (сериализации) на усмотрение программиста.

Способ 1: Массив структур — стандартный подход

Выясним, какой метод является общепринятым. Чаще всего таблицу значений преобразуют в Массив структур. Каждая структура в таком массиве представляет собой строку таблицы, где ключи — это имена колонок, а значения — данные ячеек. Этот формат наиболее удобен для принимающей стороны (особенно для веб-интерфейсов), так как он самодокументирован (формат «ключ-значение»).

Разберем по шагам процесс реализации:

  1. Создаем новый Массив.
  2. Обходим ТаблицаЗначений в цикле.
  3. Для каждой строки создаем объект Структура, заполняя её значениями из колонок.
  4. Помещаем структуру в массив.
  5. Сериализуем полученный массив в JSON с помощью встроенного объекта ЗаписьJSON.

Посмотрим на пример кода:


Функция ПреобразоватьТЗвJSON(ТаблицаДанных) Экспорт
    МассивРезультат = Новый Массив;
    Колонки = ТаблицаДанных.Колонки;
    
    Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
        СтруктураСтроки = Новый Структура;
        Для Каждого Колонка Из Колонки Цикл
            // Здесь можно добавить логику обработки сложных типов (например, Дата или Ссылка)
            СтруктураСтроки.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
        КонецЦикла;
        МассивРезультат.Добавить(СтруктураСтроки);
    КонецЦикла;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, МассивРезультат);
    Возврат ЗаписьJSON.Закрыть();
КонецФункции

Способ 2: Массив массивов — компактный формат

Проанализируем ситуацию, когда данных очень много. Формат «массив структур» избыточен, так как в каждой строке повторяются имена колонок. Это значительно увеличивает объем передаваемой строки. Если важна компактность, стоит использовать формат «массив массивов» (по аналогии с CSV).

В этом случае первым элементом общего массива идет список имен колонок, а последующими — массивы со значениями строк. Рассмотрим реализацию:


Функция ПреобразоватьТЗвКомпактныйJSON(ТаблицаДанных) Экспорт
    ОбщийМассив = Новый Массив;
    
    // Формируем заголовок с именами колонок
    МассивКолонок = Новый Массив;
    Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
        МассивКолонок.Добавить(Колонка.Имя);
    КонецЦикла;
    ОбщийМассив.Добавить(МассивКолонок);
    
    // Добавляем данные строк
    Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
        МассивСтроки = Новый Массив;
        Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
            МассивСтроки.Добавить(СтрокаТЗ[Колонка.Имя]);
        КонецЦикла;
        ОбщийМассив.Добавить(МассивСтроки);
    КонецЦикла;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ОбщийМассив, ПараметрыЗаписи);
    Возврат ЗаписьJSON.Закрыть();
КонецФункции

Оптимизация при работе через COM-соединение

Разберем критически важный нюанс, упомянутый в обсуждении. Если вы используете COM-соединение для получения данных из другой базы, ни в коем случае не делайте перебор строк таблицы на стороне «принимающей» базы. Каждое обращение к ячейке СтрокаТЗ.Колонка через COM — это полноценный сетевой вызов (round-trip), что катастрофически замедляет работу на больших таблицах.

Правильная стратегия:

  1. Напишите функцию преобразования ТЗ в JSON внутри базы-источника (в общем модуле).
  2. Вызовите эту функцию через COM-соединение.
  3. Получите одну готовую длинную строку JSON.
  4. Распакуйте её уже в текущей базе с помощью ПрочитатьJSON().

Передача одной строки объемом в несколько мегабайт выполняется в десятки раз быстрее, чем перебор тысячи строк через COM-интерфейс.

Нюансы сериализации типов

При использовании ЗаписатьJSON платформа 1С автоматически обрабатывает стандартные типы. Однако стоит помнить:

Таким образом, хотя «волшебной кнопки» в 1С нет, реализация собственной функции преобразования ТаблицыЗначений позволяет гибко настроить формат передачи данных под конкретные нужды проекта, соблюдая баланс между читаемостью кода и производительностью системы.

← На главную