Оповещение сотрудников в ЗУП
Задачи пользователя - Адаптация типовых решений
Бесплатные
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО
Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Здравствуйте. Поступила мне задача/желание наших коллег, чтобы было уведомление в ЗУП о разных событиях.
Например, кадровики завели документ, нужно уведомить расчетчиков, чтобы его рассчитали, проверили... Ну и другие подобные ситуации.
Данная задача была решена в виде расширения конфигурации (рис.1):

рис.1
Интерфейс имеет следующий вид (рис.2):

рис.2
Основа данного решения - это справочник сценарии оповещения - рис.3

рис.3
В данном справочнике мы создаем правила оповещения - запрос на выборку данных. Запрос должен возвращать ссылку на документ.
Если же выбран тип "сложный запрос", то таблицу - подразумевается, что можно в запросе сформировать таблицу оповещений для вывода ее пользователю - рис.4

рис.4
Далее мы привязываем данные правила пользователям ЗУП - рис.5.

рис.5
Как принципиально это работает:
1. При входе в систему, а также с помощью обработчика ожидание создается задание на выполнение сценария оповещения.
&НаКлиенте
Процедура ЗапускОповещения() Экспорт
// получить текущего пользователя
ТекущийПользователь = Оп_ОповещенияСервер.ТекущийПользователь();
// Проверить начислие роли
Если Оп_ОповещенияСервер.ЕслиДоступноОповещение(ТекущийПользователь) = Истина Тогда
// получить все виды документов, на которые необходимо создать оповещения
массивДокументов = Оп_ОповещенияСервер.ПолучитьНастройкиОповещенияДляПользователя(ТекущийПользователь);
// получить все документы, для которых необходимо создать оповещение
массивОповещений = Оп_ОповещенияСервер.ПолучитьДокументыОповещенияДляПользователя(массивДокументов, ТекущийПользователь);
Если массивОповещений <> Неопределено И массивОповещений.Количество()>0 Тогда
// выполнить оповещение
Для Каждого эл Из массивОповещений Цикл
Документ = эл.Документ;
Сообщение = эл.Сообщение;
// проверить наличие оповещения в журнале оповещений
кол_записей = Оп_ОповещенияСервер.ПроверитьОповещениеВЖурналеОповещений(НачалоМесяца(ТекущаяДата()), ТекущийПользователь, Документ);
Если кол_записей = 0 Тогда
Оп_ОповещенияСервер.ДобавитьОповещениеВЖурналОповещений(НачалоМесяца(ТекущаяДата()), ТекущийПользователь, Документ, Сообщение);
ПоказатьОповещениеПользователя("ОБРАТИТЕ ВНИМАНИЕ!", ПолучитьНавигационнуюСсылку(Документ), Сообщение, ,СтатусОповещенияПользователя.Важное);
Иначе
// не показывать оповещение
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&После("ПриНачалеРаботыСистемы")
Процедура Оп_ПриНачалеРаботыСистемы()
ЗапускОповещения();
// подключить обработчик ожидания
// Проверить начислие роли
// получить текущего пользователя
ТекущийПользователь = Оп_ОповещенияСервер.ТекущийПользователь();
Если Оп_ОповещенияСервер.ЕслиДоступноОповещение(ТекущийПользователь) = Истина Тогда
ОчиститьСообщения();
ПодключитьОбработчикОжидания("ЗапускОповещения", 7200, Ложь);
КонецЕсли;
КонецПроцедуры
2. После выполнения оповещения событие записывается в регистр. Это нужно для того, что бы каждое уведомление выполнялось только 1 раз (рис.6).

