В процессе совместной работы сотрудников в базах данных 1С часто возникает необходимость оперативного информирования. Типичный сценарий: один пользователь создает документ (например, Задание или Заказ покупателя), а другой пользователь, которому адресован этот документ, должен мгновенно или в плановом порядке получить всплывающее уведомление в интерфейсе программы.
В этой статье мы подробно разберем, какими методами можно решить эту задачу в конфигурациях на управляемых формах (на примере 1С:Управление торговлей 11, ERP или Комплексной автоматизации), проанализируем их плюсы и минусы, а также изучим конкретные примеры программного кода для реализации «надоедалок» и мгновенных уведомлений.
В большинство современных конфигураций 1С, построенных на базе Библиотеки стандартных подсистем (БСП), интегрирован стандартный механизм напоминаний. Он хранит данные в регистре сведений НапоминанияПользователя и выводит сообщения с помощью периодического опроса базы данных на стороне клиента.
Рассмотрим ситуацию, когда разработчики пытаются записать напоминание напрямую в регистр сведений через менеджер записи (как показано в одном из сообщений форума):
Рег = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
Рег.Активность = Истина;
Рег.ВремяСобытия = ЭтотОбъект.Дата + 120; // напомнить через 2 минуты
Рег.Источник = ЭтотОбъект.Ссылка;
Рег.ИнтервалВремениНапоминания = 30;
Рег.Описание = ЭтотОбъект.Наименование;
Рег.Пользователь = ЭтотОбъект.Исполнитель;
Рег.СрокНапоминания = ЭтотОбъект.СрокПроверки;
Рег.СпособУстановкиВремениНапоминания = Перечисления.СпособыУстановкиВремениНапоминания.Периодически;
Рег.Записать();
Проанализируем, почему такой код может работать некорректно или вызывать задержки:
ПроверитьТекущиеНапоминания), запускается на клиенте с определенной периодичностью (обычно раз в 5–15 минут). Поэтому созданное напоминание отобразится у получателя не сразу, а только при очередном срабатывании обработчика ожидания в его сеансе.Чтобы избежать ошибок и коллизий при записи ключевых полей, рекомендуется использовать штатный программный интерфейс общего модуля БСП НапоминанияПользователя. Вызовем этот метод на сервере:
// Пример корректной установки напоминания другому пользователю через API БСП
ТекстНапоминания = "Вам назначено новое задание: " + СокрЛП(ЭтотОбъект.Наименование);
ВремяНачала = ТекущаяДата() + 5; // Напомнить практически сразу
// Используем безопасный метод БСП
НапоминанияПользователя.УстановитьНапоминание(
ТекстНапоминания,
ВремяНачала,
0, // Интервал до события в секундах
ЭтотОбъект.Ссылка,
"КонтрольЗадачи" // Идентификатор напоминания
);
Важное примечание: Если вам необходимо, чтобы запись гарантированно создавалась от лица текущего пользователя для другого исполнителя без конфликта прав, выполняйте этот код в привилегированном модуле или временно устанавливайте безопасный режим работы.
Если перед нами стоит задача сделать «мгновенную» доставку сообщения без фризов интерфейса и без постоянной фоновой нагрузки на СУБД, то лучшим решением будет использование Системы взаимодействия. Это встроенный механизм платформы 1С:Предприятие, использующий протокол WebSockets.
В отличие от обработки ожидания, которая постоянно «дергает» сервер запросами к СУБД каждые несколько секунд (что при большом числе пользователей утилизирует ресурсы сервера), Система взаимодействия доставляет сообщения мгновенно по схеме Push-уведомлений.
Многие ошибочно считают, что для работы Системы взаимодействия обязательно нужна дорогостоящая КОРП-лицензия. На самом деле для большинства сценариев достаточно пройти бесплатную регистрацию на публичном сервере 1С (1c-dialog.com) непосредственно из панели администрирования вашей базы данных.
Рассмотрим пример отправки сообщения конкретному пользователю через Систему взаимодействия:
// Выясним идентификатор пользователя Системы взаимодействия
ПользовательСВ = СистемыВзаимодействия.ПолучитьПользователя(ИсполнительСсылка);
Если ПользовательСВ <> Неопределено Тогда
// Создаем обсуждение (или получаем существующее) один на один с пользователем
ПараметрыОбсуждения = Новый ПараметрыОбсужденияСистемыВзаимодействия;
ПараметрыОбсуждения.Ключ = "УведомленияПоЗаданиям";
ПараметрыОбсуждения.Название = "Системные уведомления";
МассивУчастников = Новый Массив;
МассивУчастников.Добавить(СистемыВзаимодействия.ТекущийПользователь().Идентификатор);
МассивУчастников.Добавить(ПользовательСВ.Идентификатор);
ПараметрыОбсуждения.Участники = МассивУчастников;
Обсуждение = СистемыВзаимодействия.СоздатьОбсуждение(ПараметрыОбсуждения);
Обсуждение.Записать();
// Отправляем сообщение
НовоеСообщение = СистемыВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
НовоеСообщение.Текст = "Вам направлено новое задание: " + ЭтотОбъект.Наименование;
НовоеСообщение.Записать();
КонецЕсли;
Такое сообщение мгновенно всплывет на экране у получателя в правом нижнем углу в виде стандартного оповещения операционной системы или платформы 1С, даже если конфигурация свернута.
Когда требуется жесткий контроль исполнения (чтобы напоминание не просто «всплыло и закрылось», а висело перед глазами пользователя до тех пор, пока он не примет задачу в работу), стандартные напоминания БСП не подходят — пользователь может случайно нажать кнопку «Прекратить», и задача затеряется.
Для таких целей в ERP, КА и УТ используется встроенная подсистема «Бизнес-процессы и задачи»:
Задание задача автоматически помещается на рабочий стол исполнителя в список Мои задачи.Выберем наиболее подходящий способ информирования в зависимости от требований к системе:
Таким образом, для простых задач информирования в фоновом режиме отлично подходит встроенный механизм напоминаний БСП, использующий метод НапоминанияПользователя.УстановитьНапоминание. Если же вам критически важна мгновенная доставка сообщений без ущерба для производительности системы, делайте выбор в пользу Системы взаимодействия.