При разработке мобильных решений для выездных сотрудников часто возникает необходимость получать их текущую геолокацию. Telegram Bot API предоставляет штатный механизм запроса координат с помощью специальной кнопки в клавиатуре. Рассмотрим, как правильно сформировать запрос из 1С, избежав частых ошибок экранирования и передачи типов данных в 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}]]}";
Склеивание 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 с соблюдением всех типов данных и кавычек.
Рассмотрим важные нюансы, которые необходимо учитывать при проектировании взаимодействия с выездными сотрудниками:
request_location работает только для обычной клавиатуры под полем ввода (keyboard или ReplyKeyboardMarkup). Для инлайн-кнопок (inline_keyboard) данный параметр использовать нельзя.При нажатии сотрудником кнопки «Мои координаты» Telegram отправляет в 1С не текстовое сообщение, а объект с типом location. В таком сообщении поле text может отсутствовать.
Посмотрим на пример обработки полученного ответа при десериализации через ПрочитатьJSON:
// Выясним структуру входящего сообщения (Message)
Если ВходящееСообщение.Свойство("location") Тогда
ДанныеЛокации = ВходящееСообщение.location;
Широта = ДанныеЛокации.latitude; // Число с плавающей точкой
Долгота = ДанныеЛокации.longitude; // Число с плавающей точкой
// Погрешность в метрах передается не всегда, проверяем ее наличие
Погрешность = 0;
Если ДанныеЛокации.Свойство("horizontal_accuracy") Тогда
Погрешность = ДанныеЛокации.horizontal_accuracy;
КонецЕсли;
// Записываем полученные координаты в регистр или документ 1С
// ...
КонецЕсли;
Таким образом, сочетание правильного формирования структуры JSON в 1С и корректной обработки входящего объекта location позволяет надежно получать координаты выездных сотрудников в системе 1С.