Как уведомить пользователя 1С: от всплывающего окна до Telegram

· 9 мин

Содержание

Чтобы показать сообщение пользователю 1С прямо на экране, вызовите в клиентской процедуре формы ПоказатьОповещениеПользователя("Текст"): в углу окна всплывёт оповещение и само исчезнет через несколько секунд. Если пользователь не сидит в базе, отправляйте сообщение во внешний канал: на почту, по SMS или в Telegram.

Типичная ситуация: бухгалтер провёл документ, но не понял, сработала ли обработка. Или кладовщик ушёл домой, а остаток товара упал ниже минимума. В первом случае хватит оповещения на экране, во втором нужно письмо или сообщение в мессенджер по расписанию. Ниже собраны все рабочие варианты для платформы 8.3 с кодом.

Какой способ уведомления выбрать

Сначала определитесь, где находится получатель и должен ли он что-то сделать в ответ.

СпособГде увидит пользовательКогда подходитОграничения
ПоказатьОповещениеПользователяВсплывающее окно в углу программыКороткий итог действия: «Записано», «Выгрузка готова»Только на клиенте, только текущему сеансу
Сообщить / СообщениеПользователюПанель сообщений внизу формыОшибки заполнения, привязка к полюТолько текущему сеансу
ПоказатьПредупреждение, ПоказатьВопросОкно поверх формыНужен ответ «Да/Нет» или подтверждениеБлокирует работу с формой
Электронная почтаПочтовый ящикОтчёты, сводки, напоминанияНужен SMTP-сервер
SMSТелефонСрочные событияПлатно, лимит длины текста
Telegram и другие мессенджерыТелефон и компьютерОперативные оповещения сотрудникамНужен доступ сервера 1С в интернет
Журнал регистрацииТолько администраторФиксация ошибок и фактов отправкиОбычный пользователь его не видит

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

ПоказатьОповещениеПользователя: всплывающее оповещение в 1С

Метод работает только на клиенте. В модуле формы процедура должна иметь директиву &НаКлиенте, иначе при проверке модуля получите ошибку Процедура или функция с указанным именем не определена (ПоказатьОповещениеПользователя).

Параметры по порядку:

  1. Текст — заголовок оповещения, единственный обязательный параметр.
  2. ДействиеПриНажатии — навигационная ссылка (строка) или ОписаниеОповещения. По клику пользователь откроет документ или запустит вашу процедуру.
  3. Пояснение — вторая строка мелким шрифтом.
  4. Картинка — например, БиблиотекаКартинок.Информация32.
  5. СтатусОповещенияПользователя — Информация или Важное.
  6. КлючУникальности — строка. Новое оповещение с тем же ключом заменяет старое, а не накладывается сверху.

Оповещение со ссылкой на документ

Пример для формы документа: после записи показываем оповещение, клик по нему открывает документ.

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)

    ПоказатьОповещениеПользователя(
        "Документ записан",
        ПолучитьНавигационнуюСсылку(Объект.Ссылка),
        "Номер " + Объект.Номер,
        БиблиотекаКартинок.Информация32);

КонецПроцедуры

Оповещение, которое запускает процедуру

Если по клику нужно не открыть объект, а выполнить действие, передайте ОписаниеОповещения:

&НаКлиенте
Процедура ВыгрузкаЗавершена()

    Действие = Новый ОписаниеОповещения("ОткрытьПапкуВыгрузки", ЭтотОбъект);
    ПоказатьОповещениеПользователя(
        "Выгрузка завершена",
        Действие,
        "Нажмите, чтобы открыть папку",
        ,
        СтатусОповещенияПользователя.Важное,
        "ВыгрузкаДанных");

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПапкуВыгрузки(ДополнительныеПараметры) Экспорт
    // открываем каталог или форму с результатом
КонецПроцедуры

Процедура-обработчик обязательно экспортная, иначе платформа её не найдёт.

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

Сообщить, СообщениеПользователю и окна с вопросом

Когда текст должен остаться на экране, пока его не прочтут, используйте панель сообщений формы.

Простое сообщение

Сообщить("Не заполнен контрагент") работает и на клиенте, и на сервере. Серверное сообщение пользователь увидит, когда вызов сервера закончится.

Сообщение с привязкой к полю

Объект СообщениеПользователю умеет подсветить конкретное поле формы. Пользователь кликает по сообщению — курсор встаёт в нужный реквизит.

&НаСервере
Процедура ПроверитьЗаполнениеНаСервере(Отказ)

    Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Укажите контрагента";
        Сообщение.Поле = "Объект.Контрагент";
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;

КонецПроцедуры

В типовых конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) принято вызывать обёртку ОбщегоНазначения.СообщитьПользователю(Текст, КлючДанных, Поле, ПутьКДанным, Отказ) на сервере и ОбщегоНазначенияКлиент.СообщитьПользователю на клиенте. Она делает то же самое и сразу ставит Отказ.

