При разработке механизмов интеграции, будь то обмен через REST API, выгрузка в сторонние системы или веб-сервисы, мы часто сталкиваемся с необходимостью передать данные из 1С в формате JSON. Основная сложность заключается в том, что 1С оперирует сложными типами данных: СправочникСсылка, ПеречислениеСсылка, УникальныйИдентификатор и вложенными таблицами. JSON же «понимает» только простые типы: строки, числа, булево, массивы и объекты (структуры).
В этой статье мы подробно разберем, как автоматизировать процесс приведения Таблицы Значений (ТЗ) к примитивным типам, чтобы не прописывать каждое поле в запросе вручную, и какие инструменты платформы 1С сделают это наиболее эффективно.
Рассмотрим стандартный способ получения строкового представления ссылок непосредственно в запросе. Если нам нужно получить GUID объекта, мы используем функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР(). Однако стоит помнить, что результат этой функции в запросе все еще является объектом типа «Уникальный идентификатор», а не строкой. Для JSON-сериализации нам часто требуется именно строковое значение.
Посмотрим на пример запроса, который преобразует ссылки в идентификаторы:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Номенклатура.Ссылка) КАК Идентификатор,
ПРЕДСТАВЛЕНИЕ(Номенклатура.СтавкаНДС) КАК СтавкаНДС_Строка
ИЗ
Справочник.Номенклатура КАК Номенклатура
Проанализируем этот подход: использование ПРЕДСТАВЛЕНИЕ() полезно для перечислений или отображения данных пользователю, но для программной синхронизации лучше передавать именно GUID. Чтобы преобразовать результат УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в чистую строку в коде 1С, после выполнения запроса нам все равно придется пройтись по таблице циклом или использовать специализированные методы сериализации.
Чтобы не перечислять 50 реквизитов справочника вручную (как это показано в Сообщении 3 форума), мы можем применить программное формирование текста запроса. Это позволит автоматически добавлять УНИКАЛЬНЫЙИДЕНТИФИКАТОР() для всех ссылочных полей.
Разберем, как это реализовать:
Функция СформироватьТекстЗапросаПоМетаданным(ИмяСправочника)
ТекстПолей = "";
Мета = Метаданные.Справочники[ИмяСправочника];
Для Каждого Реквизит Из Мета.Реквизиты Цикл
Если ТекстПолей <> "" Тогда
ТекстПолей = ТекстПолей + ", " + Символы.ПС;
КонецЕсли;
// Проверяем тип реквизита
Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда // упрощенно
ТекстПолей = ТекстПолей + "УНИКАЛЬНЫЙИДЕНТИФИКАТОР(" + Реквизит.Имя + ") КАК " + Реквизит.Имя;
Иначе
ТекстПолей = ТекстПолей + Реквизит.Имя;
КонецЕсли;
КонецЦикла;
Возврат "ВЫБРАТЬ " + ТекстПолей + " ИЗ Справочник." + ИмяСправочника;
КонецФункции
Такой подход экономит время разработчика и минимизирует ошибки при обновлении конфигурации — новые реквизиты будут подхватываться автоматически.
Самый надежный способ подготовить данные для ЗаписьJSON — это преобразовать ТаблицаЗначений в Массив, содержащий объекты типа Структура. При этом в процессе обхода мы будем заменять все ссылки на их строковые представления.
Рассмотрим по шагам, как написать универсальную функцию преобразования:
XMLСтрока() или Строка(Ссылка.УникальныйИдентификатор()).
Функция ПреобразоватьТЗвПростыеТипы(ТаблицаДанных)
Результат = Новый Массив;
Колонки = ТаблицаДанных.Колонки;
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
НоваяСтрока = Новый Структура;
Для Каждого Колонка Из Колонки Цикл
Значение = СтрокаТЗ[Колонка.Имя];
// Анализируем тип значения
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение))
ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда
НоваяСтрока.Вставить(Колонка.Имя, XMLСтрока(Значение));
ИначеЕсли ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
НоваяСтрока.Вставить(Колонка.Имя, ПреобразоватьТЗвПростыеТипы(Значение));
Иначе
НоваяСтрока.Вставить(Колонка.Имя, Значение);
КонецЕсли;
КонецЦикла;
Результат.Добавить(НоваяСтрока);
КонецЦикла;
Возврат Результат;
КонецФункции
Важный момент: использование XMLСтрока(Ссылка) — это самый быстрый способ получить строковый GUID в 1С. Этот метод работает быстрее, чем создание объекта УникальныйИдентификатор.
Для тех, кто хочет максимально использовать возможности платформы, существует объект СериализаторXDTO. Он умеет автоматически переводить объекты 1С (включая ссылки) в формат, пригодный для передачи. Ссылки при этом автоматически становятся строками-идентификаторами.
Выясним, как это работает на практике:
// Пример записи значения через XDTO
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(Запись, СсылкаНаОбъект, НазначениеТипаXML.Явное);
РезультатJSON = Запись.Закрыть();
Этот метод идеален, если вам нужно выгрузить объект целиком. Однако, если вы работаете с произвольной выборкой из запроса, преобразование через массив структур (Метод 3) остается более гибким и контролируемым.
При выгрузке Перечислений часто встает вопрос: что передавать? Если передать ПРЕДСТАВЛЕНИЕ(), принимающая сторона получит локализованную строку (например, «Закупка»). Если передать Имя значения через метаданные, это будет надежнее для интеграции.
Что касается типов Число и Булево: при записи в JSON через объект ЗаписьJSON, платформа 1С автоматически сконвертирует их в правильный формат (числа без кавычек, true/false в нижнем регистре). Поэтому при формировании структур не нужно преобразовывать числа в строки — оставляйте их как есть.
Подведем итог: для перевода ТЗ в простые типы лучше всего использовать комбинацию динамического формирования запроса и последующего обхода результата с преобразованием ссылок через XMLСтрока(). Это обеспечит высокую производительность и чистоту данных в итоговом JSON-файле.