Интеграция с Telegram стала стандартом для современных систем на базе 1С. Основной формат обмена данными здесь — JSON. Для начинающего разработчика работа с этим форматом может показаться запутанной, особенно когда речь идет о вложенных структурах и массивах. В данной статье мы подробно разберем, как получить строку JSON, превратить ее в понятные платформе 1С объекты и корректно сохранить информацию в справочник.
Первым делом нам необходимо преобразовать текстовую строку, полученную от сервера Telegram, во внутренний объект 1С (обычно это Структура или Соответствие). Для этого в платформе предусмотрены встроенные средства работы с JSON. Рассмотрим базовый алгоритм парсинга.
Проанализируем программный код, который выполняет эту задачу:
// Предположим, что Ответ.СтрокаJSON содержит текст ответа от Telegram
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.СтрокаJSON);
// Читаем данные в структуру. Второй параметр Ложь позволяет получить Соответствие,
// что полезно, если ключи JSON содержат спецсимволы.
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
После выполнения этого кода переменная Данные станет объектом типа Структура. Мы сможем обращаться к полям JSON через точку, например: Данные.ok или Данные.result.user.id. Однако стоит помнить, что если ключ в JSON начинается с цифры или содержит тире, обратиться через точку не получится — в этом случае используйте обращение через квадратные скобки: Данные.result["user-id"].
Когда данные разобраны, их нужно сохранить. Типичная ошибка новичков — попытка редактирования ссылки, возвращаемой поиском. Разберем правильный порядок действий: сначала ищем существующий элемент, и если он не найден — создаем новый. Важно помнить, что для изменения данных нам всегда нужен Объект, а не Ссылка.
Рассмотрим пошагово процесс записи пользователя:
// Извлекаем данные из структуры
IDПользователя = Данные.result.user.id;
ИмяПользователя = Данные.result.user.first_name;
Никнейм = ?(Данные.result.user.Property("username"), Данные.result.user.username, "");
// Ищем существующего пользователя по ID
СсылкаНаПользователя = Справочники.ПользователиТелеграмм.НайтиПоРеквизиту("ID", IDПользователя);
Если СсылкаНаПользователя.Пустая() Тогда
// Если не нашли — создаем новый элемент
ОбъектПользователь = Справочники.ПользователиТелеграмм.СоздатьЭлемент();
ОбъектПользователь.ID = IDПользователя;
Иначе
// Если нашли — получаем объект для редактирования
ОбъектПользователь = СсылкаНаПользователя.ПолучитьОбъект();
КонецЕсли;
// Заполняем реквизиты
ОбъектПользователь.Наименование = ИмяПользователя;
ОбъектПользователь.Ник = Никнейм;
// Записываем данные в базу
Попытка
ОбъектПользователь.Записать();
Исключение
Сообщить("Ошибка при записи пользователя: " + ОписаниеОшибки());
КонецПопытки;
Обратите внимание на использование метода Property() (или Свойство() в русской нотации). Это критически важно при работе с внешними API, так как некоторые поля могут отсутствовать в ответе, и прямое обращение через точку вызовет ошибку выполнения.
Часто Telegram возвращает данные в виде вложенных списков. Яркий пример — получение фотографий профиля (метод getUserProfilePhotos). В JSON это выглядит как массив массивов: "photos": [[{...}, {...}]].
Выясним причину такой структуры: внешний массив содержит наборы фотографий (у пользователя может быть несколько фото в профиле), а внутренний массив содержит разные размеры одной и той же фотографии. Обычно первый элемент внутреннего массива — это превью (самый маленький размер), а последний — оригинал в высоком разрешении.
Проанализируем ситуацию, как получить file_id самой большой версии первой фотографии профиля:
Если Данные.result.total_count > 0 Тогда
// Получаем массив вариантов первой фотографии
ВариантыФото = Данные.result.photos[0];
// Берем последний элемент (самый большой размер)
ИндексПоследнего = ВариантыФото.Количество() - 1;
НужноеФото = ВариантыФото[ИндексПоследнего];
IDФайла = НужноеФото.file_id;
Сообщить("ID файла фотографии: " + IDФайла);
КонецЕсли;
Всегда проверяйте количество элементов в массиве перед обращением по индексу (например, через Количество() > 0), иначе ваша обработка аварийно завершится, если у пользователя нет фото.
При реализации обмена данными следует учитывать несколько критических моментов, которые обеспечат стабильность вашей системы:
Число(20, 0) или Строка(50). Обычное число может не вместить значение и вызвать потерю точности.HTTPСоединение убедитесь, что вы правильно интерпретируете поток байтов, чтобы избежать появления некорректных символов в именах пользователей."ok": false. Всегда проверяйте это поле перед тем, как пытаться прочитать result.Попытка ... Исключение. Сетевые задержки или блокировки базы данных не должны приводить к "падению" всей системы.Использование функции ПрочитатьJSON в сочетании с проверкой свойств через Свойство() и получением объекта через ПолучитьОбъект() является наиболее надежным способом интеграции 1С с Telegram. Понимая структуру вложенных массивов, вы сможете легко извлекать не только текстовую информацию, но и работать с медиафайлами, документами и сложными командами ботов.