Это не совсем туториал. Хотя вы найдете здесь рабочий пример несложной интеграции 1С и Telegram. В большей степени я хотел поделиться своими ощущениями от процесса. Мне приходилось делать множество интеграций 1С с различными системами. И я бы выделил работу с Telegram в ряду прочих. Выделение это будет с большим знаком "плюс" и вот почему.

Описание задачи

Задача интеграции изначально была сформулирована как: "периодически читать состояние некоторого ресурса в 1С и отправлять сообщения в Telegram". Довольно быстро у этой задачи возникло дополнение: "написать что-то в Telegram, в 1С прочитать это сообщение и среагировать на него ответным сообщением".

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

Итого, нам потребовалось научиться как читать, так и писать в Telegram из 1С.

Знакомство с документацией

Банальная мысль, но прежде, чем делать что-то, надо прочитать документацию. Иногда вдоль и поперек, иногда по диагонали (зависит от задачи), но так или иначе надо читать. До этого я прочел множество документаций по API, но в этот раз чтение документации от разработчика Telegram Bot API меня приятно удивило. Возникло ощущение, что ее писал человек, который сначала сам прочел тысячу документаций по API, а потом тысячу часов сидел и думал, как сделать это самое чтение максимально продуктивным.

Если рассматривать отдельные части документации, то ничего особенного. Все, как обычно, все, как у всех. Эффект достигается за счет расположения этих частей. На первый взгляд оно(расположение) весьма необычно. Сначала идет описание одного метода. Потом описание типов. Потом снова методы. Но на само деле, что за чем идет очень хорошо продумано. В результате, в процессе чтения у тебя в голове складывается общая картина. Конечно, общая картина получается и при чтении всех прочих документаций, но здесь это происходит как-то совсем легко. Напомню, что мне есть с чем сравнивать.

Задача у меня была, как я уже говорил, довольно простая. И я просто читал документацию от начала до того момента, как у меня будет "на руках" все, что мне требуется. Когда этот момент наступил, я обратил внимание на то, что в самой документации я находился значительно ближе к началу, чем к концу. Логично. Простая задача, должна требовать меньше усилий. Но это надо уметь так расположить.

Реализация

Сначала мне нужно было прочесть сообщения из Telegram. Для этого существует два способа. Через webhook или с помощью метода getUpdates. Webhook в моем случае не годился, поэтому было сделано следующее:

	Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
	Заголовки   = Новый Соответствие;
	Заголовки.Вставить("content-type", "application/json");
	Запрос = Новый HTTPЗапрос("botXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/getUpdates?offset="+формат(константы.ПоследнееСообщение.Получить(),"ЧГ=0"), Заголовки);
	Ответ = Соединение.Получить(Запрос);
	ОтветСтрока = ответ.ПолучитьТелоКакСтроку();
	ЧтениеJSON	= Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ОтветСтрока);	
	данные = ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	если данные.ok тогда
		если данные.result.количество()>0 тогда
			константы.ПоследнееСообщение.Установить(данные.result[0].update_id+1);
			вопрос = данные.result[0].message.text;

Здесь мы видим все тот же принцип: простые вещи должны делаться просто. Простая аутентификация, прямо в URL (ну а зачем в данном случае что-то более сложное?) Один параметр GET запроса, с помощью которого решается задача получения только "не просмотренных" сообщений. Вот, собственно, и все.

Отправка сообщения в Telegram еще проще, чем чтение.

				Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
				данные = новый структура;
				данные.Вставить("chat_id","-10000001111111");
				данные.Вставить("text",ответсервиса);
				ЗаписьJSON = новый ЗаписьJSON;
				ЗаписьJSON.УстановитьСтроку();
				ЗаписатьJSON(ЗаписьJSON,данные);
				строказапроса = ЗаписьJSON.Закрыть();
				Заголовки = Новый Соответствие;
				Заголовки.Вставить("content-type", "application/json");
				Запрос=Новый HTTPЗапрос("botXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sendMessage", Заголовки);
				Запрос.УстановитьТелоИзСтроки(строказапроса);
				Ответ=Соединение.ОтправитьДляОбработки(Запрос);

