База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как отправлять документы из УНФ 3 в Telegram без изменения конфигурации?
- В этой теме 1 ответ, 2 участника, последнее обновление 26 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
5 ноября 2026 в 21:08 #38968
в унф 3 нужно добавить возможность отправки документов по телеграмм аналогично тому, как
-
5 ноября 2026 в 21:08 #38969
Ваше сообщение оборвалось на фразе «аналогично тому, как…». Но для УНФ 3 обычно требуется отправка в Telegram одного из вариантов:
1. печатной формы документа;
2. файла из присоединенных файлов;
3. счета, заказа, акта, накладной в PDF;
4. документа с кнопкой «Отправить в Telegram»;
5. автоматическая отправка клиенту после проведения документа.Для УНФ 3 правильнее делать это расширением, без изменения конфигурации. Общая схема такая:
— в расширении добавить команду в форму документа;
— получить печатную форму или присоединенный файл;
— сохранить его во временный файл;
— отправить файл методом TelegramsendDocument;
— токен бота и настройки хранить в константах либо в регистре сведений расширения;
— идентификатор чата хранить у клиента, контактного лица или в отдельном регистре сведений.## 1. Что потребуется создать в расширении
В расширении УНФ 3:
### Общий модуль
Создайте общий модуль, например:
1С (Код)1ИнтеграцияTelegramСерверСвойства:
— серверный;
— экспортный;
— вызов сервера, если команда вызывается из управляемой формы.### Регистр сведений «НастройкиTelegram»
Можно добавить регистр сведений с периодичностью «Непериодический».
Измерения:
1С (Код)1КлючНастройкиРесурсы:
1С (Код)1ТокенБотаРеквизиты:
1С (Код)1ПроксиДля одного бота достаточно одной записи с ключом:
1С (Код)1ОсновнойБотТокен Telegram имеет примерно такой вид:
1С (Код)11234567890:AAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxТокен нельзя хранить непосредственно в коде расширения.
## 2. Отправка файла в Telegram из 1С
Для отправки файла Telegram используется метод:
1С (Код)1https://api.telegram.org/botТОКЕН/sendDocumentВ запросе необходимо передать multipart/form-data:
—
chat_id;
—document;
— при необходимостиcaption.Ниже приведен рабочий пример серверной функции общего модуля. Она принимает путь к файлу, идентификатор чата и подпись.
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144&НаСервереФункция ОтправитьДокументВTelegram(ИдентификаторЧата, ИмяФайла, Подпись = "") ЭкспортЕсли ПустаяСтрока(ИдентификаторЧата) ТогдаВызватьИсключение "Не указан идентификатор чата Telegram";КонецЕсли;Если Не ЗначениеЗаполнено(ИмяФайла) ТогдаВызватьИсключение "Не указан файл для отправки";КонецЕсли;Если Не ФайлСуществует(ИмяФайла) ТогдаВызватьИсключение "Файл не найден: " + ИмяФайла;КонецЕсли;ТокенБота = ПолучитьТокенБота();Если ПустаяСтрока(ТокенБота) ТогдаВызватьИсключение "Не настроен токен Telegram-бота";КонецЕсли;Граница = "----" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()),"-","");ИмяФайлаТелаЗапроса = ПолучитьИмяВременногоФайла("tmp");МассивФайлов = Новый Массив;ИмяНачальнойЧасти = ПолучитьИмяВременногоФайла("tmp");ЗаписьНачальнойЧасти = Новый ЗаписьТекста(ИмяНачальнойЧасти,КодировкаТекста.UTF8,Символы.ПС,Ложь);ЗаписьНачальнойЧасти.ЗаписатьСтроку("--" + Граница);ЗаписьНачальнойЧасти.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");ЗаписьНачальнойЧасти.ЗаписатьСтроку("");ЗаписьНачальнойЧасти.ЗаписатьСтроку(Строка(ИдентификаторЧата));Если Не ПустаяСтрока(Подпись) ТогдаЗаписьНачальнойЧасти.ЗаписатьСтроку("--" + Граница);ЗаписьНачальнойЧасти.ЗаписатьСтроку("Content-Disposition: form-data; name=""caption""");ЗаписьНачальнойЧасти.ЗаписатьСтроку("");ЗаписьНачальнойЧасти.ЗаписатьСтроку(Подпись);КонецЕсли;ЗаписьНачальнойЧасти.ЗаписатьСтроку("--" + Граница);ЗаписьНачальнойЧасти.ЗаписатьСтроку("Content-Disposition: form-data; name=""document""; filename="""+ ПолучитьИмяФайла(ИмяФайла) + """");ЗаписьНачальнойЧасти.ЗаписатьСтроку("Content-Type: application/octet-stream");ЗаписьНачальнойЧасти.ЗаписатьСтроку("");ЗаписьНачальнойЧасти.Закрыть();МассивФайлов.Добавить(ИмяНачальнойЧасти);МассивФайлов.Добавить(ИмяФайла);ИмяКонечнойЧасти = ПолучитьИмяВременногоФайла("tmp");ЗаписьКонечнойЧасти = Новый ЗаписьТекста(ИмяКонечнойЧасти,КодировкаТекста.UTF8,Символы.ПС,Ложь);ЗаписьКонечнойЧасти.ЗаписатьСтроку("--" + Граница + "--");ЗаписьКонечнойЧасти.Закрыть();МассивФайлов.Добавить(ИмяКонечнойЧасти);ОбъединитьФайлы(МассивФайлов, ИмяФайлаТелаЗапроса);Запрос = Новый HTTPЗапрос;Запрос.АдресРесурса = "/bot"+ ТокенБота+ "/sendDocument";Запрос.Метод = "POST";Запрос.Заголовки.Вставить("Content-Type","multipart/form-data; boundary=" + Граница);Запрос.УстановитьИмяФайлаТела(ИмяФайлаТелаЗапроса);ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,,ЗащищенноеСоединение);Ответ = Соединение.ОтправитьДляОбработки(Запрос);ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();Если Ответ.КодСостояния <> 200 ТогдаВызватьИсключение "Ошибка отправки файла в Telegram. "+ "Код HTTP: "+ Строка(Ответ.КодСостояния)+ ". Ответ: "+ ТелоОтвета;КонецЕсли;ЧтениеJSON = Новый ЧтениеJSON;ЧтениеJSON.УстановитьСтроку(ТелоОтвета);Результат = ПрочитатьJSON(ЧтениеJSON);Если ТипЗнч(Результат) = Тип("Структура") ТогдаУспешно = Результат.Свойство("ok")И Результат.ok;Если Не Успешно ТогдаОписаниеОшибки = "";Если Результат.Свойство("description") ТогдаОписаниеОшибки = Результат.description;КонецЕсли;ВызватьИсключение"Telegram вернул ошибку: "+ ОписаниеОшибки;КонецЕсли;КонецЕсли;Возврат Истина;КонецФункцииФункция получения токена может выглядеть так:
1С (Код)12345678910111213141516171819202122232425&НаСервереФункция ПолучитьТокенБота() ЭкспортЗапрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ ПЕРВЫЕ 1| Настройки.ТокенБота КАК ТокенБота|ИЗ| РегистрСведений.НастройкиTelegram КАК Настройки|ГДЕ| Настройки.КлючНастройки = &КлючНастройки";Запрос.УстановитьПараметр("КлючНастройки","ОсновнойБот");Результат = Запрос.Выполнить().Выбрать();Если Результат.Следующий() ТогдаВозврат Результат.ТокенБота;КонецЕсли;Возврат "";КонецФункции## 3. Как получить идентификатор чата Telegram
Пользователь должен сначала написать боту любое сообщение, например:
1С (Код)1/startПосле этого можно временно вызвать метод:
1С (Код)1https://api.telegram.org/botТОКЕН/getUpdatesВ ответе будет структура примерно такого вида:
JavaScript123456789{"message": {"chat": {"id": 123456789,"first_name": "Иван","username": "ivanov"}}}Значение:
1С (Код)1123456789это идентификатор чата, куда можно отправлять документы.
Для рабочего варианта лучше не вводить
chat_idвручную в документе. В УНФ 3 его можно хранить:— в карточке контрагента;
— в карточке контактного лица;
— в дополнительном реквизите клиента;
— в отдельном регистре сведений расширения.Например, отдельный регистр сведений:
1С (Код)1НастройкиПолучателейTelegramИзмерения:
1С (Код)12КонтрагентКонтактноеЛицоРесурсы:
1С (Код)1ИдентификаторЧатаТак можно отправлять документ нужному клиенту автоматически.
## 4. Кнопка в форме документа УНФ 3
В расширении нужно создать команду формы, например:
1С (Код)1ОтправитьВTelegramКоманду подключить к форме нужного документа. В зависимости от задачи это может быть:
— Заказ клиента;
— Реализация товаров и услуг;
— Счет на оплату;
— Акт выполненных работ;
— Коммерческое предложение;
— Заказ поставщику;
— Счет на оплату покупателю.Обработчик команды формы:
1С (Код)1234567891011121314&НаКлиентеПроцедура ОтправитьВTelegram(Команда)Результат = ОтправитьДокументВTelegramНаСервере();Если Результат.Успешно ТогдаСообщить("Документ отправлен в Telegram");ИначеСообщить("Не удалось отправить документ: "+ Результат.ОписаниеОшибки);КонецЕсли;КонецПроцедурыСерверная процедура:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051&НаСервереФункция ОтправитьДокументВTelegramНаСервере()Результат = Новый Структура;Результат.Вставить("Успешно", Ложь);Результат.Вставить("ОписаниеОшибки", "");ПопыткаЕсли Не ЗначениеЗаполнено(Объект.Ссылка) ТогдаРезультат.ОписаниеОшибки ="Сначала необходимо записать документ";Возврат Результат;КонецЕсли;ИдентификаторЧата =ПолучитьИдентификаторЧатаДляДокумента(Объект.Ссылка);Если ПустаяСтрока(ИдентификаторЧата) ТогдаРезультат.ОписаниеОшибки ="Для клиента не настроен Telegram";Возврат Результат;КонецЕсли;ИмяФайла = ПолучитьПечатнуюФормуДокументаPDF(Объект.Ссылка);Подпись ="Документ: "+ Объект.Ссылка+ Символы.ПС+ "Дата: "+ Формат(Объект.Дата, "ДЛФ=Д");ИнтеграцияTelegramСервер.ОтправитьДокументВTelegram(ИдентификаторЧата,ИмяФайла,Подпись);Результат.Успешно = Истина;ИсключениеРезультат.ОписаниеОшибки =ОписаниеОшибки();КонецПопытки;Возврат Результат;КонецФункцииНазвания реквизитов
Объект.Ссылка,Объект.Датаи структура формы могут отличаться в конкретной форме УНФ 3, поэтому этот фрагмент нужно адаптировать к форме документа.## 5. Как получить PDF печатной формы
Здесь есть два варианта.
### Вариант 1. Использовать уже существующий присоединенный PDF
Если в УНФ документ уже имеет присоединенный файл, нужно получить его двоичные данные и записать во временный файл:
1С (Код)123456ДвоичныеДанные = ПолучитьДвоичныеДанныеПрисоединенногоФайла(СсылкаНаФайл);ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");ДвоичныеДанные.Записать(ИмяВременногоФайла);После этого файл передается в:
1С (Код)1234ИнтеграцияTelegramСервер.ОтправитьДокументВTelegram(ИдентификаторЧата,ИмяВременногоФайла,Подпись);### Вариант 2. Сформировать печатную форму документа
Если нужно отправлять именно печатную форму, ее сначала формируют в
ТабличныйДокумент, затем сохраняют в PDF:1С (Код)12345ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");ТабличныйДокумент.Записать(ИмяВременногоФайла,ТипФайлаТабличногоДокумента.PDF);После этого выполняется отправка файла в Telegram.
Важно: в типовой УНФ конкретные процедуры получения печатной формы зависят от документа и версии конфигурации. Для каждого документа нужно определить:
— имя макета;
— имя печатной формы;
— процедуру формирования табличного документа;
— наличие дополнительных параметров печати.Поэтому универсально сформировать PDF для всех документов УНФ одной процедурой без проверки конкретной версии конфигурации нельзя.
## 6. Автоматическая отправка после проведения
Если требуется отправлять документы автоматически, не нужно отправлять их прямо из обработчика
ПриЗаписиилиОбработкаПроведения. Это может замедлить проведение и привести к ошибке записи документа при временной недоступности Telegram.Лучше сделать очередь отправки:
### Регистр сведений «ОчередьTelegram»
Измерения:
1С (Код)1ДокументРеквизиты:
1С (Код)1234567ИдентификаторЧатаИмяФайлаСтатусКоличествоПопытокТекстОшибкиДатаСозданияДатаОтправкиСтатусы:
1С (Код)1234ОжидаетОтправляетсяОтправленОшибкаПри проведении документа в очередь записывается задание. Регламентное задание раз в минуту:
1. выбирает документы со статусом
Ожидает;
2. формирует PDF;
3. отправляет файл;
4. меняет статус наОтправлен;
5. при ошибке увеличивает счетчик попыток;
6. сохраняет текст ошибки.Такой вариант надежнее, поскольку временная ошибка сети или Telegram не блокирует работу пользователей в УНФ.
## 7. Что важно учесть
### Ограничение размера файла
Telegram ограничивает размер отправляемого через Bot API документа. Для обычных счетов, актов и накладных в PDF проблем обычно нет, но крупные архивы и сканы могут не отправиться.
### Ограничение подписи
Подпись к документу не должна быть слишком длинной. Для обычного описания документа достаточно:
1С (Код)1Счет на оплату № 15 от 05.11.2026### Кодировка
Файл отправляется как бинарные данные. Не нужно читать PDF как текст и перекодировать его.
### Идентификатор чата
Telegram-бот не может первым написать пользователю. Клиент обязательно должен сначала открыть бота и отправить ему сообщение.
### Группы
Для отправки в группу бот должен быть добавлен в группу. Для группы идентификатор чата обычно отрицательный, например:
1С (Код)1-1001234567890### Безопасность
Не следует:
— хранить токен в общем модуле;
— записывать токен в текст ошибки;
— передавать токен пользователю;
— публиковать URL с токеном в журналах регистрации;
— разрешать отправку документов без проверки прав пользователя.Для УНФ 3 оптимальный первый вариант такой: добавить в форму документа команду «Отправить в Telegram», сформировать PDF печатной формы, получить
chat_idклиента из регистра сведений и вызватьsendDocument. Рекомендую посмотреть здесь: https://core.telegram.org/bots/api#senddocument и https://infostart.ru/1c/articles/1528057/
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.