Как отправлять уведомления из 1С 8.3: механизмы и примеры

· 9 мин

Содержание

Уведомления в 1С:Предприятие реализуют на нескольких уровнях: всплывающее сообщение внутри программы делает ПоказатьОповещениеПользователя(), письмо наружу уходит через объект ИнтернетПочта по SMTP, а сообщение в Telegram — через HTTPСоединение. Выбор механизма зависит от того, где должен оказаться получатель: в открытой базе, в почте или в мессенджере.

Ниже — рабочие способы оповещения для платформы 8.3 (интерфейс «Такси»): встроенные оповещения, почта, мессенджеры по HTTP, задачи и фоновые задания, плюс где хранить пароли и токены, чтобы они не лежали открытым текстом в коде.

Какой способ оповещения выбрать

Прежде чем писать код, определитесь, кто и где получит сообщение. От этого зависит механизм.

  • 🔔 Пользователь работает в базе прямо сейчас — всплывающее оповещение или событие формы.
  • 📧 Получатель вне 1С, нужна история — электронная почта.
  • 💬 Нужна мгновенная доставка на телефон — мессенджер через HTTP-запрос.
  • ✅ Задание требует исполнения и контроля — задача или бизнес-процесс.
  • ⏰ Рассылка по расписанию — фоновое или регламентное задание.
Куда должно прийти уведомление?

Встроенные оповещения внутри программы

Пока пользователь открыл базу, его оповещают средствами платформы — без почты и интернета.

Всплывающее уведомление в правом нижнем углу показывает клиентская процедура:

ПоказатьОповещениеПользователя(
    "Поступил новый заказ",
    ПолучитьНавигационнуюСсылку(ЗаказКлиента),
    "Заказ № 00-0000123 от ООО «Ромашка»",
    БиблиотекаКартинок.Информация32);

Второй параметр — навигационная ссылка: по клику откроется нужный документ. Метод работает только на клиенте.

Событие между формами рассылает Оповестить(). Одна форма сообщает, другая ловит. Например, после записи документа обновить открытый список:

// В модуле формы документа, после записи
Оповестить("ЗаказЗаписан", ЗаказКлиента);

// В модуле формы списка — обработчик ОбработкаОповещения
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗаказЗаписан" Тогда
        Элементы.Список.Обновить();
    КонецЕсли;
КонецПроцедуры

Модальные вопросы и предупреждения — ПоказатьПредупреждение() и ПоказатьВопрос() с описанием оповещения (callback). Они прерывают работу, поэтому для фоновых событий не годятся — только когда нужен ответ человека здесь и сейчас.

В типовых конфигурациях на Библиотеке стандартных подсистем (БСП) есть готовый «центр оповещений» — иконка-колокольчик в правом верхнем углу. Туда складываются системные сообщения, и свои оповещения можно отправлять через её программный интерфейс, не изобретая механизм заново.

Для внутренних событий «обновись», «перечитай данные» всегда берите Оповестить(), а не перезапрос к базе по таймеру. Это дешевле и мгновенно.

Отправка писем из 1С по SMTP

Почта — основной канал наружу. В типовых конфигурациях сначала заводят учётную запись в разделе Администрирование → Органайзер → Настройка системной учётной записи (путь может немного отличаться по конфигурации). Для своих обработок почтовый профиль собирают в коде.

Профиль хранит параметры SMTP-сервера:

Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP        = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "robot@company.ru";
Профиль.ПарольSMTP       = Пароль; // из безопасного хранилища, см. ниже

Про порты коротко:

ПортШифрованиеКогда брать
25без SSLустаревший, часто закрыт провайдером
465SSL (implicit)большинство почтовых сервисов
587STARTTLSкорпоративные серверы

Само письмо — объект ИнтернетПочтовоеСообщение, отправка — через ИнтернетПочта:

Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Новый заказ № 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Соединение.

Поручения через задачи и бизнес-процессы

Когда уведомление — это не просто «прочитай», а «сделай и отчитайся», подходят объекты «Бизнес-процесс» и «Задача». Задача попадает в список Мои задачи исполнителя, а система отслеживает, выполнена она или нет.

Схема такая:

  1. В конфигураторе создают объект «Бизнес-процесс» с картой маршрута (точки «Действие», условия, ветвления).
  2. Точка действия формирует задачу и адресует её — конкретному пользователю или по реквизиту адресации (роль, подразделение).
  3. Исполнитель открывает задачу из своего списка, выполняет и отмечает выполнение — маршрут идёт дальше.

Программно задачу можно создать и без полноценного бизнес-процесса, напрямую через менеджер объекта «Задача»: заполнить исполнителя, срок, предмет и записать. Адресация по роли удобна тем, что задачу увидят все сотрудники с этой ролью, а выполнит любой свободный.

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

Рассылка по расписанию: фоновые и регламентные задания

Оповещения «каждое утро» или «через час после события» делают не таймером на клиенте, а заданиями на сервере.

Фоновое задание запускают из кода, когда нужно выполнить что-то разово и не держать пользователя:

Параметры = Новый Массив;
Параметры.Добавить(СписокПолучателей);

ФоновыеЗадания.Выполнить(
    "РассылкаУведомлений.ОтправитьПартию",
    Параметры,
    "Рассылка_" + Строка(Новый УникальныйИдентификатор),
    "Рассылка уведомлений по заказам");

