Где находятся процедуры напоминания в 1С:УПП 1.3 и как изменить логику их работы?

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При работе с конфигурацией «Управление производственным предприятием» (УПП) редакции 1.3 разработчики часто сталкиваются с необходимостью кастомизации механизма напоминаний. Типовая задача — изменить адресата уведомления. Например, во «Внутреннем заказе» напоминание по умолчанию приходит Ответственному, а требуется, чтобы оно отображалось у конкретного Сотрудника (исполнителя). Разберем детально, как устроена эта подсистема, почему стандартный поиск через замер производительности может не дать результатов и где именно вносить правки.

Архитектурные отличия механизма напоминаний в УПП 1.3

Прежде всего, проанализируем ключевое отличие УПП 1.3 от современных конфигураций на платформе 8.3 (таких как ERP, КА 2 или УТ 11). В новых решениях используется регистр сведений «Напоминания пользователя», куда записывается отдельная строка в момент возникновения события. В УПП 1.3 реализован совершенно иной подход — опросный метод.

Система не создает отдельную запись в базе данных при проведении документа. Вместо этого она периодически сканирует таблицы самих документов (Внутренние заказы, Заказы покупателей, События и т.д.) на предмет включенных флажков напоминаний. Рассмотрим, как это реализовано в коде.

Где искать исполняемый код: Общий модуль и обработчик ожидания

Выясним, какая процедура отвечает за проверку наличия новых напоминаний. Основная логика сосредоточена в общем модуле УправлениеКонтактами. Если мы выполним глобальный поиск по конфигурации, то увидим, что запуск механизма происходит при старте системы через обработчик ожидания.

Процедура УправлениеКонтактами.ПроверитьНапоминанияПользователя() вызывается с определенной периодичностью (обычно раз в минуту). Именно поэтому замер производительности в момент записи документа ничего не дает — в этот момент никакие записи для напоминаний просто не формируются.

Разбор формирования списка напоминаний

Проанализируем процесс сбора данных. Внутри модуля УправлениеКонтактами находится сложный динамический запрос. Система собирает данные из всех типов документов, поддерживающих механизм напоминаний. Рассмотрим примерную структуру логики:

  1. Программа обращается к функции, формирующей текст запроса (обычно это СформироватьЗапросПоДокументамСНапоминаниями или аналогичные блоки кода внутри процедур проверки).
  2. Запрос строится с использованием оператора ОБЪЕДИНИТЬ ВСЕ. Для каждого метаданного (например, Документ.ВнутреннийЗаказ) прописан свой сегмент ВЫБРАТЬ.
  3. Система ищет документы, соответствующие следующим критериям:
    • Реквизит Напомнить равен Истина.
    • Реквизит НапоминаниеЗавершено равен Ложь.
    • Значение ДатаНапоминания меньше или равно текущей дате.
    • Поле, отвечающее за пользователя (обычно Ответственный), соответствует текущему авторизованному пользователю.

Как изменить «Ответственного» на «Сотрудника» во Внутреннем заказе

Чтобы решить задачу автора и перенаправить напоминание с ответственного на сотрудника, нам необходимо отредактировать текст запроса в общем модуле. Выполним следующие шаги:

1. Откроем общий модуль УправлениеКонтактами и найдем место, где формируется запрос к Документ.ВнутреннийЗаказ.

2. В блоке ВЫБРАТЬ для этого документа мы увидим строку, подобную этой:

ВЫБРАТЬ Ссылка.Ответственный КАК Пользователь, ... ИЗ Документ.ВнутреннийЗаказ КАК Ссылка

3. Заменим Ссылка.Ответственный на нужный нам реквизит, например, Ссылка.Сотрудник или Ссылка.Исполнитель. Итоговый фрагмент кода будет выглядеть примерно так:


ТекстЗапроса = "ВЫБРАТЬ
               |    ВнутреннийЗаказ.Ссылка КАК Источник,
               |    ВнутреннийЗаказ.Сотрудник КАК Пользователь,
               |    ВнутреннийЗаказ.СодержаниеНапоминания КАК Содержание
               |ИЗ
               |    Документ.ВнутреннийЗаказ КАК ВнутреннийЗаказ
               |ГДЕ
               |    ВнутреннийЗаказ.Напомнить = ИСТИНА
               |    И ВнутреннийЗаказ.НапоминаниеЗавершено = ЛОЖЬ
               |    И ВнутреннийЗаказ.ДатаНапоминания <= &ТекущаяДата";

Важный нюанс: при замене реквизита обязательно убедитесь, что тип данных нового поля совпадает с типом СправочникСсылка.Пользователи. Если поле Сотрудник ссылается на справочник СотрудникиОрганизаций или ФизическиеЛица, вам потребуется получить связанного пользователя через дополнительные связи в запросе, иначе механизм сравнения с ПараметрыСеанса.ТекущийПользователь не сработает.

Визуализация напоминаний: Обработка «НапоминаниеОСобытии»

После того как запрос выберет подходящие документы, данные передаются в обработку НапоминаниеОСобытии. Именно она отвечает за всплывающее окно, которое видит пользователь. Если вы успешно изменили поле Пользователь в запросе, то при следующем срабатывании обработчика ожидания система «увидит» документ уже под учетной записью нужного сотрудника и выведет ему окно уведомления.

Рекомендации по настройке интервала

Если напоминания приходят слишком поздно или, наоборот, создают лишнюю нагрузку на сервер, проверим настройки интервала. В модуле обычного приложения (или в процедурах инициализации системы) найдем вызов УправлениеКонтактами.УстановитьИнтервалПроверкиНапоминаний().

Также стоит помнить, что в УПП 1.3 напоминания работают только для активных сессий. Если пользователь, которому назначено напоминание, не вошел в систему, уведомление останется «висеть» в базе данных в невыполненном состоянии до момента его следующего входа.

Таким образом, мы выяснили, что для изменения логики уведомлений в УПП 1.3 не нужно искать место «записи» напоминания. Вместо этого необходимо скорректировать централизованный запрос сбора данных в общем модуле, изменив источник получения идентификатора пользователя.

← На главную