рис.6
Все логика находится в серверном модуле Оп_ОповещенияСервер:
&НаСервере
Функция ТекущийПользователь() Экспорт
Возврат Пользователи.ТекущийПользователь();
КонецФункции
// выполнить тестирование запроса
&НаСервере
Функция ВыполнитьТестЗапроса(ТекстЗапроса, СложныйЗапрос) Экспорт
// доступные переменные в запросе
ТекущаяДата = ТекущаяДата();
//
запрос = Новый Запрос;
запрос.Текст = ТекстЗапроса;
// обработать текст запроса
Если СтрНайти(ТекстЗапроса,"&ТекущаяДата")>0 Тогда
запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата);
КонецЕсли;
//
Если СложныйЗапрос = Ложь Тогда
Попытка
результат = запрос.Выполнить();
Если результат.Пустой() Тогда
Возврат "Успешно, но результат - ПУСТОЙ!";
Иначе
Возврат "Успешно!";
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат ОписаниеОшибки;
КонецПопытки;
Иначе
Попытка
результат = запрос.Выполнить();
счетчик = 0;
Для Каждого Колонка Из результат.Колонки Цикл
Если Колонка.Имя = "Ссылка" Тогда
счетчик = счетчик+1;
КонецЕсли;
Если Колонка.Имя = "Сообщение" Тогда
счетчик = счетчик+1;
КонецЕсли;
Если Колонка.Имя = "Объект" Тогда
счетчик = счетчик+1;
КонецЕсли;
КонецЦикла;
Если счетчик = 3 И результат.Пустой() Тогда
Возврат "Успешно, но результат - ПУСТОЙ!";
ИначеЕсли счетчик =3 И НЕ результат.Пустой() Тогда
Возврат "Успешно!";
Иначе
Возврат "Ошибка! В результате запроса остуствуют необходимые колонки: Ссылка, Сообщение, Результат";
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат ОписаниеОшибки;
КонецПопытки;
КонецЕсли
КонецФункции
// если есть правило для данного пользователя - то выполнять оповещение
&НаСервере
Функция ЕслиДоступноОповещение(ТекущийПользователь) Экспорт
запрос = Новый Запрос;
запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Оп_НастройкаОповещений КАК Оповещения ГДЕ Оповещения.Пользователь = &Пользователь";
запрос.УстановитьПараметр("Пользователь",ТекущийПользователь);
результат = запрос.Выполнить();
Если НЕ результат.Пустой() Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
// полчить виды документов для которых необходимо создать оповещение для пользователя
&НаСервере
Функция ПолучитьНастройкиОповещенияДляПользователя(ТекущийПользователь) Экспорт
массив = Новый Массив;
запрос = Новый Запрос;
запрос.Текст = "
|ВЫБРАТЬ
| Оповещения.СценарийОповещения КАК СценарийОповещения
|ИЗ
| Справочник.Оп_НастройкаОповещений.ТипыДокументов КАК Оповещения
|ГДЕ
| Оповещения.Ссылка.Пользователь = &ТекущийПользователь
| И Оповещения.Ссылка.ПометкаУдаления = Ложь ";
запрос.УстановитьПараметр("ТекущийПользователь",ТекущийПользователь);
результат = запрос.Выполнить();
Если результат.Пустой() Тогда
Возврат Неопределено;
Иначе
Выборка = результат.Выбрать();
Пока Выборка.Следующий() Цикл
массив.Добавить(Выборка.СценарийОповещения);
КонецЦикла;
Возврат массив;
КонецЕсли;
КонецФункции
// получить документы для которых необходимо содать оповещения для пользователя и занести из в регистр
&НаСервере
Функция ПолучитьДокументыОповещенияДляПользователя(МассивСценариев, ТекущийПользователь, СложныйЗапрос=Ложь) Экспорт
МассивСообщений = Новый Массив;
// перебрать массив сценариев оповещений
Если МассивСценариев <> Неопределено Тогда
// доступные переменные в запросе
ТекущаяДата = ТекущаяДата();
// записать в регистр
Для Каждого сценарий Из МассивСценариев Цикл
Если сценарий.СложныйЗапрос = Истина Тогда
СложныйЗапрос = Истина;
КонецЕсли;
запрос = Новый Запрос;
запрос.Текст = сценарий.Запрос;
// обработать текст запроса
Если СтрНайти(запрос.Текст,"&ТекущаяДата")>0 Тогда
запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата);
КонецЕсли;
//
Если СложныйЗапрос = Ложь Тогда
Попытка
результат = запрос.Выполнить();
Если результат.Пустой() Тогда
Продолжить;
Иначе
выборка = результат.Выбрать();
Пока выборка.Следующий() Цикл
структура = Новый Структура;
структура.Вставить("Пользователь",ТекущийПользователь);
структура.Вставить("Документ",выборка.Ссылка);
структура.Вставить("Сообщение",сценарий.Сообщение +" "+ Строка(выборка.Ссылка));
МассивСообщений.Добавить(структура);
КонецЦикла;
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат ОписаниеОшибки;
КонецПопытки;
Иначе
Попытка
результат = запрос.Выполнить();
Если результат.Пустой() Тогда
Возврат Неопределено;
Иначе
выборка = результат.Выбрать();
Пока выборка.Следующий() Цикл
структура = Новый Структура;
структура.Вставить("Пользователь",ТекущийПользователь);
структура.Вставить("Документ",выборка.Ссылка);
структура.Вставить("Сообщение",выборка.Сообщение +" "+"для "+выборка.Объект+" ("+ Строка(выборка.Ссылка)+")");
МассивСообщений.Добавить(структура);
КонецЦикла;
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат ОписаниеОшибки;
КонецПопытки;
КонецЕсли;
КонецЦикла;
Возврат МассивСообщений;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#Область РаботаСРегистром
// добавить новую запись в регистр ЖурналОповещений
&НаСервере
Процедура ДобавитьОповещениеВЖурналОповещений(Период, Пользователь, СсылкаНаДокумент, Оповещение) Экспорт
НоваяЗапись = РегистрыСведений.Оп_ЖурналОповещений.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = Период;
НоваяЗапись.Пользователь = Пользователь;
НоваяЗапись.СсылкаНаДокумент = СсылкаНаДокумент;
НоваяЗапись.Оповещение = Оповещение;
НоваяЗапись.Записать();
КонецПроцедуры
// проверить на наличие записи в регистре ЖурналОповещений
&НаСервере
Функция ПроверитьОповещениеВЖурналеОповещений(Период, Пользователь, СсылкаНаДокумент) Экспорт
запрос = Новый Запрос;
запрос.Текст = "
|ВЫБРАТЬ *
|ИЗ РегистрСведений.Оп_ЖурналОповещений КАК ЖурналОповещений
|ГДЕ ЖурналОповещений.Период = &Период И ЖурналОповещений.Пользователь = &Пользователь И ЖурналОповещений.СсылкаНаДокумент = &СсылкаНаДокумент ";
запрос.УстановитьПараметр("Период",Период);
запрос.УстановитьПараметр("Пользователь",Пользователь);
запрос.УстановитьПараметр("СсылкаНаДокумент",СсылкаНаДокумент);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();
КоличествоЗаписей = Выборка.Количество();
Возврат КоличествоЗаписей;
КонецФункции
#КонецОбласти
Оповещения появляются в "колокольчике", откуда по ссылке можно перейти в нужный документ.
Имеются 2 роли (рис.7)

рис.7
Роль для всех пользователей - назначается только тем, кого нужно оповещать, а полный доступ - для администратора.
Данную доработку легко можно адаптировать и для других конфигураций 1С.
Распространяю "как есть...", всем спасибо за проявленный интерес!
С уважением.
Проверено на следующих конфигурациях и релизах:
- Зарплата и управление персоналом КОРП, редакция 3.1, релизы 3.1.37.16
Вступайте в нашу телеграмм-группу Инфостарт