При работе в 1С:Предприятии 8.3, особенно в специализированных конфигурациях вроде 1С:Управление автотранспортом (УАТ), часто возникает потребность в оповещении конкретных пользователей или групп пользователей о наступлении определенных событий. Например, необходимо уведомить ответственных сотрудников о поступлении новой заявки на ремонт. Рассмотрим различные способы реализации такой системы оповещений, уделяя особое внимание ситуациям, когда стандартная «Система взаимодействия» в конфигурации не используется.
Перед нами стоит задача: на основании документа «Заявки на ремонт» формировать оповещения (напоминания) выбранным пользователям. Пример сообщения: «Вам поступила заявка – (ссылка на заявку)». Нам необходимо найти лучший способ реализации этой задачи.
ПоказатьОповещениеПользователяДля начала, давайте разберем, как обычно реализуют оповещение для текущего пользователя, то есть того, кто непосредственно работает с документом и совершает действие. В клиентском коде это легко сделать с помощью метода ПоказатьОповещениеПользователя. Мы видим пример подобной реализации, который отлично работает для пользователя, создавшего заявку:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если НЕ ЗначениеЗаполнено(Объект.ВодительТС) ИЛИ НЕ ЗначениеЗаполнено(Объект.ТС) Тогда
ПоказатьОповещениеПользователя("Поступила заявка!", ПолучитьНавигационнуюСсылку(Объект.Ссылка),"Открыть посмотреть!", БиблиотекаКартинок.Вопрос32, СтатусОповещенияПользователя.Важное);
КонецЕсли;
КонецПроцедуры
Этот код, размещенный, к примеру, в обработчике события формы документа ПриЗакрытии, вызовет всплывающее окно у пользователя, который только что закрыл форму документа. Однако, как мы видим из вопроса, основная сложность заключается в том, чтобы перенаправить это оповещение группе других пользователей. При необходимости привлекать внимание пользователя вне активного окна программы можно использовать решение для вывода уведомлений из 1С в центр уведомлений Windows.
Один из наиболее распространенных и мощных способов реализации оповещений для других пользователей в 1С:Предприятии, особенно когда отсутствует «Система взаимодействия», – это использование стандартного механизма «Задачи». Этот механизм присутствует во многих типовых конфигурациях и позволяет создавать задания для конкретных исполнителей или ролей.
Давайте подробнее рассмотрим, как мы можем использовать объект Задача для нашей цели:
Создание объекта Задача: Мы будем создавать новую задачу программно при определенных условиях, например, после записи или проведения документа «Заявка на ремонт».
Задача = Задачи.СоздатьЗадачу();
Для этого код должен выполняться на сервере (например, в обработчике события ПриЗаписиНаСервере или ОбработкаПроведения документа).
Определение исполнителя: Ключевой аспект использования задач для оповещений – это правильное указание исполнителя. Вместо того чтобы ограничиваться текущим пользователем, мы можем назначить задачу конкретному сотруднику или группе сотрудников, используя ролевую адресацию.
В типовых конфигурациях 1С, включая БСП, часто используются справочники Пользователи, ФизическиеЛица и РолиИсполнителей. Мы можем назначить задачу:
Пользователи.РолиИсполнителей (например, «Диспетчеры по ремонту») и связать эту роль с несколькими пользователями. Задача будет автоматически видна всем пользователям, которым назначена эта роль.В предоставленном примере мы видим использование Задача.Должность, что является одним из способов ролевой адресации, хотя в более универсальных конфигурациях это может быть реквизит Исполнитель, который может принимать значения как Пользователь, так и РольИсполнителя.
Задача.Должность = Справочники.РолиИсполнителей.НайтиПоНаименованию("Приглашение на ТО");
// Или, если в конфигурации есть реквизит Исполнитель, который может быть Справочник.Пользователи:
// Задача.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
// Или, если Исполнитель может быть Справочник.РолиИсполнителей:
// Задача.Исполнитель = Справочники.РолиИсполнителей.НайтиПоНаименованию("Мастера цеха");
Важно: Проверьте структуру справочника РолиИсполнителей и убедитесь, что пользователи, которых нужно оповестить, связаны с соответствующими ролями или явно указаны как исполнители.
Заполнение параметров задачи: Для задачи важно указать информацию, которая будет полезна исполнителю. Это включает:
Дата и ДатаАктуальности: Сроки выполнения задачи.ВидЗадачи: Тип задачи (может быть элементом справочника).Описание: Подробный текст оповещения. Здесь мы можем сформировать ссылку на документ, используя функцию ПолучитьНавигационнуюСсылку.Объект: Ссылка на документ «Заявка на ремонт», к которому относится задача. Это позволит исполнителю быстро перейти к нужной заявке.Автор: Пользователь, который инициировал создание задачи.Пример из сообщения 17 демонстрирует отличное наполнение полей задачи:
//...
Задача.Дата = НачалоДня(ТекущаяДата()) + 3600*8; // Например, на начало рабочего дня
Задача.ДатаАктуальности = НачалоДня(ТекущаяДата()) + 3600*8;
Задача.ДатаСоздания = ТекущаяДата();
Задача.ВидЗадачи = Справочники.ВидыЗадач.ПриглашениеНаТО; // Возможно, вам нужно создать свой вид задачи
// Задача.НазваниеКампании = "Новый порядок задач на ТО"; // Если используется БП
Задача.Объект = Объект.Ссылка; // Ссылка на текущий документ "Заявка на ремонт"
Задача.Описание = "Поступила новая заявка на ремонт! Открыть: " + ПолучитьНавигационнуюСсылку(Объект.Ссылка);
// Дополнительные данные, как в примере:
// Задача.Автомобиль = Источник.Автомобили[0].Автомобиль;
// Задача.Объект = Источник.Контрагент;
// Задача.ВидРемонта = Справочники.ВидыРемонта.НайтиПоНаименованию("ТО 0");
// Задача.Описание = "Заказчик: " + Задача.Объект.Наименование + Символы.ПС + "Телефон: " + Задача.Объект.ОсновнойТелефон + Символы.ПС + "VIN: " + Задача.Автомобиль.VIN + Символы.ПС + "ГосНомер: " + Справочники.Автомобили.ЧтениеЗначенияРегистраСведения(Задача.Автомобиль, Перечисления.ДополнительнаяИнформацияАвтомобилей.ГосНомер, ТекущаяДата()) + Символы.ПС + "Модель: " + Задача.Автомобиль.Модель + Символы.ПС + "ДатаТО: " + ДобавитьМесяц(Задача.ДатаАктуальности, 2);
Задача.Автор = Справочники.Пользователи.НайтиПоНаименованию("Администратор информационной базы"); // Или текущий пользователь
//...
Запись задачи: После заполнения всех необходимых полей, задачу следует записать.
Попытка
Задача.Записать();
Если Задача.Наименование = "" Тогда
Задача.УстановитьНовыйНомер();
Задача.Наименование = "Задача № " + Задача.Номер;
Задача.Записать();
Сообщить("Создана задача на ТО: " + Задача.Ссылка);
КонецЕсли;
Исключение
Сообщить("Не удалось записать задачу на ТО " + ОписаниеОшибки());
КонецПопытки;
После записи, задача появится в списке «Мои задачи» у всех назначенных исполнителей или у пользователей, входящих в указанную роль. Пользователи смогут увидеть ее в своем рабочем столе или через стандартные отчеты по задачам.
Преимущества использования механизма «Задачи»:
Если мы хотим добиться именно всплывающих окон (аналогичных ПоказатьОповещениеПользователя) для других пользователей, но без «Системы взаимодействия», нам потребуется реализовать механизм периодического опроса (Polling).
Создание регистра сведений для очереди оповещений:
Создадим периодический или непериодический (зависит от логики) регистр сведений, например, ОчередьОповещений, со следующими измерениями и ресурсами:
Пользователь (Тип: СправочникСсылка.Пользователи): Кому адресовано оповещение.ИдентификаторОповещения (Тип: Строка или УникальныйИдентификатор): Для уникальной идентификации каждого оповещения.ТекстОповещения (Тип: Строка): Содержание сообщения.СсылкаНаОбъект (Тип: Произвольный): Ссылка на документ «Заявка на ремонт».Просмотрено (Тип: Булево): Признак того, что пользователь уже увидел и закрыл оповещение.ДатаСоздания (Тип: Дата): Для сортировки и возможного удаления устаревших оповещений.Запись в регистр при создании заявки:
При записи или проведении документа «Заявка на ремонт» (на сервере), мы будем программно создавать записи в этот регистр для каждого целевого пользователя.
// Пример кода на сервере, в модуле документа "Заявка на ремонт", например, после записи
Для Каждого ПользовательОповещения Из ПолучитьСписокПользователейДляОповещения() Цикл // Ваша функция для определения целевых пользователей
НоваяЗаписьРегистра = РегистрыСведений.ОчередьОповещений.СоздатьМенеджерЗаписи();
НоваяЗаписьРегистра.Пользователь = ПользовательОповещения;
НоваяЗаписьРегистра.ИдентификаторОповещения = Новый УникальныйИдентификатор();
НоваяЗаписьРегистра.ТекстОповещения = "Поступила новая заявка на ремонт!";
НоваяЗаписьРегистра.СсылкаНаОбъект = Объект.Ссылка;
НоваяЗаписьРегистра.Просмотрено = Ложь;
НоваяЗаписьРегистра.ДатаСоздания = ТекущаяДата();
Попытка
НоваяЗаписьРегистра.Записать();
Исключение
// Обработка ошибок записи
Сообщить("Ошибка при записи оповещения: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Подключение обработчика ожидания на клиенте:
В модуле управляемого приложения или в общей форме (например, в форме рабочего стола), мы будем периодически проверять наличие новых оповещений для текущего пользователя. Это реализуется с помощью метода ПодключитьОбработчикОжидания.
// В модуле управляемого приложения или в форме, при старте
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьНовыеОповещения", 5, Истина); // Проверять каждые 5 секунд
КонецПроцедуры
Процедура ПроверитьНовыеОповещения() Экспорт
// Вызов серверной функции для получения новых оповещений
СписокОповещений = ПолучитьНовыеОповещенияНаСервере();
Для Каждого Оповещение Из СписокОповещений Цикл
ПоказатьОповещениеПользователя(Оповещение.ТекстОповещения, Оповещение.СсылкаНаОбъект, "Открыть заявку!", БиблиотекаКартинок.Вопрос32, СтатусОповещенияПользователя.Важное);
// После показа, нужно пометить оповещение как просмотренное на сервере
ПометитьОповещениеКакПросмотренноеНаСервере(Оповещение.ИдентификаторОповещения);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьНовыеОповещенияНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОчередьОповещений.ТекстОповещения,
| ОчередьОповещений.СсылкаНаОбъект,
| ОчередьОповещений.ИдентификаторОповещения
|ИЗ
| РегистрСведений.ОчередьОповещений КАК ОчередьОповещений
|ГДЕ
| ОчередьОповещений.Пользователь = &ТекущийПользователь
| И ОчередьОповещений.Просмотрено = ЛОЖЬ";
Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь());
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
&НаСервере
Процедура ПометитьОповещениеКакПросмотренноеНаСервере(ИдентификаторОповещения)
МенеджерЗаписи = РегистрыСведений.ОчередьОповещений.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = Пользователи.ТекущийПользователь();
МенеджерЗаписи.ИдентификаторОповещения = ИдентификаторОповещения;
Если МенеджерЗаписи.Прочитать() Тогда
МенеджерЗаписи.Просмотрено = Истина;
Попытка
МенеджерЗаписи.Записать();
Исключение
// Обработка ошибок
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Преимущества Polling:
ПоказатьОповещениеПользователя для других пользователей.Недостатки Polling:
Если в вашей конфигурации 1С:УАТ 8.3 внедрена «Библиотека стандартных подсистем» (БСП), там уже есть готовый механизм «Напоминания пользователя». Этот механизм основан на регистре сведений НапоминанияПользователя. Стандартно он предназначен для того, чтобы пользователь создавал напоминания для себя самого. Однако, мы можем адаптировать его для отправки напоминаний другим пользователям:
Программная запись в регистр НапоминанияПользователя:
При создании или изменении заявки на ремонт, мы программно записываем в этот регистр сведения о напоминании. Ключевое отличие: в измерение Пользователь мы подставляем ссылку на нужного сотрудника, а не на текущего.
// Пример кода на сервере
МенеджерЗаписи = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И."); // Целевой пользователь
МенеджерЗаписи.ДатаНапоминания = ТекущаяДата() + 60*5; // Напомнить через 5 минут
МенеджерЗаписи.ТекстНапоминания = "Поступила новая заявка: " + Объект.Номер + ". " + ПолучитьНавигационнуюСсылку(Объект.Ссылка);
МенеджерЗаписи.СсылкаНаОбъект = Объект.Ссылка;
МенеджерЗаписи.ПредметНапоминания = Объект.ПредставлениеДокумента; // Для отображения в списке напоминаний
МенеджерЗаписи.ПоказыватьПользователю = Истина; // Обязательно
Попытка
МенеджерЗаписи.Записать();
Исключение
Сообщить("Ошибка при создании напоминания БСП: " + ОписаниеОшибки());
КонецПопытки;
Работа механизма БСП:
В БСП уже реализован клиентский обработчик ожидания, который периодически опрашивает этот регистр сведений на наличие актуальных напоминаний для текущего пользователя. Когда находится запись для пользователя, ему автоматически будет показано стандартное окно 1С с напоминанием, предлагающее прекратить его или отложить.
Преимущества БСП «Напоминания пользователя»:
Недостатки:
Для мобильных сотрудников, которые не всегда находятся в интерфейсе 1С, оповещения внутри 1С могут быть неэффективны. В таких случаях, мы можем рассмотреть интеграцию с внешними системами:
Оповещения по электронной почте (Email):
Это классический способ. Мы можем программно отправлять электронные письма выбранным пользователям. Для этого нам потребуется настроить учетную запись электронной почты в 1С и использовать объекты ИнтернетПочта, ИнтернетПочтовоеСообщение и ИнтернетПрофильПочты.
// Пример кода на сервере для отправки письма
Профиль = Новый ИнтернетПрофильПочты();
Профиль.Пользователь = "логин@домен.ru";
Профиль.Пароль = "пароль";
Профиль.АдресСервераSMTP = "smtp.домен.ru";
Профиль.ПортSMTP = 465; // Или 587
Профиль.ИспользоватьSSLSMTP = Истина;
Почта = Новый ИнтернетПочта();
Почта.Подключиться(Профиль);
Сообщение = Новый ИнтернетПочтовоеСообщение();
Сообщение.Отправитель.Адрес = Профиль.Пользователь;
Сообщение.Тема = "Новая заявка на ремонт!";
Сообщение.Текст = "Поступила новая заявка на ремонт: " + Объект.Номер + Символы.ПС +
"Для просмотра перейдите по ссылке: " + ПолучитьНавигационнуюСсылку(Объект.Ссылка);
// Получить список адресов электронной почты целевых пользователей
СписокАдресов = ПолучитьСписокEmailПользователейДляОповещения();
Для Каждого Адрес Из СписокАдресов Цикл
Сообщение.Получатели.Добавить(Адрес);
КонецЦикла;
Почта.Отправить(Сообщение);
Почта.Отключиться();
В тексте письма можно также передавать навигационную ссылку, которая при наличии веб-клиента или мобильного клиента 1С позволит открыть документ прямо на смартфоне.
Оповещения через Telegram-бот:
Это современный и очень популярный метод. Мы можем создать Telegram-бота и отправлять сообщения через HTTP-запросы к API Telegram. Для этого потребуется получить токен бота и ID чата пользователя (или группы).
// Пример кода на сервере для отправки сообщения в Telegram
ТокенБота = "ВАШ_ТОКЕН_БОТА"; // Полученный от BotFather
ИдЧата = "ИД_ЧАТА_ПОЛЬЗОВАТЕЛЯ_ИЛИ_ГРУППЫ"; // Полученный от GetMyIdBot
ТекстСообщения = "Вам поступила новая заявка: " + Объект.Номер + "%0A" +
"Открыть: " + UrlКодировать(ПолучитьНавигационнуюСсылку(Объект.Ссылка)); // %0A - перенос строки в URL
АдресРесурса = "https://api.telegram.org/bot" + ТокенБота + "/sendMessage";
ПараметрыЗапроса = "chat_id=" + ИдЧата + "&text=" + ТекстСообщения;
HTTPСоединение = Новый HTTPСоединение("api.telegram.org");
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса + "?" + ПараметрыЗапроса);
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Сообщить("Сообщение в Telegram успешно отправлено.");
Иначе
Сообщить("Ошибка отправки в Telegram: " + HTTPОтвет.КодСостояния + " - " + HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка HTTP-запроса к Telegram: " + ОписаниеОшибки());
КонецПопытки;
Преимущества Telegram:
В специализированных решениях, таких как 1С:УАТ, часто существуют встроенные механизмы для управления событиями и уведомлениями. Мы рекомендуем проверить наличие следующих элементов:
Всегда стоит сначала изучить возможности типового решения, прежде чем приступать к программным доработкам.
Если в вашей компании активно используются мобильные приложения на платформе 1С (например, 1С:Заказы или специализированный мобильный клиент УАТ), можно настроить отправку Push-уведомлений через сервис 1С. Это более технологичный аналог Telegram-уведомлений, который взаимодействует напрямую с мобильной платформой 1С. Реализация требует работы с механизмами мобильной платформы и сервисами 1С для отправки уведомлений, что является более сложной задачей, но предоставляет нативный опыт использования на мобильных устройствах.
Как мы видим, существует несколько эффективных способов реализации системы оповещений для пользователей в 1С:УАТ 8.3 без использования «Системы взаимодействия». Механизм «Задачи» является наиболее предпочтительным для оповещений внутри системы, предоставляя гибкость в адресации и контроле. Если же требуется мгновенное всплывающее окно для других пользователей, без БСП мы можем использовать связку «Регистр сведений + Обработчик ожидания». Для сотрудников, работающих вне офиса, или для повышения оперативности, отличным решением будет интеграция с Telegram или Email. Всегда начинайте с анализа имеющихся в вашей конфигурации типовых механизмов, таких как «Напоминания пользователя» из БСП или встроенные в УАТ подсистемы уведомлений, чтобы выбрать наиболее оптимальный и наименее трудозатратный путь.