Метод (ОтправитьПартию) должен быть экспортным и находиться в серверном общем модуле. Внутри — вся логика отправки почты или HTTP.

Регламентное задание описывают в конфигураторе и привязывают к нему расписание (Расписание): например, ежедневно в 9:00. Платформа сама запускает его в фоне.

В клиент-серверном режиме регламентные задания выполняются автоматически. В файловой базе они срабатывают только пока открыт хотя бы один сеанс с поддержкой фоновых заданий — учитывайте это, если база файловая и ночью никто не работает .

Длинную рассылку дробите на партии. Если отправлять сотни писем в одном задании без обработки исключений, сбой на одном адресе оборвёт всю рассылку, и часть получателей останется без уведомления.

Где хранить токены и как логировать отправки

Пароль от почты и токен бота — это секреты. В коде и в открытых реквизитах их держать нельзя: любой пользователь с правами на конфигурацию или выгрузку увидит их.

Правильные варианты:

  • 🔐 Безопасное хранилище данных — функции УстановитьДанныеПоБезопасномуХранилищу() и ПолучитьДанныеПоБезопасномуХранилищу(). Значение привязывается к объекту-владельцу (например, к элементу справочника «Учётные записи») и недоступно обычным запросом.
  • 🔒 Константа с ограниченными правами — проще, но менее надёжно; закройте на неё права ролями.
  • ❌ Нельзя — хранить токен прямо в тексте модуля или в строковом реквизите справочника без ограничений.

Логируйте каждую отправку в журнал регистрации — он потом ответит на вопрос «почему клиент не получил уведомление»:

ЗаписьЖурналаРегистрации(
    "Рассылка.Почта",
    УровеньЖурналаРегистрации.Информация,
    , ,
    "Отправлено: " + Письмо.Получатели[0].Адрес);

Что писать в журнал:

  • 📨 факт успешной отправки с адресом получателя;
  • ⚠️ код ошибки и ответ сервера при сбое;
  • ⏱ время и количество сообщений в партии.

Журнал регистрации смотрят в разделе Администрирование → Журнал регистрации. По своему имени события (Рассылка.Почта, Рассылка.Telegram) рассылку легко отфильтровать.

Перед запуском рассылки в рабочей базе
Выполнено: 0 / 6

Ошибки, из-за которых уведомления теряются

Код компилируется и отрабатывает без исключений, а получатель ничего не видит. Разберём причины, которые не видны в самом тексте программы.

Отправка внутри проведения документа. Если дёргать почту или HTTP прямо в модуле проведения, каждое проведение ждёт ответа внешнего сервиса. Проведение пачки документов встанет, а при недоступном сервере — вообще не завершится. Выносите оповещение в отдельное фоновое задание и запускайте его после записи, а не в транзакции проведения.

Молчаливое «проглатывание» сбоя. Частая связка — обернуть отправку в Попытка…Исключение и оставить блок исключения пустым. Формально ошибки нет, фактически сообщение потеряно без следа. В блоке исключения всегда пишите причину в журнал регистрации.

Нет повторной попытки при временном сбое. Сеть моргнула, сервер ответил 503 — и уведомление пропало. Для важных рассылок храните статус отправки у объекта (регистр сведений «отправлено / ошибка») и повторяйте неотправленные следующим запуском задания, а не шлите всё заново.

Проблема с кодировкой. Кириллица в теме письма или в теле JSON ломается, если не указать кодировку. Для HTTP всегда КодировкаТекста.UTF8 в УстановитьТелоИзСтроки(), а JSON собирайте через ЗаписьJSON, а не конкатенацией строк.

Один бот и один chat_id на несколько баз. При копировании рабочей базы в тестовую рассылка из копии полетит реальным получателям. Храните признак «тестовая база» и в ней либо отключайте отправку, либо перенаправляйте на технический чат.

Частые вопросы

Почему письма из 1С не уходят, хотя код без ошибок?
Чаще всего дело не в 1С, а в почтовом сервисе: закрыт порт, нужен пароль приложения вместо обычного, или сервер требует STARTTLS на порту 587. Проверьте параметры SMTP у провайдера и посмотрите текст исключения в журнале регистрации — там будет ответ сервера.
Можно ли отправлять уведомления из клиентского кода напрямую?
Всплывающие оповещения — да, они клиентские. А почту и HTTP-запросы отправляйте с сервера: клиент может не иметь доступа в интернет, и интерфейс зависнет на время ответа внешнего сервиса.
Как узнать chat_id получателя в Telegram?
Попросите пользователя написать боту любое сообщение, затем вызовите метод getUpdates того же API — в ответе придёт chat_id чата с этим человеком. Для группового чата добавьте бота в группу.
Чем фоновое задание отличается от регламентного?
Фоновое запускают из кода разово, когда нужно. Регламентное описывают в конфигураторе с расписанием, и платформа запускает его сама по времени. Для рассылки «по событию» берут фоновое, для «каждое утро» — регламентное.
Нужен ли веб-сервер, чтобы слать уведомления в мессенджер?
Нет. Исходящий HTTP-запрос уходит прямо с сервера 1С объектом HTTPСоединение. Веб-сервер и публикация нужны только для входящих обращений (HTTP-сервисы), когда внешняя система сама вызывает 1С.