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

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

Интеграция с Telegram стала стандартом для современных систем на базе 1С. Основной формат обмена данными здесь — JSON. Для начинающего разработчика работа с этим форматом может показаться запутанной, особенно когда речь идет о вложенных структурах и массивах. В данной статье мы подробно разберем, как получить строку JSON, превратить ее в понятные платформе 1С объекты и корректно сохранить информацию в справочник.

Шаг 1. Парсинг строки JSON в структуру 1С

Первым делом нам необходимо преобразовать текстовую строку, полученную от сервера Telegram, во внутренний объект 1С (обычно это Структура или Соответствие). Для этого в платформе предусмотрены встроенные средства работы с JSON. Рассмотрим базовый алгоритм парсинга.

Проанализируем программный код, который выполняет эту задачу:


// Предположим, что Ответ.СтрокаJSON содержит текст ответа от Telegram
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.СтрокаJSON);

// Читаем данные в структуру. Второй параметр Ложь позволяет получить Соответствие, 
// что полезно, если ключи JSON содержат спецсимволы.
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

После выполнения этого кода переменная Данные станет объектом типа Структура. Мы сможем обращаться к полям JSON через точку, например: Данные.ok или Данные.result.user.id. Однако стоит помнить, что если ключ в JSON начинается с цифры или содержит тире, обратиться через точку не получится — в этом случае используйте обращение через квадратные скобки: Данные.result["user-id"].

Шаг 2. Поиск и создание записи в справочнике

Когда данные разобраны, их нужно сохранить. Типичная ошибка новичков — попытка редактирования ссылки, возвращаемой поиском. Разберем правильный порядок действий: сначала ищем существующий элемент, и если он не найден — создаем новый. Важно помнить, что для изменения данных нам всегда нужен Объект, а не Ссылка.

Рассмотрим пошагово процесс записи пользователя:


// Извлекаем данные из структуры
IDПользователя = Данные.result.user.id;
ИмяПользователя = Данные.result.user.first_name;
Никнейм = ?(Данные.result.user.Property("username"), Данные.result.user.username, "");

// Ищем существующего пользователя по ID
СсылкаНаПользователя = Справочники.ПользователиТелеграмм.НайтиПоРеквизиту("ID", IDПользователя);

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

// Заполняем реквизиты
ОбъектПользователь.Наименование = ИмяПользователя;
ОбъектПользователь.Ник = Никнейм;

// Записываем данные в базу
Попытка
    ОбъектПользователь.Записать();
Исключение
    Сообщить("Ошибка при записи пользователя: " + ОписаниеОшибки());
КонецПопытки;

Обратите внимание на использование метода Property() (или Свойство() в русской нотации). Это критически важно при работе с внешними API, так как некоторые поля могут отсутствовать в ответе, и прямое обращение через точку вызовет ошибку выполнения.

Шаг 3. Работа со сложными структурами (массивы в массивах)

Часто Telegram возвращает данные в виде вложенных списков. Яркий пример — получение фотографий профиля (метод getUserProfilePhotos). В JSON это выглядит как массив массивов: "photos": [[{...}, {...}]].

Выясним причину такой структуры: внешний массив содержит наборы фотографий (у пользователя может быть несколько фото в профиле), а внутренний массив содержит разные размеры одной и той же фотографии. Обычно первый элемент внутреннего массива — это превью (самый маленький размер), а последний — оригинал в высоком разрешении.

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


Если Данные.result.total_count > 0 Тогда
    // Получаем массив вариантов первой фотографии
    ВариантыФото = Данные.result.photos[0]; 
    
    // Берем последний элемент (самый большой размер)
    ИндексПоследнего = ВариантыФото.Количество() - 1;
    НужноеФото = ВариантыФото[ИндексПоследнего];
    
    IDФайла = НужноеФото.file_id;
    Сообщить("ID файла фотографии: " + IDФайла);
КонецЕсли;

Всегда проверяйте количество элементов в массиве перед обращением по индексу (например, через Количество() > 0), иначе ваша обработка аварийно завершится, если у пользователя нет фото.

Важные технические нюансы

При реализации обмена данными следует учитывать несколько критических моментов, которые обеспечат стабильность вашей системы:

  1. Типы данных для ID: Идентификаторы пользователей Telegram — это очень большие целые числа. В 1С для хранения таких ID рекомендуется использовать реквизит с типом Число(20, 0) или Строка(50). Обычное число может не вместить значение и вызвать потерю точности.
  2. Кодировка: Все данные от Telegram приходят в кодировке UTF-8. При чтении ответа через HTTPСоединение убедитесь, что вы правильно интерпретируете поток байтов, чтобы избежать появления некорректных символов в именах пользователей.
  3. Обработка ошибок API: Даже если HTTP-запрос вернул код 200, в самом теле JSON может содержаться "ok": false. Всегда проверяйте это поле перед тем, как пытаться прочитать result.
  4. Таймауты и безопасность: Оборачивайте блоки чтения и записи в конструкцию Попытка ... Исключение. Сетевые задержки или блокировки базы данных не должны приводить к "падению" всей системы.

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

← На главную