Как перевести значения Таблицы Значений в простые типы для выгрузки в JSON

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

При разработке механизмов интеграции, будь то обмен через REST API, выгрузка в сторонние системы или веб-сервисы, мы часто сталкиваемся с необходимостью передать данные из 1С в формате JSON. Основная сложность заключается в том, что 1С оперирует сложными типами данных: СправочникСсылка, ПеречислениеСсылка, УникальныйИдентификатор и вложенными таблицами. JSON же «понимает» только простые типы: строки, числа, булево, массивы и объекты (структуры).

В этой статье мы подробно разберем, как автоматизировать процесс приведения Таблицы Значений (ТЗ) к примитивным типам, чтобы не прописывать каждое поле в запросе вручную, и какие инструменты платформы 1С сделают это наиболее эффективно.

Метод 1. Использование функций запроса для получения идентификаторов

Рассмотрим стандартный способ получения строкового представления ссылок непосредственно в запросе. Если нам нужно получить GUID объекта, мы используем функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР(). Однако стоит помнить, что результат этой функции в запросе все еще является объектом типа «Уникальный идентификатор», а не строкой. Для JSON-сериализации нам часто требуется именно строковое значение.

Посмотрим на пример запроса, который преобразует ссылки в идентификаторы:


ВЫБРАТЬ
    Номенклатура.Наименование КАК Наименование,
    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Номенклатура.Ссылка) КАК Идентификатор,
    ПРЕДСТАВЛЕНИЕ(Номенклатура.СтавкаНДС) КАК СтавкаНДС_Строка
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Проанализируем этот подход: использование ПРЕДСТАВЛЕНИЕ() полезно для перечислений или отображения данных пользователю, но для программной синхронизации лучше передавать именно GUID. Чтобы преобразовать результат УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в чистую строку в коде 1С, после выполнения запроса нам все равно придется пройтись по таблице циклом или использовать специализированные методы сериализации.

Метод 2. Динамическое построение запроса через метаданные

Чтобы не перечислять 50 реквизитов справочника вручную (как это показано в Сообщении 3 форума), мы можем применить программное формирование текста запроса. Это позволит автоматически добавлять УНИКАЛЬНЫЙИДЕНТИФИКАТОР() для всех ссылочных полей.

Разберем, как это реализовать:


Функция СформироватьТекстЗапросаПоМетаданным(ИмяСправочника)
    ТекстПолей = "";
    Мета = Метаданные.Справочники[ИмяСправочника];
    
    Для Каждого Реквизит Из Мета.Реквизиты Цикл
        Если ТекстПолей <> "" Тогда
            ТекстПолей = ТекстПолей + ", " + Символы.ПС;
        КонецЕсли;
        
        // Проверяем тип реквизита
        Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда // упрощенно
             ТекстПолей = ТекстПолей + "УНИКАЛЬНЫЙИДЕНТИФИКАТОР(" + Реквизит.Имя + ") КАК " + Реквизит.Имя;
        Иначе
             ТекстПолей = ТекстПолей + Реквизит.Имя;
        КонецЕсли;
    КонецЦикла;
    
    Возврат "ВЫБРАТЬ " + ТекстПолей + " ИЗ Справочник." + ИмяСправочника;
КонецФункции

Такой подход экономит время разработчика и минимизирует ошибки при обновлении конфигурации — новые реквизиты будут подхватываться автоматически.

Метод 3. Универсальное преобразование ТЗ в массив структур

Самый надежный способ подготовить данные для ЗаписьJSON — это преобразовать ТаблицаЗначений в Массив, содержащий объекты типа Структура. При этом в процессе обхода мы будем заменять все ссылки на их строковые представления.

Рассмотрим по шагам, как написать универсальную функцию преобразования:

  1. Создаем массив для хранения строк таблицы.
  2. Для каждой строки ТЗ создаем структуру, где ключи — это имена колонок.
  3. Проверяем тип каждого значения. Если это ссылка — вызываем XMLСтрока() или Строка(Ссылка.УникальныйИдентификатор()).
  4. Если это табличная часть (вложенная ТЗ) — рекурсивно вызываем эту же функцию.

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

Важный момент: использование XMLСтрока(Ссылка) — это самый быстрый способ получить строковый GUID в 1С. Этот метод работает быстрее, чем создание объекта УникальныйИдентификатор.

Метод 4. Использование Сериализатора XDTO

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

Выясним, как это работает на практике:


// Пример записи значения через XDTO
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(Запись, СсылкаНаОбъект, НазначениеТипаXML.Явное);
РезультатJSON = Запись.Закрыть();

Этот метод идеален, если вам нужно выгрузить объект целиком. Однако, если вы работаете с произвольной выборкой из запроса, преобразование через массив структур (Метод 3) остается более гибким и контролируемым.

Нюансы с перечислениями и булевыми значениями

При выгрузке Перечислений часто встает вопрос: что передавать? Если передать ПРЕДСТАВЛЕНИЕ(), принимающая сторона получит локализованную строку (например, «Закупка»). Если передать Имя значения через метаданные, это будет надежнее для интеграции.

Что касается типов Число и Булево: при записи в JSON через объект ЗаписьJSON, платформа 1С автоматически сконвертирует их в правильный формат (числа без кавычек, true/false в нижнем регистре). Поэтому при формировании структур не нужно преобразовывать числа в строки — оставляйте их как есть.

Подведем итог: для перевода ТЗ в простые типы лучше всего использовать комбинацию динамического формирования запроса и последующего обхода результата с преобразованием ссылок через XMLСтрока(). Это обеспечит высокую производительность и чистоту данных в итоговом JSON-файле.

← На главную