Как отправлять уведомления из 1С 8.3: механизмы и примеры
Содержание
Уведомления в 1С:Предприятие реализуют на нескольких уровнях: всплывающее сообщение внутри программы делает ПоказатьОповещениеПользователя(), письмо наружу уходит через объект ИнтернетПочта по SMTP, а сообщение в Telegram — через HTTPСоединение. Выбор механизма зависит от того, где должен оказаться получатель: в открытой базе, в почте или в мессенджере.
Ниже — рабочие способы оповещения для платформы 8.3 (интерфейс «Такси»): встроенные оповещения, почта, мессенджеры по HTTP, задачи и фоновые задания, плюс где хранить пароли и токены, чтобы они не лежали открытым текстом в коде.
Какой способ оповещения выбрать
Прежде чем писать код, определитесь, кто и где получит сообщение. От этого зависит механизм.
- 🔔 Пользователь работает в базе прямо сейчас — всплывающее оповещение или событие формы.
- 📧 Получатель вне 1С, нужна история — электронная почта.
- 💬 Нужна мгновенная доставка на телефон — мессенджер через HTTP-запрос.
- ✅ Задание требует исполнения и контроля — задача или бизнес-процесс.
- ⏰ Рассылка по расписанию — фоновое или регламентное задание.
ПоказатьОповещениеПользователя() на клиенте или событие Оповестить() между формами. Ничего настраивать не нужно.ИнтернетПочта. Подходит для счетов, актов, напоминаний с вложениями.HTTPСоединение к API бота. Самый быстрый канал, но требует токена и внешнего доступа с сервера.Встроенные оповещения внутри программы
Пока пользователь открыл базу, его оповещают средствами платформы — без почты и интернета.
Всплывающее уведомление в правом нижнем углу показывает клиентская процедура:
ПоказатьОповещениеПользователя(
"Поступил новый заказ",
ПолучитьНавигационнуюСсылку(ЗаказКлиента),
"Заказ № 00-0000123 от ООО «Ромашка»",
БиблиотекаКартинок.Информация32);
Второй параметр — навигационная ссылка: по клику откроется нужный документ. Метод работает только на клиенте.
Событие между формами рассылает Оповестить(). Одна форма сообщает, другая ловит. Например, после записи документа обновить открытый список:
// В модуле формы документа, после записи
Оповестить("ЗаказЗаписан", ЗаказКлиента);
// В модуле формы списка — обработчик ОбработкаОповещения
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗаказЗаписан" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Модальные вопросы и предупреждения — ПоказатьПредупреждение() и ПоказатьВопрос() с описанием оповещения (callback). Они прерывают работу, поэтому для фоновых событий не годятся — только когда нужен ответ человека здесь и сейчас.
В типовых конфигурациях на Библиотеке стандартных подсистем (БСП) есть готовый «центр оповещений» — иконка-колокольчик в правом верхнем углу. Туда складываются системные сообщения, и свои оповещения можно отправлять через её программный интерфейс, не изобретая механизм заново.
Для внутренних событий «обновись», «перечитай данные» всегда берите Оповестить(), а не перезапрос к базе по таймеру. Это дешевле и мгновенно.
Отправка писем из 1С по SMTP
Почта — основной канал наружу. В типовых конфигурациях сначала заводят учётную запись в разделе Администрирование → Органайзер → Настройка системной учётной записи (путь может немного отличаться по конфигурации). Для своих обработок почтовый профиль собирают в коде.
Профиль хранит параметры SMTP-сервера:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "robot@company.ru";
Профиль.ПарольSMTP = Пароль; // из безопасного хранилища, см. ниже
Про порты коротко:
| Порт | Шифрование | Когда брать |
|---|---|---|
| 25 | без SSL | устаревший, часто закрыт провайдером |
| 465 | SSL (implicit) | большинство почтовых сервисов |
| 587 | STARTTLS | корпоративные серверы |
Само письмо — объект ИнтернетПочтовоеСообщение, отправка — через ИнтернетПочта:
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Новый заказ № 00-0000123";
Письмо.Отправитель = "robot@company.ru";
Письмо.Получатели.Добавить("manager@company.ru");
Письмо.Тексты.Добавить(
"Поступил новый заказ на сумму 45 200 руб.",
ТипТекстаПочтовогоСообщения.ПростойТекст);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Исключение
ЗаписьЖурналаРегистрации("Рассылка.Почта",
УровеньЖурналаРегистрации.Ошибка, , ,
ИнформацияОбОшибке().Описание);
КонецПопытки;
Обратите внимание: Подключиться(), Послать() и Отключиться() всегда оборачивают в Попытка…Исключение. Сервер почты может не ответить, и без обработки исключения отвалится весь код рассылки, а не одно письмо.
Отправку почты запускайте на сервере (в фоновом задании), а не в клиентской процедуре. Иначе пользователь будет ждать ответа SMTP-сервера с заблокированным интерфейсом.
Вложение добавляется в коллекцию Вложения письма — туда кладут ДвоичныеДанные, например печатную форму счёта, сформированную табличным документом.
Сообщения в Telegram и мессенджеры через HTTP
Мессенджер быстрее почты: сообщение приходит на телефон за секунды. У Telegram это бот — вы создаёте его у @BotFather, получаете токен и узнаёте chat_id получателя.
Отправка — POST-запрос к api.telegram.org:
Соединение = Новый HTTPСоединение("api.telegram.org", 443,
, , , 30, Новый ЗащищённоеСоединениеOpenSSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Запрос = Новый HTTPЗапрос(
"/bot" + Токен + "/sendMessage", Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Рассылка.Telegram",
УровеньЖурналаРегистрации.Ошибка, , ,
"HTTP " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Тело запроса — JSON. Не склеивайте JSON вручную строками: если в тексте окажется кавычка, двоеточие или перенос строки, запрос сломается. Соберите тело через ЗаписьJSON, он сам экранирует символы:
Структура = Новый Структура;
Структура.Вставить("chat_id", ИдентификаторЧата);
Структура.Вставить("text", ТекстСообщения);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Структура);
ТелоЗапроса = Запись.Закрыть();
Проверяйте КодСостояния ответа: Telegram отвечает 200 при успехе и 400/401/403 при ошибках (неверный токен, бот не добавлен в чат). Тело ответа в случае ошибки содержит понятное описание — его стоит писать в журнал.
Тот же подход работает для любого сервиса с HTTP API — Mattermost, корпоративных шлюзов SMS, вебхуков. Меняется только адрес и формат тела.
Для входящих уведомлений (чтобы внешняя система сама дёргала 1С) используют HTTP-сервисы — их публикуют на веб-сервере. Но для исходящих оповещений это не нужно, достаточно HTTPСоединение.
Поручения через задачи и бизнес-процессы
Когда уведомление — это не просто «прочитай», а «сделай и отчитайся», подходят объекты «Бизнес-процесс» и «Задача». Задача попадает в список Мои задачи исполнителя, а система отслеживает, выполнена она или нет.
Схема такая:
- В конфигураторе создают объект «Бизнес-процесс» с картой маршрута (точки «Действие», условия, ветвления).
- Точка действия формирует задачу и адресует её — конкретному пользователю или по реквизиту адресации (роль, подразделение).
- Исполнитель открывает задачу из своего списка, выполняет и отмечает выполнение — маршрут идёт дальше.
Программно задачу можно создать и без полноценного бизнес-процесса, напрямую через менеджер объекта «Задача»: заполнить исполнителя, срок, предмет и записать. Адресация по роли удобна тем, что задачу увидят все сотрудники с этой ролью, а выполнит любой свободный.
Этот механизм встроен в типовые конфигурации (например, согласование заявок), поэтому прежде чем писать свой бизнес-процесс, проверьте, нет ли готового в вашей конфигурации.
Рассылка по расписанию: фоновые и регламентные задания
Оповещения «каждое утро» или «через час после события» делают не таймером на клиенте, а заданиями на сервере.
Фоновое задание запускают из кода, когда нужно выполнить что-то разово и не держать пользователя:
Параметры = Новый Массив;
Параметры.Добавить(СписокПолучателей);
ФоновыеЗадания.Выполнить(
"РассылкаУведомлений.ОтправитьПартию",
Параметры,
"Рассылка_" + Строка(Новый УникальныйИдентификатор),
"Рассылка уведомлений по заказам");
Метод (ОтправитьПартию) должен быть экспортным и находиться в серверном общем модуле. Внутри — вся логика отправки почты или HTTP.
Регламентное задание описывают в конфигураторе и привязывают к нему расписание (Расписание): например, ежедневно в 9:00. Платформа сама запускает его в фоне.
В клиент-серверном режиме регламентные задания выполняются автоматически. В файловой базе они срабатывают только пока открыт хотя бы один сеанс с поддержкой фоновых заданий — учитывайте это, если база файловая и ночью никто не работает .
Длинную рассылку дробите на партии. Если отправлять сотни писем в одном задании без обработки исключений, сбой на одном адресе оборвёт всю рассылку, и часть получателей останется без уведомления.
Где хранить токены и как логировать отправки
Пароль от почты и токен бота — это секреты. В коде и в открытых реквизитах их держать нельзя: любой пользователь с правами на конфигурацию или выгрузку увидит их.
Правильные варианты:
- 🔐 Безопасное хранилище данных — функции
УстановитьДанныеПоБезопасномуХранилищу()иПолучитьДанныеПоБезопасномуХранилищу(). Значение привязывается к объекту-владельцу (например, к элементу справочника «Учётные записи») и недоступно обычным запросом. - 🔒 Константа с ограниченными правами — проще, но менее надёжно; закройте на неё права ролями.
- ❌ Нельзя — хранить токен прямо в тексте модуля или в строковом реквизите справочника без ограничений.
Логируйте каждую отправку в журнал регистрации — он потом ответит на вопрос «почему клиент не получил уведомление»:
ЗаписьЖурналаРегистрации(
"Рассылка.Почта",
УровеньЖурналаРегистрации.Информация,
, ,
"Отправлено: " + Письмо.Получатели[0].Адрес);
Что писать в журнал:
- 📨 факт успешной отправки с адресом получателя;
- ⚠️ код ошибки и ответ сервера при сбое;
- ⏱ время и количество сообщений в партии.
Журнал регистрации смотрят в разделе Администрирование → Журнал регистрации. По своему имени события (Рассылка.Почта, Рассылка.Telegram) рассылку легко отфильтровать.
Ошибки, из-за которых уведомления теряются
Код компилируется и отрабатывает без исключений, а получатель ничего не видит. Разберём причины, которые не видны в самом тексте программы.
Отправка внутри проведения документа. Если дёргать почту или HTTP прямо в модуле проведения, каждое проведение ждёт ответа внешнего сервиса. Проведение пачки документов встанет, а при недоступном сервере — вообще не завершится. Выносите оповещение в отдельное фоновое задание и запускайте его после записи, а не в транзакции проведения.
Молчаливое «проглатывание» сбоя. Частая связка — обернуть отправку в Попытка…Исключение и оставить блок исключения пустым. Формально ошибки нет, фактически сообщение потеряно без следа. В блоке исключения всегда пишите причину в журнал регистрации.
Нет повторной попытки при временном сбое. Сеть моргнула, сервер ответил 503 — и уведомление пропало. Для важных рассылок храните статус отправки у объекта (регистр сведений
«отправлено / ошибка») и повторяйте неотправленные следующим запуском задания, а не шлите всё заново.
Проблема с кодировкой. Кириллица в теме письма или в теле JSON ломается, если не указать кодировку. Для HTTP всегда КодировкаТекста.UTF8 в УстановитьТелоИзСтроки(), а JSON собирайте через ЗаписьJSON, а не конкатенацией строк.
Один бот и один chat_id на несколько баз. При копировании рабочей базы в тестовую рассылка из копии полетит реальным получателям. Храните признак «тестовая база» и в ней либо отключайте отправку, либо перенаправляйте на технический чат.
Частые вопросы
Почему письма из 1С не уходят, хотя код без ошибок?
Можно ли отправлять уведомления из клиентского кода напрямую?
Как узнать chat_id получателя в Telegram?
getUpdates того же API — в ответе придёт chat_id чата с этим человеком. Для группового чата добавьте бота в группу.Чем фоновое задание отличается от регламентного?
Нужен ли веб-сервер, чтобы слать уведомления в мессенджер?
HTTPСоединение. Веб-сервер и публикация нужны только для входящих обращений (HTTP-сервисы), когда внешняя система сама вызывает 1С.