Разработка и Конфигурация · 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 подходит как промежуточный вариант, когда структура данных простая и заранее известна.
Сравнение способов сериализации
Полный контроль над форматом, подходит для REST API. Требует писать код преобразования каждой колонки.
Минимум кода для массивов и структур. Таблицу значений нужно сначала преобразовать вручную, ссылки и специальные типы требуют функции преобразования.
Сохраняет все типы 1С, читается обратно без потерь. Формат избыточен и неудобен для внешних систем.
Как записать таблицу значений в JSON через цикл и ЗаписьJSON
Базовый алгоритм: создать массив, для каждой строки таблицы сформировать структуру с нужными полями, добавить структуру в массив, затем записать массив в JSON. Такой код прозрачен и легко отлаживается.
Функция ТаблицаВJSON(Таблица) Экспорт
МассивСтрок = Новый Массив;
Для Каждого СтрокаТЗ Из Таблица Цикл
СтруктураСтроки = Новый Структура;
Для Каждого Колонка Из Таблица.Колонки Цикл
СтруктураСтроки.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
МассивСтрок.Добавить(СтруктураСтроки);
КонецЦикла;
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, МассивСтрок);
Возврат Запись.Закрыть();
КонецФункции
Обратите внимание: имена ключей структуры должны быть допустимыми идентификаторами 1С, поэтому колонки с именами, содержащими пробелы или начинающимися с цифры, вызовут ошибку. Если таблица приходит из запроса с псевдонимами вида «Номенклатура Наименование», перед вставкой в структуру имя нужно нормализовать — например, заменить пробелы на подчёркивания.
Если нужен «красивый» вывод с отступами для чтения человеком, используйте параметры записи: Новый ПараметрыЗаписиJSON(, Символы.Таб) и передайте их в конструктор ЗаписьJSON. Для машинного обмена компактный вариант без отступов предпочтительнее — он меньше по объёму.
- 1Создайте пустой массив для будущих строк
- 2Пройдите циклом по строкам таблицы значений
- 3Для каждой строки соберите структуру по списку колонок
- 4Преобразуйте даты, ссылки и булево в нужный формат
- 5Запишите массив через ЗаписатьJSON
- 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 значимы.
Как проверить результат
Совпадает с числом строк таблицы
Меньше или больше — проверяйте цикл и фильтры
Единый формат, например ISO 8601
Смешанные форматы или пустые строки вместо дат
Передаётся GUID или согласованное представление
Строка вида «Номенклатура 00-000001» там, где ждут GUID
ПрочитатьJSON выполняется без ошибок
Ошибка разбора — невалидный JSON
Типичные ошибки и ограничения
Самая частая ошибка — попытка записать таблицу значений напрямую через ЗаписатьJSON без преобразования в массив структур. Стандартная запись не знает, как сериализовать этот объект, и вы получите либо ошибку, либо пустой объект. Вторая типичная проблема — имена колонок, недопустимые для ключей структуры: пробелы, дефисы, цифра в начале.
Из ограничений стоит помнить о кодировке: УстановитьСтроку() отдаёт строку в Unicode, но при записи в файл через ЗаписьТекста явно указывайте кодировку UTF-8, иначе кириллица может испортиться при чтении внешней системой. Также большие таблицы (сотни тысяч строк) лучше писать потоково в файл через ЗаписьJSON.ОткрытьФайл(), а не собирать гигантскую строку в памяти.
Часто задаваемые вопросы
Можно ли записать таблицу значений в JSON одной командой без цикла?
Напрямую — нет: ни ЗаписатьJSON, ни ЗначениеВJSON не сериализуют таблицу значений как массив объектов. Варианты без явного цикла — это СериализаторXDTO (формат XDTO, подходит для обмена между базами 1С) или выгрузка таблицы в массив через собственную универсальную функцию, которую вы пишете один раз и переиспользуете.
Как записать в JSON только часть колонок таблицы?
В цикле формируйте структуру не по всем колонкам, а по явному списку нужных имён. Это заодно защищает контракт обмена: если в таблицу позже добавят служебную колонку, она не «протечёт» во внешний JSON.
Как сохранить JSON в файл, а не в строку?
Используйте ЗаписьJSON с методом ОткрытьФайл(ИмяФайла, "UTF-8") вместо УстановитьСтроку. Запись пойдёт сразу в файл, что экономит память на больших таблицах. Второй вариант — получить строку и сохранить её через ЗаписьТекста с явным указанием кодировки UTF-8.
Почему после обратного чтения даты стали строками?
JSON не имеет типа «дата», поэтому при чтении даты остаются строками. Преобразуйте их обратно вручную по известному формату или используйте ПрочитатьJSON с параметром ПрочитатьВСоответствие и последующей обработкой, либо задайте свойства с ожидаемым типом даты через параметры чтения.
Что лучше для REST API: структуры или соответствия?
Для формирования исходящего JSON разницы нет — и структуры, и соответствия сериализуются в объекты. Структуры удобнее, когда набор полей фиксирован, соответствия — когда ключи произвольные или содержат символы, недопустимые в идентификаторах (например, ключи с дефисами).
Что важно запомнить
Таблицу значений преобразуйте в массив структур и записывайте через ЗаписьJSON, явно обрабатывая даты и ссылки. Для обмена между базами 1С с сохранением типов используйте СериализаторXDTO. Результат всегда проверяйте обратным чтением и сверкой количества строк.