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

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

При разработке мобильных решений для выездных сотрудников часто возникает необходимость получать их текущую геолокацию. Telegram Bot API предоставляет штатный механизм запроса координат с помощью специальной кнопки в клавиатуре. Рассмотрим, как правильно сформировать запрос из 1С, избежав частых ошибок экранирования и передачи типов данных в JSON.

Разбор типичной ошибки при формировании JSON

Основная проблема при ручной сборке JSON-строк в 1С заключается в правильной передаче типов данных и экранировании кавычек. Для включения функции запроса геолокации используется параметр request_location.

Если передать параметр в кавычках (как строку "true"), Telegram API не распознает команду и просто не отобразит клавиатуру:


// Ошибочный вариант (кнопка не отобразится):
стр = "Тест координат " + "&reply_markup={""keyboard"":[[{""text"":""Мои координаты"",""request_location"":""true""}]]}";

Параметр request_location принимает строго булево значение (true или false). При правильном ручном формировании строки значение true пишется без кавычек:


// Корректный рабочий вариант:
стр = "Тест координат " + "&reply_markup={""keyboard"":[[{""text"":""Мои координаты"",""request_location"":true}]]}";

Формирование структуры клавиатуры средствами 1С (HTTP POST)

Склеивание JSON вручную через строки приводит к путанице с кавычками. Разберем более надежный и корректный подход: использование штатных объектов 1С Структура, Массив и ЗаписьJSON для отправки данных методом POST.

Проанализируем пример создания объекта клавиатуры:


// Создаем структуру одной кнопки
Кнопка = Новый Структура;
Кнопка.Вставить("text", "Мои координаты");
Кнопка.Вставить("request_location", Истина); // Передаем булево значение Истина

// Помещаем кнопку в массив строки клавиатуры
РядКнопок = Новый Массив;
РядКнопок.Добавить(Кнопка);

// Создаем общий массив клавиатуры
КлавиатураМассив = Новый Массив;
КлавиатураМассив.Добавить(РядКнопок);

// Собираем объект reply_markup
Клавиатура = Новый Структура;
Клавиатура.Вставить("keyboard", КлавиатураМассив);
Клавиатура.Вставить("resize_keyboard", Истина); // Уменьшает кнопку по высоте
Клавиатура.Вставить("one_time_keyboard", Истина); // Скрывает клавиатуру после нажатия

// Сериализуем структуру в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Клавиатура);
СтрокаJSON = ЗаписьJSON.Закрыть();

При таком подходе платформа 1С автоматически сформирует валидный JSON с соблюдением всех типов данных и кавычек.

Ограничения и особенности работы геолокации в Telegram

Рассмотрим важные нюансы, которые необходимо учитывать при проектировании взаимодействия с выездными сотрудниками:

  1. Поддержка типов клавиатур: Запрос геолокации через request_location работает только для обычной клавиатуры под полем ввода (keyboard или ReplyKeyboardMarkup). Для инлайн-кнопок (inline_keyboard) данный параметр использовать нельзя.
  2. Зависимость от устройства: Функция передачи координат предназначена для мобильных приложений Telegram (iOS, Android) при включенных службах геолокации на устройстве. В десктопной версии Telegram кнопка может быть неактивной.

Обработка входящих координат на стороне 1С

При нажатии сотрудником кнопки «Мои координаты» Telegram отправляет в 1С не текстовое сообщение, а объект с типом location. В таком сообщении поле text может отсутствовать.

Посмотрим на пример обработки полученного ответа при десериализации через ПрочитатьJSON:


// Выясним структуру входящего сообщения (Message)
Если ВходящееСообщение.Свойство("location") Тогда
    
    ДанныеЛокации = ВходящееСообщение.location;
    
    Широта = ДанныеЛокации.latitude;   // Число с плавающей точкой
    Долгота = ДанныеЛокации.longitude; // Число с плавающей точкой
    
    // Погрешность в метрах передается не всегда, проверяем ее наличие
    Погрешность = 0;
    Если ДанныеЛокации.Свойство("horizontal_accuracy") Тогда
        Погрешность = ДанныеЛокации.horizontal_accuracy;
    КонецЕсли;
    
    // Записываем полученные координаты в регистр или документ 1С
    // ...
    
КонецЕсли;

Таким образом, сочетание правильного формирования структуры JSON в 1С и корректной обработки входящего объекта location позволяет надежно получать координаты выездных сотрудников в системе 1С.

← На главную