Личный опыт интеграции 1С и Telegram

01c162dc827bfc0a486599add7534a6f.png

Это не совсем туториал. Хотя вы найдете здесь рабочий пример несложной интеграции 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. Увидите всё на конкретных примерах и замерах.

© Habrahabr.ru