Обратите внимание на лапидарность структуры, которая передается в теле запроса. Идентификатор чата и текст сообщения. Ничего лишнего.

В итоге у нас 15-20 строк для чтения сообщений и немногим меньше для отправки. И это все, что нам надо! Такая незамысловатая интеграция прекрасно работает.

Заключение

Когда я только приступал к этой работе, я был морально готов к тому, что придется, как это обычно бывало, "продираться" через изощренные смысловые конструкции разработчиков API. И в итоге потратить существенное количество времени. Однако, все оказалось существенно проще и быстрее, чем ожидалось. Я был приятно удивлен таким проявлением особого рода инженерной культуры. Ее не всегда встретишь в наших ИТ-шных джунглях. Но в этом смысле Telegram оказался на высоте. У них простые вещи делаются действительно просто.

Напоследок хочу порекомендовать бесплатный вебинар, на котором вы научитесь создавать проект EDT и подключать его к стандартной конфигурации 1С. Увидите подводные камни и научитесь их обходить. Посмотрите в процесс разработки. Увидите принципиально новые подходы, упрощающие и ускоряющие разработку. Обсудите с экспертами тему производительности EDT. Увидите всё на конкретных примерах и замерах.

Комментарии (3)


  1. Helltraitor
    14.06.2023 23:37
    +1

    К сожалению, я немного знаком с 1Секундой

    Сырые запросы, смешение разных языков (удобно раскладку переключать?), процедурный стиль программирования...

        Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    	Заголовки   = Новый Соответствие;
    	Заголовки.Вставить("content-type", "application/json");
    	Запрос = Новый HTTPЗапрос("botXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/getUpdates?offset="+формат(константы.ПоследнееСообщение.Получить(),"ЧГ=0"), Заголовки);
    	Ответ = Соединение.Получить(Запрос);
    	ОтветСтрока = ответ.ПолучитьТелоКакСтроку();
    	ЧтениеJSON	= Новый ЧтениеJSON;
    	ЧтениеJSON.УстановитьСтроку(ОтветСтрока);	
    	данные = ПрочитатьJSON(ЧтениеJSON);
    	ЧтениеJSON.Закрыть();
    	если данные.ok тогда
    		если данные.result.количество()>0 тогда
    			константы.ПоследнееСообщение.Установить(данные.result[0].update_id+1);
    			вопрос = данные.result[0].message.text;

    ...отсутствие RAII (или контекстных менеджеров, defer), отсутствие типов для формирования url (или контактенация больше заходит?), синхронное выполнение запросов

    Мне правда жаль, что данная "Фирма" еще существует.

    Не вижу смысла статьи, т.к. использование запросов видится мне рутиной

    P.S. Текст пишу без негатива, но это даже не смешно, поддержку Python бы добавили (кишка тонка)


    1. Golickoff
      14.06.2023 23:37

      удобно раскладку переключать?

      Когда я пишу "ХТТПСоединение", платформа автоматически вставляет в код текст "HTTPСоединение".

      При работе с пользовательским интерфейсом, как мне кажется, всем приходится постоянно переключать раскладку. Это проблема не 1С, а в целом программистов, работающих не в англоговорящих странах.

      отсутствие типов для формирования url

      Работа с url в моей практике происходит настолько редко, что это не вызывает дискомфорта.

      синхронное выполнение запросов

      Обычно оборачивается в асинхронные процедуры.

      Мне правда жаль, что данная "Фирма" еще существует.

      Никто не создал ничего лучше.

      Не вижу смысла статьи

      Аналогично.


  1. CptAFK
    14.06.2023 23:37

    Я поражен, что такой информационно-пустой статьей где еще и затрагивается 1С можно получить плюсов на Хабре. Нет, я не говорю что статья плохая, она просто скорее заметка, чем статья. Читая заголовок ждёшь чего-то более "заковыристого*.