К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как записать таблицу значений в JSON в 1С

Как записать таблицу значений в JSON в 1С: ЗаписьJSON, ЗначениеВJSON, СериализаторXDTO, колонки и типы данных, обратное чтение и типичные ошибки.

Таблица значений — универсальная структура данных в 1С, которую часто нужно передать во внешние системы: веб-сервисы, мобильные приложения, файлы обмена. Формат JSON стал стандартом для такого обмена, и в платформе есть несколько способов сериализовать таблицу значений в JSON: встроенные объекты ЗаписьJSON и ЧтениеJSON, функция ЗначениеВJSON, а также СериализаторXDTO. Выбор способа зависит от версии платформы, требований к формату и необходимости обратного чтения.

Главная сложность в том, что таблица значений — это не просто массив структур: у неё есть описание колонок с типами, а сами типы 1С (дата, ссылка, булево) не имеют прямого аналога в JSON. Поэтому простая запись «как есть» часто даёт результат, который внешняя система не сможет корректно разобрать, а обратное чтение теряет типы. Ниже разобраны рабочие подходы с примерами кода, проверкой результата и типичными ошибками.

Какие способы записи таблицы значений в JSON есть в 1С

В платформе доступны три основных подхода. Первый — ручная сборка: вы обходите таблицу циклом, формируете массив структур и записываете его через ЗаписьJSON. Это даёт полный контроль над именами полей, форматом дат и представлением ссылок. Второй — функция глобального контекста ЗначениеВJSON, которая сама преобразует допустимые типы, но таблицу значений напрямую не сериализует — её всё равно нужно предварительно превратить в массив. Третий — СериализаторXDTO, который сохраняет таблицу со всеми типами, но выдаёт JSON в формате XDTO, понятном в основном другим базам 1С.

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

Сравнение способов сериализации

Цикл + ЗаписьJSON

Полный контроль над форматом, подходит для REST API. Требует писать код преобразования каждой колонки.

ЗначениеВJSON

Минимум кода для массивов и структур. Таблицу значений нужно сначала преобразовать вручную, ссылки и специальные типы требуют функции преобразования.

СериализаторXDTO

Сохраняет все типы 1С, читается обратно без потерь. Формат избыточен и неудобен для внешних систем.

Как записать таблицу значений в JSON через цикл и ЗаписьJSON

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

Функция ТаблицаВJSON(Таблица) Экспорт

МассивСтрок = Новый Массив;

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

СтруктураСтроки = Новый Структура;

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

СтруктураСтроки.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);

КонецЦикла;

МассивСтрок.Добавить(СтруктураСтроки);

КонецЦикла;

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

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

ЗаписатьJSON(Запись, МассивСтрок);

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

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

Обратите внимание: имена ключей структуры должны быть допустимыми идентификаторами 1С, поэтому колонки с именами, содержащими пробелы или начинающимися с цифры, вызовут ошибку. Если таблица приходит из запроса с псевдонимами вида «Номенклатура Наименование», перед вставкой в структуру имя нужно нормализовать — например, заменить пробелы на подчёркивания.

Если нужен «красивый» вывод с отступами для чтения человеком, используйте параметры записи: Новый ПараметрыЗаписиJSON(, Символы.Таб) и передайте их в конструктор ЗаписьJSON. Для машинного обмена компактный вариант без отступов предпочтительнее — он меньше по объёму.

Порядок записи таблицы в JSON
  1. 1
    Создайте пустой массив для будущих строк
  2. 2
    Пройдите циклом по строкам таблицы значений
  3. 3
    Для каждой строки соберите структуру по списку колонок
  4. 4
    Преобразуйте даты, ссылки и булево в нужный формат
  5. 5
    Запишите массив через ЗаписатьJSON
  6. 6
    Проверьте результат, прочитав его обратно через ЧтениеJSON

Как обработать даты, ссылки и булево при записи

JSON знает только строки, числа, булево, null, массивы и объекты. Дата 1С при стандартной записи превращается в строку вида «20260115143000», что не соответствует привычному для внешних систем формату ISO 8601. Чтобы получить ISO-формат, дату нужно отформатировать вручную:

