В современной разработке на платформе 1С задача интеграции с внешними сервисами (такими как Bitrix24, CRM-системы или интернет-магазины) встречается повсеместно. Основным форматом обмена данными является JSON. Для новичка процесс преобразования текстовой строки JSON в полноценный объект справочника может показаться сложным, но если разобрать его по этапам, алгоритм становится прозрачным и логичным. В этой статье мы подробно разберем, как прочитать данные, как обработать вложенные структуры и как автоматизировать заполнение реквизитов справочника.
Первым шагом нам необходимо преобразовать строку JSON в объект, с которым умеет работать 1С. Для этого используются встроенные механизмы: ЧтениеJSON и функция ПрочитатьJSON. Однако здесь есть важный технический нюанс. Функция ПрочитатьJSON может возвращать данные в виде Структуры или Соответствия.
Структура работает быстрее, но имеет жесткое ограничение: ключи в JSON должны соответствовать правилам именования переменных в 1С (не могут начинаться с цифр, содержать пробелы или спецсимволы). Если ваш JSON содержит ключи типа "1_Task" или "Customer Name", попытка чтения в структуру вызовет ошибку.
Соответствие лишено этих ограничений и является более отказоустойчивым методом при работе с внешними API. Проанализируем наиболее надежный способ чтения, который использует попытку чтения в структуру, а при неудаче — в соответствие:
ЧтениеJSON = Новый ЧтениеJSON;
// Предположим, что в переменной ОтветСервера хранится текст вашего JSON
ЧтениеJSON.УстановитьСтроку(ОтветСервера);
Результат = Неопределено;
ОшибкаЧтения = "";
Попытка
// Пробуем прочитать в Структуру (второй параметр Ложь)
Результат = ПрочитатьJSON(ЧтениеJSON, Ложь);
Исключение
// Если не вышло, пробуем в Соответствие (второй параметр Истина)
// Важно: нужно заново инициализировать чтение, если поток был прерван
ЧтениеJSON.Закрыть();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСервера);
Попытка
Результат = ПрочитатьJSON(ЧтениеJSON, Истина);
Исключение
ОшибкаЧтения = ОписаниеОшибки();
КонецПопытки;
КонецПопытки;
Если Результат = Неопределено Тогда
Сообщить("Не удалось разобрать JSON: " + ОшибкаЧтения);
Возврат;
КонецЕсли;
Рассмотрим структуру JSON из примера. Данные задачи не лежат на верхнем уровне, они вложены в объект result, который содержит объект task. Чтобы добраться до идентификатора задачи, нам нужно пройти по цепочке ключей. Выясним, как это сделать программно.
Если мы прочитали JSON в Соответствие, доступ к элементам осуществляется методом Получить(). Если в Структуру — через точку или квадратные скобки. Разберем универсальный подход для Соответствия:
// Извлекаем уровень "result"
ДанныеРезультата = Результат.Получить("result");
Если ДанныеРезультата <> Неопределено Тогда
// Извлекаем уровень "task"
ДанныеЗадачи = ДанныеРезультата.Получить("task");
Если ДанныеЗадачи <> Неопределено Тогда
ИдентификаторЗадачи = ДанныеЗадачи.Получить("id");
ЗаголовокЗадачи = ДанныеЗадачи.Получить("title");
// Теперь у нас есть конкретные значения для записи в справочник
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию: если данных много, прописывать каждый реквизит вручную трудозатратно. Поэтому перейдем к автоматизации.
Прежде чем записывать данные, крайне важно проверить, нет ли уже такой записи в справочнике. Это предотвратит дублирование. Рекомендуется создать в справочнике отдельный реквизит, например, ИдентификаторВнешнейСистемы (тип Строка или Число), и индексировать его.
Рассмотрим алгоритм поиска:
ИдентификаторВнешний = ДанныеЗадачи.Получить("id");
СсылкаНаЭлемент = Справочники.ВнешниеЗадачи.НайтиПоРеквизиту("ИдентификаторВнешнейСистемы", ИдентификаторВнешний);
Если СсылкаНаЭлемент.Пустая() Тогда
ОбъектСправочника = Справочники.ВнешниеЗадачи.СоздатьЭлемент();
ОбъектСправочника.ИдентификаторВнешнейСистемы = ИдентификаторВнешний;
Иначе
ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();
КонецЕсли;
Теперь разберем, как сопоставить поля JSON с реквизитами справочника 1С автоматически. Мы можем перебрать метаданные справочника и, если имя реквизита совпадает с ключом в JSON, подставить значение. Посмотрим на пример реализации такой процедуры:
Процедура ЗаполнитьРеквизитыИзJSON(ОбъектЗаполнения, ДанныеJSON)
МетаданныеОбъекта = ОбъектЗаполнения.Метаданные();
Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
ИмяПоля = Реквизит.Имя;
// Ищем значение в JSON по имени реквизита
ЗначениеИзJSON = ДанныеJSON.Получить(ИмяПоля);
Если ЗначениеИзJSON = Неопределено Тогда
Продолжить; // Такого поля в JSON нет
КонецЕсли;
// Проверяем типы данных
ТипРеквизита = Реквизит.Тип;
Если ТипРеквизита.СодержитТип(Тип("Дата")) Тогда
// Обработка даты в формате ISO (например, 2020-10-15T16:20:11)
Попытка
ОбъектЗаполнения[ИмяПоля] = ПрочитатьДатуJSON(ЗначениеИзJSON, ФорматДатыJSON.ISO);
Исключение
// Если формат даты нестандартный, здесь нужна дополнительная обработка
КонецПопытки;
ИначеЕсли ТипРеквизита.СодержитТип(Тип("Булево")) Тогда
// В API часто передают "Y"/"N" вместо true/false
Если ЗначениеИзJSON = "Y" Или ЗначениеИзJSON = "true" Тогда
ОбъектЗаполнения[ИмяПоля] = Истина;
ИначеЕсли ЗначениеИзJSON = "N" Или ЗначениеИзJSON = "false" Тогда
ОбъектЗаполнения[ИмяПоля] = Ложь;
Иначе
ОбъектЗаполнения[ИмяПоля] = Булево(ЗначениеИзJSON);
КонецЕсли;
Иначе
// Для строк и чисел прямое присваивание (1С сама приведет типы, если это возможно)
ОбъектЗаполнения[ИмяПоля] = ЗначениеИзJSON;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
При работе с JSON важно учитывать, что не все данные являются примитивными (строка, число, дата). Выясним, как обрабатывать специфические случаи:
"tags": ["urgent", "web"], то в 1С оно станет объектом типа Массив. Его нельзя просто записать в обычный реквизит. Такие данные нужно либо преобразовывать в строку через СтрСоединить(), либо записывать в табличную часть справочника.+07:00. Функция ПрочитатьДатуJSON корректно обработает её, но помните, что 1С хранит дату без привязки к поясу. Время может "сдвинуться" относительно вашего локального времени.true, строка "Y", число 1. Ваша процедура заполнения должна уметь интерпретировать эти варианты.Если структура вашего JSON очень сложная и строго регламентированная, стоит рассмотреть использование XDTO-сериализатора. Этот метод позволяет создать в 1С схему (XSD), которая описывает структуру входящего сообщения. В этом случае вы используете ФабрикаXDTO.ПрочитатьJSON() и получаете объект, поля которого типизированы согласно схеме. Это избавляет от необходимости вручную проверять Неопределено на каждом уровне вложенности и позволяет обращаться к данным через точку: МойОбъект.result.task.id.
Подведем итог. Для успешного заполнения справочника из JSON необходимо:
Структура или Соответствие).Объект.Записать() после завершения заполнения.Используя предложенные выше методы и примеры кода, вы сможете создать гибкий и надежный механизм загрузки данных, который будет легко поддерживать и развивать.