Как заполнить справочник 1С данными из JSON-запроса?

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

В современной разработке на платформе 1С задача интеграции с внешними сервисами (такими как Bitrix24, CRM-системы или интернет-магазины) встречается повсеместно. Основным форматом обмена данными является JSON. Для новичка процесс преобразования текстовой строки JSON в полноценный объект справочника может показаться сложным, но если разобрать его по этапам, алгоритм становится прозрачным и логичным. В этой статье мы подробно разберем, как прочитать данные, как обработать вложенные структуры и как автоматизировать заполнение реквизитов справочника.

Этап 1. Правильное чтение 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: " + ОшибкаЧтения);
    Возврат;
КонецЕсли;

Этап 2. Работа с вложенными данными

Рассмотрим структуру JSON из примера. Данные задачи не лежат на верхнем уровне, они вложены в объект result, который содержит объект task. Чтобы добраться до идентификатора задачи, нам нужно пройти по цепочке ключей. Выясним, как это сделать программно.

Если мы прочитали JSON в Соответствие, доступ к элементам осуществляется методом Получить(). Если в Структуру — через точку или квадратные скобки. Разберем универсальный подход для Соответствия:


// Извлекаем уровень "result"
ДанныеРезультата = Результат.Получить("result");
Если ДанныеРезультата <> Неопределено Тогда
    // Извлекаем уровень "task"
    ДанныеЗадачи = ДанныеРезультата.Получить("task");
    
    Если ДанныеЗадачи <> Неопределено Тогда
        ИдентификаторЗадачи = ДанныеЗадачи.Получить("id");
        ЗаголовокЗадачи = ДанныеЗадачи.Получить("title");
        // Теперь у нас есть конкретные значения для записи в справочник
    КонецЕсли;
КонецЕсли;

Проанализируем ситуацию: если данных много, прописывать каждый реквизит вручную трудозатратно. Поэтому перейдем к автоматизации.

Этап 3. Поиск существующего элемента и создание нового

Прежде чем записывать данные, крайне важно проверить, нет ли уже такой записи в справочнике. Это предотвратит дублирование. Рекомендуется создать в справочнике отдельный реквизит, например, ИдентификаторВнешнейСистемы (тип Строка или Число), и индексировать его.

Рассмотрим алгоритм поиска:


ИдентификаторВнешний = ДанныеЗадачи.Получить("id");
СсылкаНаЭлемент = Справочники.ВнешниеЗадачи.НайтиПоРеквизиту("ИдентификаторВнешнейСистемы", ИдентификаторВнешний);

Если СсылкаНаЭлемент.Пустая() Тогда
    ОбъектСправочника = Справочники.ВнешниеЗадачи.СоздатьЭлемент();
    ОбъектСправочника.ИдентификаторВнешнейСистемы = ИдентификаторВнешний;
Иначе
    ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();
КонецЕсли;

Этап 4. Автоматическое заполнение реквизитов

Теперь разберем, как сопоставить поля 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 важно учитывать, что не все данные являются примитивными (строка, число, дата). Выясним, как обрабатывать специфические случаи:

  1. Массивы: Если в JSON поле представлено в виде "tags": ["urgent", "web"], то в 1С оно станет объектом типа Массив. Его нельзя просто записать в обычный реквизит. Такие данные нужно либо преобразовывать в строку через СтрСоединить(), либо записывать в табличную часть справочника.
  2. Даты с часовым поясом: В JSON из примера дата указана с суффиксом +07:00. Функция ПрочитатьДатуJSON корректно обработает её, но помните, что 1С хранит дату без привязки к поясу. Время может "сдвинуться" относительно вашего локального времени.
  3. Логические поля (Булево): Обращайте внимание, как внешняя система передает "истину". Это может быть логическое true, строка "Y", число 1. Ваша процедура заполнения должна уметь интерпретировать эти варианты.

Использование XDTO (альтернативный метод)

Если структура вашего JSON очень сложная и строго регламентированная, стоит рассмотреть использование XDTO-сериализатора. Этот метод позволяет создать в 1С схему (XSD), которая описывает структуру входящего сообщения. В этом случае вы используете ФабрикаXDTO.ПрочитатьJSON() и получаете объект, поля которого типизированы согласно схеме. Это избавляет от необходимости вручную проверять Неопределено на каждом уровне вложенности и позволяет обращаться к данным через точку: МойОбъект.result.task.id.

Подведем итог. Для успешного заполнения справочника из JSON необходимо:

  1. Выбрать правильный режим чтения (Структура или Соответствие).
  2. Корректно обойти дерево вложенности до нужного узла данных.
  3. Реализовать поиск существующего элемента по уникальному внешнему ключу.
  4. Использовать автоматизированный обход реквизитов через метаданные для сокращения кода.
  5. Не забыть вызвать метод Объект.Записать() после завершения заполнения.

Используя предложенные выше методы и примеры кода, вы сможете создать гибкий и надежный механизм загрузки данных, который будет легко поддерживать и развивать.

← На главную