Окно с ответом

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

&НаКлиенте
Процедура УдалитьСтроки(Команда)
    Оповещение = Новый ОписаниеОповещения("УдалитьСтрокиЗавершение", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Удалить все строки табличной части?",
        РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьСтрокиЗавершение(Ответ, ДополнительныеПараметры) Экспорт
    Если Ответ = КодВозвратаДиалога.Да Тогда
        Объект.Товары.Очистить();
    КонецЕсли;
КонецПроцедуры

Четвёртый параметр — таймаут в секундах. Через 30 секунд без ответа окно закроется и вернёт значение по умолчанию, здесь Нет.

Письмо пользователю по электронной почте

Почта нужна, когда человек не в базе: сводка утром, напоминание о сроке оплаты, отчёт по расписанию.

Без программирования

В типовых конфигурациях учётная запись почты настраивается в Администрирование → Органайзер. После этого письма умеют отправлять сами типовые механизмы: рассылки отчётов, отправка счетов, напоминания. Для своей доработки удобно взять эту же учётную запись через программный интерфейс подсистемы «Работа с почтовыми сообщениями».

Платформенными объектами

Если БСП нет или нужна простая отправка, хватит трёх объектов: ИнтернетПочтовыйПрофиль, ИнтернетПочтовоеСообщение, ИнтернетПочта.

Функция ОтправитьПисьмо(Адрес, Тема, Текст, ПарольSMTP) Экспорт

    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.example.ru";
    Профиль.ПортSMTP = 465;
    Профиль.ИспользоватьSSLSMTP = Истина;
    Профиль.ПользовательSMTP = "robot@example.ru";
    Профиль.ПарольSMTP = ПарольSMTP;
    Профиль.Таймаут = 30;

    Письмо = Новый ИнтернетПочтовоеСообщение;
    Письмо.Отправитель = "robot@example.ru";
    Письмо.Получатели.Добавить(Адрес);
    Письмо.Тема = Тема;
    Письмо.Тексты.Добавить(Текст, ТипТекстаПочтовогоСообщения.ПростойТекст);

    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
    Исключение
        ЗаписьЖурналаРегистрации("Уведомления.Почта",
            УровеньЖурналаРегистрации.Ошибка, , ,
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;

    Возврат Истина;

КонецФункции

Что учесть:

  • 🔐 Пароль не пишите в код. Храните его в безопасном хранилище (в БСП — ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища).
  • 📮 Для Яндекс Почты и Mail.ru нужен отдельный пароль приложения, обычный пароль от ящика сервер не примет.
  • 🧱 Порт 465 — это SSL, 587 — STARTTLS. Если ни один не открывается, проверьте брандмауэр на сервере 1С.

SMS-уведомления через сервис-провайдера

Сама платформа SMS не отправляет. Нужен договор с SMS-шлюзом, у которого есть HTTP API.

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

Если провайдера нет в списке, пишите запрос сами по документации шлюза. Схема всегда одна:

  1. Получите у провайдера логин и ключ API.
  2. Создайте HTTPСоединение с адресом шлюза и ЗащищенноеСоединениеOpenSSL.
  3. Соберите тело запроса (номер, текст, имя отправителя) в формате, который требует шлюз.
  4. Отправьте запрос и разберите ответ: код состояния и идентификатор сообщения.
  5. Запишите результат в журнал регистрации, чтобы потом разбирать недоставки.

Ориентиры по деньгам: примерно 3–6 ₽ за сообщение, имя отправителя у операторов обычно регистрируется за отдельную ежемесячную плату. Один SMS-сегмент на кириллице — до 70 символов, длинный текст разбивается на несколько платных частей.

Пишите короткий текст: «Остаток Кабель ВВГ 3×2,5 ниже 50 м» лучше, чем полное предложение с приветствием.

Отправка уведомлений в Telegram и Viber

Telegram

Самый дешёвый способ оперативно оповестить сотрудников. Понадобится бот и идентификатор чата:

  1. Создайте бота через @BotFather, сохраните токен.
  2. Попросите сотрудника написать боту /start. Без этого бот не сможет ему написать.
  3. Узнайте chat_id: откройте в браузере https://api.telegram.org/bot<токен>/getUpdates и найдите в ответе поле chat.id.
  4. Отправляйте сообщения методом sendMessage.
Функция ОтправитьВTelegram(Токен, ИдЧата, Текст) Экспорт

    Данные = Новый Структура("chat_id, text", ИдЧата, Текст);
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Данные);
    Тело = Запись.Закрыть();

    Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , 30,
        Новый ЗащищенноеСоединениеOpenSSL);
    Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage");
    Запрос.Заголовки.Вставить("Content-Type", "application/json");
    Запрос.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8,
        ИспользованиеByteOrderMark.НеИспользовать);

    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Возврат Ответ.КодСостояния = 200;

