Задача отправить персональное сообщение конкретному пользователю в 1С:Предприятие возникает в самых разных сценариях: от напоминаний о задолжностях до уведомлений об ошибках в документах. В отличие от массовых рассылок, здесь важна адресность — сообщение должно попасть строго определенному сотруднику, менеджеру или администратору. Проблема в том, что стандартные механизмы платформы 1С 8.3 не всегда предоставляют удобные инструменты для такой задачи.
Многие администраторы и разработчики сталкиваются с трудностями: как отфильтровать пользователя по логину, ФИО или роли? Как гарантировать доставку сообщения, если пользователь не в сети? Можно ли отправить уведомление в Telegram или на email напрямую из 1С? В этой статье мы разберём 5 проверенных способов — от простых (через встроенные обработки) до сложных (с использованием HTTP-запросов и внешних сервисов). Каждый метод проиллюстрирован рабочими примерами кода и пошаговыми инструкциями.
Особое внимание уделим безопасности: как избежать утечек данных при отправке сообщений, почему не стоит хранить пароли от почты в открытом виде в конфигурации, и как правильно логировать отправленные уведомления. Также вы узнаете, какие ограничения накладывает платформа 1С на работу с внешними сервисами (например, лимит на количество HTTP-запросов в облачных решениях) и как их обойти.
1. Стандартные уведомления 1С: как отправить сообщение через "ПоказатьОповещение"
Самый простой способ — использовать встроенный механизм оповещений платформы 1С:Предприятие 8.3. Он подходит для отправки сообщений пользователям, которые сейчас работают в системе. Метод ПоказатьОповещение() отображает всплывающее окно с текстом, но имеет важное ограничение: если пользователь не авторизован, он не увидит уведомление.
Чтобы отправить сообщение конкретному пользователю, нужно сначала получить его идентификатор. Для этого используем объект ПользователиИнформационнойБазы и фильтруем по логину или ФИО. Пример кода:
Пользователи = ПользователиИнформационнойБазы.СоздатьМенеджерВыбора();
Пользователи.Отбор.Логин.Установить("IvanovII"); // Логин пользователя
Если Пользователи.Выбрать() Тогда
ПоказатьОповещениеПользователю(
Пользователи.ТекущийДанные.Ссылка,
"Важное уведомление",
"Документ №123 требует вашего утверждения до 17:00",
10 // Время показа в секундах
);
КонецЕсли;
Где искать логины пользователей? Их можно посмотреть в справочнике Пользователи (раздел Администрирование → Пользователи) или через запрос к базе. Обратите внимание: если в системе включена ролевая модель доступа, уведомление увидит только пользователь с соответствующими правами.
⚠️ Внимание: Сообщения через ПоказатьОповещение() не сохраняются в базе. Если пользователь пропустил всплывающее окно, он не сможет прочитать текст позже. Для критичных уведомлений используйте альтернативные методы.
Преимущества этого способа:
- 🔹 Мгновенная доставка — сообщение появляется сразу при активной сессии пользователя.
- 🔹 Нет зависимости от внешних сервисов — работает даже без интернета.
- 🔹 Простота реализации — не требует дополнительных настроек.
Недостатки:
- 🚫 Не работает для офлайн-пользователей.
- 🚫 Нет истории отправленных сообщений.
- 🚫 Ограниченное форматирование текста (только простой текст).
Метод ПоказатьОповещение() подходит для срочных уведомлений активным пользователям, но не заменяет почту или мессенджеры для долгосрочных напоминаний.
2. Отправка email через 1С: настройка SMTP и пример кода
Если пользователь должен получить сообщение вне зависимости от его статуса в системе (например, на корпоративную почту), используйте отправку через SMTP. Этот метод универсален и работает даже для внешних адресатов. Для настройки потребуется:
- Данные SMTP-сервера (адрес, порт, логи/пароль).
- Разрешение на отправку писем (на некоторых хостингах требуется активация).
- Шаблон письма (можно хранить в справочнике или константе).
Пример кода для отправки email через 1С:Предприятие 8.3:
// Настройки SMTP (лучше хранить в константах или справочнике)
АдресSMTP = "smtp.yandex.ru";
ПортSMTP = 465;
ИмяПользователяSMTP = "noreply@company.ru";
ПарольSMTP = ПолучаемПарольИзХранилища(); // Никогда не храните пароль в открытом виде!
// Формируем письмо
Почта = Новый ПочтаMailMsg;
Почта.Отправитель = "noreply@company.ru";
Почта.Получатели.Добавить("ivanov@company.ru"); // Email пользователя
Почта.Тема = "Уведомление из 1С: Требуется ваше действие";
Почта.Текст = "Уважаемый Иван Иванович!" + Символы.ПС +
"Документ Заказ покупателя №123 ожидает вашего утверждения." + Символы.ПС +
"Срок: до " + Формат(ТекущаяДата() + 86400, "ДФ='dd.MM.yyyy HH:mm'");
// Отправляем через SMTP
SMTPСоединение = Новый ПочтаSMTPСоединение(АдресSMTP, ПортSMTP, ИмяПользователяSMTP, ПарольSMTP, , , Истина);
SMTPСоединение.Отправить(Почта);
Как безопасно хранить пароли от SMTP? Используйте:
- 🔐 Хранилище паролей 1С — встроенный механизм (
ПолучитьИзХранилища()). - 🔐 Внешние системы аутентификации (например, OAuth 2.0 для Gmail).
- 🔐 Шифрование — пароль хранится в базе в зашифрованном виде (используйте
ШифроватьСтроку()).
⚠️ Внимание: При отправке писем на внешние адреса (например, Gmail или Mail.ru) ваш SMTP-сервер может быть заблокирован за спам. Используйте корпоративные почтовые домены и настраивайте SPF, DKIM.
Для массовой рассылки уведомлений можно создать обработку с параметрами:
- 📌 Список получателей (из справочника
Пользователи). - 📌 Шаблон письма (с поддержкой плейсхолдеров вроде
{%Имя%}). - 📌 Логирование отправленных писем (например, в регистр сведений).
Получить данные SMTP у админа|Создать шаблон письма|Проверить права на отправку|Протестировать на тестовом ящике|Настроить логирование-->
3. Интеграция с Telegram: отправка сообщений через бота
Если ваша компания использует Telegram для корпоративной переписки, можно настроить отправку уведомлений через бота. Это удобно, потому что:
- 📱 Сообщения приходят на мобильное устройство.
- 🔄 Поддерживаются уведомления с кнопками (инлайн-клавиатура).
- 📊 Можно вести историю переписки в чате.
Для этого потребуется:
- Создать бота в @BotFather и получить
API-токен. - Узнать
chat_idпользователя (можно через бота @getidsbot). - Написать код для отправки
HTTP-запросак API Telegram.
Пример кода для отправки сообщения в Telegram:
// Настройки бота
ТокенБота = "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ"; // Замените на свой токен
ChatID = "123456789"; // ID чата пользователя
// Формируем URL для запроса
URL = "https://api.telegram.org/bot" + ТокенБота + "/sendMessage?chat_id=" + ChatID +
"&text=" + СтрЗначениеВВebЦвет("Документ №123 требует утверждения! Срок: сегодня до 18:00") +
"&parse_mode=HTML";
// Отправляем запрос
HTTPСоединение = Новый HTTPСоединение;
Ответ = HTTPСоединение.Получить(URL);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписатьЛог("Ошибка отправки в Telegram: " + Ответ.ПолучитьТекст());
КонецЕсли;
Чтобы автоматически получать chat_id пользователей, можно:
- 🤖 Запросить у пользователя через бота (команда
/start). - 📋 Хранить соответствие логинов 1С и
chat_idв справочнике. - 🔄 Обновлять ID при каждом взаимодействии с ботом.
Для расширенных уведомлений (с кнопками, изображениями) используйте метод sendMessage с параметром reply_markup. Пример инлайн-клавиатуры:
// JSON для кнопок
КнопкиJSON = "
{
""inline_keyboard"": [
[
{""text"": ""Утвердить"", ""callback_data"": ""approve_123""},
{""text"": ""Отклонить"", ""callback_data"": ""reject_123""}
]
]
}";
// Добавляем кнопки в запрос
URL = URL + "&reply_markup=" + СтрЗначениеВВebЦвет(КнопкиJSON);
⚠️ Внимание: В облачных решениях 1С (1C:Fresh) действуют ограничения на количество HTTP-запросов. При массовых рассылках используйте Фоновые задания или внешние сервисы.
Как получить chat_id пользователя без сторонних ботов?
1. Отправьте сообщение боту от пользователя (например, "Привет").
2. Перейдите по URL: https://api.telegram.org/bot{ТОКЕН}/getUpdates.
3. В ответе найдите поле "chat":{"id":-123456789} — это и есть chat_id.
4. Использование регистра сведений для хранения и отображения сообщений
Если вам нужно не только отправить сообщение, но и сохранить его в базе для дальнейшего анализа, создайте регистр сведений. Это позволит:
- 📝 Вести историю уведомлений.
- 🔍 Отслеживать, какие сообщения были прочитаны.
- 📊 Формировать отчёты по активности пользователей.
Пример структуры регистра сведений УведомленияПользователям:
| Измерение/Ресурс | Тип данных | Описание |
|---|---|---|
Пользователь |
СправочникСсылка.Пользователи | Кому адресовано сообщение |
ДатаВремя |
Дата | Когда создано уведомление |
ТекстСообщения |
Строка (неограниченная) | Содержимое уведомления |
Прочитано |
Булево | Статус прочтения |
СсылкаНаОбъект |
Произвольный | Документ или элемент, к которому относится уведомление |
Код для записи уведомления в регистр:
// Получаем пользователя по логину
Пользователь = ПользователиИнформационнойБазы.НайтиПоЛогину("PetrovPP");
// Записываем уведомление в регистр
НаборЗаписей = РегистрыСведений.УведомленияПользователям.СоздатьНаборЗаписей();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Пользователь = Пользователь.Ссылка;
НоваяЗапись.ДатаВремя = ТекущаяДата();
НоваяЗапись.ТекстСообщения = "Ваша заявка на отпуск №456 одобрена. Подробности в документе.";
НоваяЗапись.Прочитано = Ложь;
НоваяЗапись.СсылкаНаОбъект = Документы.ЗаявкиНаОтпуск.НайтиПоНомеру("000000456");
НаборЗаписей.Записать();
Чтобы пользователь увидел свои уведомления, добавьте обработку в интерфейс 1С. Например, кнопку "Мои уведомления" в панели навигации, которая открывает форму со списком непрочитанных сообщений. Пример кода для формы:
// Получаем непрочитанные уведомления текущего пользователя
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УведомленияПользователям.ТекстСообщения КАК Текст,
| УведомленияПользователям.СсылкаНаОбъект КАК Ссылка
|ИЗ
| РегистрСведений.УведомленияПользователям КАК УведомленияПользователям
|ГДЕ
| УведомленияПользователям.Пользователь = &Пользователь
| И УведомленияПользователям.Прочитано = ЛОЖЬ";
Запрос.УстановитьПараметр("Пользователь", ТекущийПользователь());
Результат = Запрос.Выполнить();
// Отображаем в таблице формы
ТаблицаУведомлений.Очистить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаУведомлений.Добавить();
НоваяСтрока.Текст = Выборка.Текст;
НоваяСтрока.Ссылка = Выборка.Ссылка;
КонецЦикла;
Преимущества этого подхода:
- 📎 Сообщения хранятся в базе и доступны в любой момент.
- 🔍 Можно отслеживать, кто и когда прочитал уведомление.
- 🔄 Легко интегрировать с другими механизмами (например, отправлять напоминания о непрочитанных сообщениях).
Чтобы уменьшить нагрузку на базу, архивируйте старые уведомления (старше 30 дней) в отдельный регистр или удаляйте их автоматически.
5. Фоновые задания для отложенной отправки сообщений
Если сообщение нужно отправить в определённое время (например, напоминание за день до дедлайна), используйте фоновые задания. Они позволяют планировать выполнение кода без участия пользователя.
Пример создания фонового задания для отправки email через 24 часа:
// Создаём задание
Задание = ФоновыеЗадания.СоздатьНовоеЗадание();
Задание.Имя = "ОтправитьНапоминаниеОДедлайне";
Задание.Метод = "ОбщийМодуль.УведомленияСервер.ОтправитьEmailНапоминание";
Задание.Параметры.Установить("Пользователь", Пользователь.Ссылка);
Задание.Параметры.Установить("Текст", "Напоминаем: завтра истекает срок утверждения документа №123");
// Планируем выполнение через 24 часа
Задание.ВремяВыполнения = ТекущаяДата() + 86400; // 86400 секунд = 24 часа
Задание.ЗапуститьАсинхронно();
В общем модуле УведомленияСервер должен быть метод ОтправитьEmailНапоминание, который принимает параметры и отправляет письмо (аналогично примеру из раздела 2).
Особенности работы с фоновыми заданиями:
- ⏳ В облачных решениях (1C:Fresh) фоновые задания выполняются с задержкой до 5 минут.
- 🔄 В файловом варианте требуется запущенный агент сервера 1С.
- 📝 Логи выполнения заданий можно просматривать в журнале регистрации.
Для периодических уведомлений (например, еженедельных отчётов) используйте регламентные задания. Они настраиваются в конфигураторе (Общие → Регламентные задания) и запускаются по расписанию.
⚠️ Внимание: В версиях 1С младше 8.3.18 фоновые задания не поддерживают передачу сложных параметров (например, объектов). Используйте примитивные типы (строка, число) или сериализуйте данные в JSON.
6. Альтернативные способы: SMS, WhatsApp, корпоративные мессенджеры
Если email и Telegram не подходят, рассмотрите другие каналы связи. Их интеграция требует дополнительных усилий, но может быть оправдана в специфических сценариях.
Отправка SMS через сервисы вроде SMS.ru или Twilio:
- 📱 Подходит для срочных уведомлений (например, о сбоях в системе).
- 💰 Платный тариф (стоимость ~1-3 рубля за SMS).
- 🔧 Требуется
HTTP-запроск API сервиса.
Пример кода для отправки SMS через SMS.ru:
// Настройки API
API_ID = "12345678-9ABC-DEF0-1234-56789ABCDEF0"; // Ваш API-ключ
НомерТелефона = "79123456789"; // Номер в формате 7XXXXXXXXXX
ТекстSMS = "1С: Ваша смена начинается в 14:00. Не опаздывайте!";
// Формируем запрос
URL = "https://sms.ru/sms/send";
Запрос = Новый HTTPЗапрос(URL);
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
ТелоЗапроса = "api_id=" + API_ID +
"&to=" + НомерТелефона +
"&text=" + СтрЗначениеВВebЦвет(ТекстSMS) +
"&json=1"; // Формат ответа JSON
Запрос.УстановитьТекст(ТелоЗапроса);
HTTPСоединение = Новый HTTPСоединение;
Ответ = HTTPСоединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Результат = JSON.Прочитать(Ответ.ПолучитьТекст());
Если Результат.Свойство("status") = "OK" Тогда
Сообщить("SMS отправлено успешно!");
Иначе
Сообщить("Ошибка: " + Результат.Свойство("status_text"));
КонецЕсли;
Иначе
Сообщить("Ошибка HTTP: " + Ответ.КодСостояния);
КонецЕсли;
Интеграция с WhatsApp возможна через:
- 🤖 Официальный WhatsApp Business API (платно, требует одобрения).
- 📱 Неофициальные библиотеки (например, whatsapp-web.js для Node.js).
- 🔗 Сервисы-посредники вроде Twilio или MessageBird.
Корпоративные мессенджеры (Microsoft Teams, Slack, Битрикс24):
- 💼 Подходят для внутренних уведомлений.
- 🔗 Интеграция через
Webhookили API. - 📌 Пример для Microsoft Teams:
// URL вебхука канала в Teams
WebhookURL = "https://company.webhook.office.com/...";
// Формируем сообщение в формате карточки
Тело = "
{
""@type"": ""MessageCard"",
""@context"": ""http://schema.org/extensions"",
""themeColor"": ""0076D7"",
""summary"": ""Уведомление из 1С"",
""sections"": [{
""activityTitle"": ""Документ на утверждение"",
""activitySubtitle"": ""Заказ покупателя №123"",
""facts"": [{
""name"": ""Срок"",
""value"": ""до 17:00""
}],
""markdown"": true
}]
}";
// Отправляем запрос
Запрос = Новый HTTPЗапрос(WebhookURL);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТекст(Тело);
HTTPСоединение.ОтправитьДляОбработки(Запрос);
⚠️ Внимание: При интеграции с внешними сервисами учитывайте требования ФЗ-152 "О персональных данных". Не передавайте конфиденциальную информацию (например, зарплаты) через незащищённые каналы.
Сравнение способов: какой выбрать для вашей задачи
Чтобы определиться с методом отправки сообщений, оцените ваши требования по следующим критериям:
| Критерий | Всплывающие уведомления | Telegram | Регистр сведений | SMS/WhatsApp | |
|---|---|---|---|---|---|
| Доставка офлайн-пользователям | ❌ Нет | ✅ Да | ✅ Да | ✅ Да (при входе) | ✅ Да |
| Требует интернет | ❌ Нет | ✅ Да | ✅ Да | ❌ Нет | ✅ Да |
| Поддержка форматирования | ❌ Нет | ✅ Да (HTML) | ✅ Да (Markdown) | ✅ Да (произвольный текст) | ❌ Ограничено |
| Стоимость | ✅ Бесплатно | ✅ Бесплатно (корп. почта) | ✅ Бесплатно | ✅ Бесплатно | 💰 Платно (~1-5 руб/сообщение) |
| Сложность реализации | ⭐ Очень низкая | ⭐⭐ Низкая | ⭐⭐⭐ Средняя | ⭐⭐⭐ Средняя | ⭐⭐⭐⭐ Высокая |
Рекомендации по выбору:
- 🔹 Для внутренних уведомлений активным пользователям —
ПоказатьОповещение(). - 🔹 Для документации и истории — регистр сведений + email.
- 🔹 Для мгновенных уведомлений на мобильные — Telegram или SMS.
- 🔹 Для периодических отчётов — фоновые задания + email.
Комбинируйте способы для надёжности. Например, отправляйте уведомление через ПоказатьОповещение() + дублируйте email. Так пользователь получит сообщение даже если не был в системе.
FAQ: Частые вопросы по отправке сообщений в 1С
Можно ли отправить сообщение пользователю, который не в сети?
Да, но не через ПоказатьОповещение(). Используйте:
- 📧 Email — универсальный способ.
- 📱 Telegram/SMS — для мобильных уведомлений.
- 📝 Регистр сведений — пользователь увидит сообщение при следующем входе.
Для гарантированной доставки комбинируйте несколько каналов.
Как получить список всех активных пользователей в 1С?
Используйте запрос к системному справочнику ПользователиИнформационнойБазы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПользователиИнформационнойБазы.Ссылка КАК Ссылка,
| ПользователиИнформационнойБазы.Логин КАК Логин,
| ПользователиИнформационнойБазы.Наименование КАК ФИО
|ИЗ
| Справочник.Пользователи КАК ПользователиИнформационнойБазы
|ГДЕ
| НЕ ПользователиИнформационнойБазы.ПометкаУдаления";
Результат = Запрос.Выполнить();
Для получения текущих активных сессий используйте объект СеансыИнформационнойБазы.
Как отправить сообщение с вложением (файлом)?
Для email используйте метод Вложения.Добавить():
Почта = Новый ПочтаMailMsg;
Почта.Вложения.Добавить("C:\Отчеты\отчет.xlsx"); // Путь к файлу
// Или из временного хранилища:
ДанныеФайла = ПолучаемДанныеФайлаИзБазы(); // Массив байт
Почта.Вложения.