В процессе работы в многопользовательской среде 1С:УПП 1.3 (Управление производственным предприятием) часто возникает необходимость оперативного уведомления одного сотрудника о действиях другого. Типичный сценарий: один менеджер провел важный документ, и у другого сотрудника в этот же момент должно появиться всплывающее окно с сообщением. Разберем, как это реализовать, учитывая специфику обычного приложения и архитектуру конфигурации.
Проанализируем самый простой и «штатный» путь, который не требует написания сложного кода с нуля. В конфигурации УПП предусмотрен документ Событие, который является частью CRM-системы. Процесс настройки выглядит следующим образом:
Событие.Рассмотрим, почему это работает. В типовом решении УПП уже настроен глобальный обработчик, который периодически проверяет наличие актуальных событий для текущего пользователя. Это позволяет избежать написания собственного «велосипеда» для мониторинга базы данных.
Если создание целого документа Событие кажется избыточным для вашей задачи, можно воспользоваться более «легким» механизмом — регистром сведений НапоминанияПользователя. Это системный регистр, специально предназначенный для хранения уведомлений.
Рассмотрим алгоритм программной реализации:
МенеджерЗаписи = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = НужныйПользователь;
МенеджерЗаписи.ВремяНапоминания = ТекущаяДата();
МенеджерЗаписи.Содержание = "Вам поступила новая задача по заказу №" + НомерЗаказа;
МенеджерЗаписи.Источник = СсылкаНаДокумент;
МенеджерЗаписи.Записать();
Преимущества этого метода:
Выясним, как создать полностью кастомную систему, если типовые механизмы по какой-то причине не подходят. Для этого мы можем использовать метод ПодключитьОбработчикОжидания. Этот метод позволяет выполнять процедуру через заданный интервал времени.
Проанализируем пошагово процесс внедрения в модуле обычного приложения:
ПриНачалеРаботыСистемы подключаем обработчик.Пример кода для подключения:
Процедура ПриНачалеРаботыСистемы()
// Проверяем, что это не фоновое задание и не внешнее соединение
#Если Клиент Тогда
ПодключитьОбработчикОжидания("ПроверитьНовыеСообщенияДляМеня", 60); // Проверка раз в минуту
#КонецЕсли
КонецПроцедуры
А теперь разберем саму процедуру проверки. Важно понимать, что слишком частые запросы к базе данных (например, каждую секунду) могут существенно замедлить работу сервера. Оптимальный интервал для 1С:УПП составляет от 30 до 60 секунд.
Процедура ПроверитьНовыеСообщенияДляМеня() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Уведомления.ТекстСообщения,
| Уведомления.Ссылка
|ИЗ
| РегистрСведений.МоиУведомления КАК Уведомления
|ГДЕ
| Уведомления.Получатель = &ТекущийПользователь
| И Уведомления.Просмотрено = ЛОЖЬ";
Запрос.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
// Открываем форму оповещения
ОткрытьФорму("ОбщаяФорма.МоеОкноУведомления", Новый Структура("Данные", Результат.Выгрузить()));
КонецЕсли;
КонецПроцедуры
С точки зрения архитектуры 1С, если действие одного человека требует реакции другого, — это классическая Задача. В УПП есть встроенные бизнес-процессы. Мы можем программно создавать объект ЗадачаПользователя.
Посмотрим, в чем выгода такого подхода:
При реализации системы оповещений в обычном приложении 1С важно учитывать несколько критических моментов:
1. Модальные окна. Проанализируем ситуацию: если у пользователя открыто модальное окно (например, окно выбора файла или какой-то сложный отчет в модальном режиме), попытка программно открыть форму уведомления может привести к ошибке или блокировке интерфейса. В таких случаях рекомендуется использовать метод Сообщить() или системный Сигнал(), чтобы привлечь внимание звуком, не прерывая работу.
2. Блокировки базы данных. Если вы создаете свой регистр для уведомлений, обязательно устанавливайте режим управления блокировками данных в значение Управляемый. Если используется автоматический режим, запись уведомления для одного пользователя может временно заблокировать чтение для другого, что при большом количестве сотрудников создаст очереди (deadlocks).
3. Внешние интеграции. Если требуется мгновенное уведомление, которое пользователь увидит, даже если 1С свернута, рассмотрим использование HTTP-запросов к мессенджерам (например, Telegram). При проведении документа в 1С выполняется простая функция:
Процедура ОтправитьВТелеграм(Текст)
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage?chat_id=" + ID + "&text=" + Текст);
Соединение.Получить(Запрос);
КонецПроцедуры
Подведем итог. Для быстрой реализации в УПП лучше всего подходит использование типового регистра НапоминанияПользователя или документа Событие. Если же требуется сложная логика — используем ПодключитьОбработчикОжидания с обязательной оптимизацией запросов, чтобы не перегружать сервер.