КонецФункции

Без ИспользованиеByteOrderMark.НеИспользовать в начало тела может попасть служебная метка BOM, и сервер ответит ошибкой разбора JSON.

Код выполняется там, где идёт вызов. В клиент-серверной базе — на сервере 1С, значит, именно серверу нужен доступ к api.telegram.org. Если выход в интернет идёт через прокси, передайте объект ИнтернетПрокси пятым параметром конструктора HTTPСоединение: он стоит сразу после логина и пароля.

Viber и другие мессенджеры

Бот Viber рассылает сообщения только тем, кто на него подписан, а массовые уведомления клиентам идут через бизнес-рассылки по договору с агрегатором. Технически это тот же HTTP-запрос к API агрегатора, что и для SMS. Многие шлюзы умеют каскад: сначала мессенджер, при недоставке — SMS.

Автоматические уведомления по расписанию

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

Создание в конфигураторе

  1. В дереве метаданных откройте Общие → Регламентные задания, добавьте новое.
  2. В поле «Имя метода» укажите экспортную процедуру серверного общего модуля, например УведомленияСервер.ПроверитьМинимальныеОстатки.
  3. Установите флажки «Использование» и «Предопределенное».
  4. Задайте расписание: например, каждый день в 08:00 или каждые 15 минут.
  5. Обновите конфигурацию базы данных.

В пользовательском режиме расписание правится без конфигуратора: Администрирование → Обслуживание → Регламентные и фоновые задания.

Регламентное задание работает на сервере и не может вызвать ПоказатьОповещениеПользователя — у него нет клиента. Поэтому из задания отправляют почту, SMS или Telegram.

Как достучаться до того, кто сейчас в базе

Если нужно показать оповещение именно в программе, сделайте связку «очередь + опрос»:

  1. Регламентное задание пишет уведомления в регистр сведений : пользователь, текст, дата, признак «прочитано».
  2. В модуле управляемого приложения, в обработчике ПриНачалеРаботыСистемы, подключите ПодключитьОбработчикОжидания("ПроверитьУведомления", 60).
  3. Обработчик раз в минуту одним лёгким запросом забирает непрочитанные записи текущего пользователя и показывает их через ПоказатьОповещениеПользователя.

Не ставьте интервал меньше 30–60 секунд. Каждый опрос — это вызов сервера от каждого открытого сеанса, при 100 пользователях это заметная нагрузка.

Альтернатива без опроса — система взаимодействия («Обсуждения»): сообщения доставляются мгновенно, но нужен подключённый сервер взаимодействия. Включается в разделе администрирования, в группе настроек «Обсуждения».

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

Журнал регистрации: уведомления для администратора

Журнал регистрации — не канал связи с пользователем. Это протокол, который читает администратор. Записывайте в него каждую неудачную отправку, иначе потерянные уведомления никто не заметит.

ЗаписьЖурналаРегистрации("Уведомления.Telegram",
    УровеньЖурналаРегистрации.Предупреждение,
    ,
    ,
    "Не доставлено: код ответа " + Формат(Ответ.КодСостояния, "ЧГ=0"));

Параметры: имя события, уровень (Информация, Примечание, Предупреждение, Ошибка), объект метаданных, данные (ссылка на документ), комментарий.

Открыть журнал в типовой конфигурации: Администрирование → Обслуживание, ссылка «Журнал регистрации». Поставьте отбор по событию, например Уведомления.Telegram, и увидите все сбои за период.

Давайте событиям единый префикс (Уведомления.Почта, Уведомления.SMS). Тогда отбор по нему покажет все каналы сразу.

Диагностика: выберите симптом

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

Можно ли отправить сообщение сразу всем пользователям в базе?
Штатной рассылки по сеансам в платформе нет. Используйте «Обсуждения», очередь уведомлений с опросом или блокировку работы пользователей в БСП: она показывает всем предупреждение перед завершением сеансов.
Чем Оповестить отличается от ПоказатьОповещениеПользователя?
Оповестить передаёт событие другим открытым формам того же сеанса, на экране ничего не появляется. ПоказатьОповещениеПользователя выводит видимое всплывающее окно.
Куда пропадают сообщения Сообщить из фонового задания?
Они накапливаются в задании. Заберите их методом ПолучитьСообщенияПользователю() у объекта фонового задания и покажите на клиенте.
Работает ли ПоказатьОповещениеПользователя в веб-клиенте?
Да, метод доступен в тонком и веб-клиенте. Оповещение показывается внутри окна программы, а не системным уведомлением браузера.
Можно ли отправлять Telegram-сообщения из расширения конфигурации?
Да, код тот же. Если для расширения включён безопасный режим, HTTP-запросы к внешним адресам нужно разрешить профилем безопасности.