СтруктураСтроки.Вставить("Дата",

Формат(СтрокаТЗ.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"));

Ссылки на объекты (справочники, документы) в JSON не сериализуются напрямую. Обычно передают строковое представление уникального идентификатора: Строка(Ссылка.УникальныйИдентификатор()), либо человекочитаемое представление — наименование или номер, если приёмнику нужен только текст. Важно заранее договориться с принимающей стороной, что именно передаётся: GUID, код, наименование или комбинация.

Булево записывается корректно автоматически. Числа с пустым значением (ноль в незаполненной числовой колонке) и пустые строки тоже записываются без проблем, а вот Неопределено при стандартной записи превращается в null — убедитесь, что приёмник это корректно обрабатывает.

Запись через ЗначениеВJSON и функцию преобразования

Функция ЗначениеВJSON(Значение, Настройки, ФункцияПреобразования, Модуль) позволяет сериализовать массив структур одной строкой и при этом обработать нестандартные типы через функцию преобразования. Это удобно, когда в таблице много ссылок и дат: логика преобразования собрана в одном месте, а не размазана по циклу.

Функция ПреобразоватьЗначение(Свойство, Значение,

ДополнительныеПараметры, Отказ) Экспорт

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

Отказ = Истина;

Возврат Формат(Значение, "ДФ=yyyy-MM-ddTHH:mm:ss");

КонецЕсли;

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда

Отказ = Истина;

Возврат Строка(Значение.УникальныйИдентификатор());

КонецЕсли;

Возврат Неопределено;

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

Функция преобразования должна находиться в общем модуле (для сервера — серверном), а её имя и модуль передаются параметрами в ЗначениеВJSON. Установка параметра Отказ = Истина означает, что вы берёте сериализацию значения на себя и возвращаете готовый результат.

Этот подход требует аккуратности: если функция преобразования не обработает какой-то тип и не вернёт значение, сериализация завершится ошибкой. Поэтому в конце функции всегда оставляйте возврат Неопределено для типов, которые стандартный механизм обработает сам.

СериализаторXDTO: когда нужно сохранить типы 1С

Если JSON читает другая база 1С, задача упрощается: СериализаторXDTO.ЗаписатьJSON сохранит таблицу значений вместе с описанием типов колонок, и при обратном чтении вы получите точную копию исходного объекта.

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

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

СериализаторXDTO.ЗаписатьJSON(Запись, Таблица);

СтрокаJSON = Запись.Закрыть();

// Обратное чтение

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(СтрокаJSON);

ТаблицаОбратно = СериализаторXDTO.ПрочитатьJSON(Чтение);

Ограничение очевидно: формат XDTO в JSON избыточен, содержит служебные поля с указанием типов и практически нечитаем для внешних систем. Использовать его для публичного API — плохая идея: контракт данных окажется жёстко привязан к внутреннему устройству платформы. Зато для файлового обмена между своими базами, фоновой передачи данных или отладочного сохранения состояния это самый быстрый вариант.

Как проверить результат и прочитать JSON обратно

Минимальная проверка — обратное чтение. Установите полученную строку в ЧтениеJSON, прочитайте через ПрочитатьJSON в структуру или соответствие и убедитесь, что количество элементов массива совпадает с числом строк таблицы, а значения полей читаются в ожидаемом виде.

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(СтрокаJSON);

Данные = ПрочитатьJSON(Чтение); // массив структур

Чтение.Закрыть();

Если Данные.Количество() <> Таблица.Количество() Тогда

ВызватьИсключение "Потеряны строки при сериализации";

КонецЕсли;

Дополнительно полезно проверить строку валидатором JSON (хотя бы встроенным чтением) и убедиться, что даты пришли в ожидаемом формате, а GUID ссылок соответствуют реальным объектам. Если JSON уходит во внешнюю систему, согласуйте с её разработчиками тестовый пример файла и сверяйте свой вывод с ним — это отлавливает расхождения в именах полей и регистре букв, которые в JSON значимы.

Контрольные точки

Как проверить результат

Количество элементов массива в JSON
Норма

Совпадает с числом строк таблицы

Тревожный признак

Меньше или больше — проверяйте цикл и фильтры

Формат дат
Норма

Единый формат, например ISO 8601

Тревожный признак

Смешанные форматы или пустые строки вместо дат

Ссылки
Норма

Передаётся GUID или согласованное представление

Тревожный признак

Строка вида «Номенклатура 00-000001» там, где ждут GUID

Обратное чтение
Норма

ПрочитатьJSON выполняется без ошибок

Тревожный признак

Ошибка разбора — невалидный JSON

Типичные ошибки и ограничения

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

Из ограничений стоит помнить о кодировке: УстановитьСтроку() отдаёт строку в Unicode, но при записи в файл через ЗаписьТекста явно указывайте кодировку UTF-8, иначе кириллица может испортиться при чтении внешней системой. Также большие таблицы (сотни тысяч строк) лучше писать потоково в файл через ЗаписьJSON.ОткрытьФайл(), а не собирать гигантскую строку в памяти.

Типичные ошибки
01
Запись таблицы значений напрямую без преобразования в массив структур — ошибка сериализации или пустой результат
02
Имена колонок с пробелами и дефисами как ключи структуры — исключение при Вставить()
03
Сохранение JSON в файл без указания UTF-8 — испорченная кириллица у приёмника
04
Передача ссылки как представления там, где ждут GUID — приёмник не находит объект
05
Сборка JSON большой таблицы в строку в памяти вместо потоковой записи в файл

Часто задаваемые вопросы

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

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

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

В цикле формируйте структуру не по всем колонкам, а по явному списку нужных имён. Это заодно защищает контракт обмена: если в таблицу позже добавят служебную колонку, она не «протечёт» во внешний JSON.

Как сохранить JSON в файл, а не в строку?

Используйте ЗаписьJSON с методом ОткрытьФайл(ИмяФайла, "UTF-8") вместо УстановитьСтроку. Запись пойдёт сразу в файл, что экономит память на больших таблицах. Второй вариант — получить строку и сохранить её через ЗаписьТекста с явным указанием кодировки UTF-8.

Почему после обратного чтения даты стали строками?

JSON не имеет типа «дата», поэтому при чтении даты остаются строками. Преобразуйте их обратно вручную по известному формату или используйте ПрочитатьJSON с параметром ПрочитатьВСоответствие и последующей обработкой, либо задайте свойства с ожидаемым типом даты через параметры чтения.

Что лучше для REST API: структуры или соответствия?

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

Итог

Что важно запомнить

Таблицу значений преобразуйте в массив структур и записывайте через ЗаписьJSON, явно обрабатывая даты и ссылки. Для обмена между базами 1С с сохранением типов используйте СериализаторXDTO. Результат всегда проверяйте обратным чтением и сверкой количества строк.