Как программно создать системное напоминание в 1С:УНФ и других конфигурациях на базе БСП

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

При переходе с более старых редакций или самописных решений на современные конфигурации, такие как 1С:Управление нашей фирмой (УНФ) 1.6, 1С:Управление торговлей 11 или 1С:ERP, разработчики часто сталкиваются с тем, что привычные методы вроде НапомнитьВУказанноеВремя больше не являются оптимальными. В современных системах, построенных на базе Библиотеки стандартных подсистем (БСП), механизм напоминаний реализован гораздо глубже: он интегрирован в общую структуру базы данных, позволяет привязываться к объектам и работать в фоновом режиме для разных пользователей.

В этой статье мы подробно разберем, как реализовать программное создание напоминаний, рассмотрим основные методы общего модуля и выясним, как правильно автоматизировать этот процесс при проведении документов.

Анализ механизма напоминаний в БСП

Прежде чем переходить к написанию кода, давайте разберем, как система хранит и обрабатывает данные. В отличие от простых диалоговых окон, системные напоминания в 1С — это записи в специализированном регистре сведений НапоминанияПользователя. Это дает ряд преимуществ:

  1. Отказоустойчивость: если пользователь закроет программу, напоминание не исчезнет. Оно «всплывет» сразу после следующего входа в систему.
  2. Привязка к данным: напоминание может быть жестко связано с документом или справочником.
  3. Многопользовательская работа: один пользователь (или сама система) может создать напоминание для другого сотрудника.

Основным инструментом для работы разработчика здесь выступает общий модуль НапоминанияПользователя. Работа напрямую с набором записей регистра возможна, но крайне не рекомендуется, так как API модуля берет на себя проверку прав, заполнение служебных полей и корректную инициализацию параметров.

Программное создание напоминания: пошаговый алгоритм

Рассмотрим основной метод, который используется для создания новой записи — НапоминанияПользователя.УстановитьНапоминание(). Для его работы необходимо подготовить структуру параметров. Разберем этот процесс на примере задачи: создать напоминание для менеджера при проведении заказа покупателя.

Проанализируем следующий пример кода, который можно разместить в модуле менеджера или в подписке на событие:


Процедура СоздатьНапоминаниеМенеджеру(ДокументСсылка, ТекстСообщения, ДатаСрабатывания, ОтветственныйПользователь) Экспорт

    ПараметрыНапоминания = Новый Структура;
    ПараметрыНапоминания.Вставить("Объект", ДокументСсылка);
    ПараметрыНапоминания.Вставить("Текст", ТекстСообщения);
    ПараметрыНапоминания.Вставить("ВремяНапоминания", ДатаСрабатывания);
    ПараметрыНапоминания.Вставить("Пользователь", ОтветственныйПользователь);
    
    // Способ установки времени определяет логику поведения напоминания
    ПараметрыНапоминания.Вставить("СпособУстановкиВремени", Перечисления.СпособыУстановкиВремениНапоминания.ВУказанноеВремя);
    
    НапоминанияПользователя.УстановитьНапоминание(ПараметрыНапоминания);

КонецПроцедуры

Разберем подробнее ключевые поля структуры ПараметрыНапоминания:

Гибкая привязка ко времени документа

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

Для этого в структуре параметров используется способ ОтносительноВремениПредмета. В этом случае в параметрах нужно дополнительно указать имя реквизита документа, на который система будет ориентироваться. Это позволяет избежать постоянного пересчета времени вручную при редактировании документов.

Автоматизация при проведении документа

Автор темы на форуме интересовался, как «прикрутить» это к документу при проведении. Рассмотрим важный нюанс: если мы просто добавим вызов процедуры в ОбработкаПроведения, то при каждом перепроведении документа у пользователя будет создаваться дубль напоминания. Это быстро засорит систему.

Чтобы этого избежать, проанализируем ситуацию и добавим проверку на существование активного напоминания. Проверить наличие записи можно запросом к регистру сведений НапоминанияПользователя по комбинации полей Пользователь и Источник (Объект).

Пример реализации логики с проверкой дублей:


// В модуле объекта документа
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Выполняем стандартные действия проведения...
    
    // Проверим, не создавали ли мы уже напоминание по этому заказу
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	НапоминанияПользователя.Пользователь
        |ИЗ
        |	РегистрСведений.НапоминанияПользователя КАК НапоминанияПользователя
        |ГДЕ
        |	НапоминанияПользователя.Пользователь = &Пользователь
        |	И НапоминанияПользователя.Источник = &Источник";
    
    Запрос.УстановитьПараметр("Пользователь", ЭтотОбъект.Ответственный);
    Запрос.УстановитьПараметр("Источник", ЭтотОбъект.Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        // Создаем напоминание только если его еще нет
        СоздатьНапоминаниеМенеджеру(ЭтотОбъект.Ссылка, "Проверить оплату по заказу", ТекущаяДата() + 3600, ЭтотОбъект.Ответственный);
    КонецЕсли;

КонецПроцедуры

Особенности работы клиентской части

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

Если ваша задача требует не записи в базу «на будущее», а немедленного открытия окна формы напоминания здесь и сейчас (интерактивно), следует использовать клиентский метод общего модуля:

НапоминанияПользователяКлиент.ОткрытьФормуНапоминания(ПараметрыНапоминания);

Однако помните, что этот метод работает только на стороне клиента и не подходит для серверных процедур проведения документа.

Резюме

Мы выяснили, что для реализации системных напоминаний в 1С:УНФ 1.6 необходимо использовать возможности БСП. Основным инструментом является общий модуль НапоминанияПользователя и метод УстановитьНапоминание. При разработке всегда учитывайте необходимость проверки на существующие записи, чтобы не создавать дубли при повторном проведении документов, и используйте соответствующие способы установки времени для достижения максимальной гибкости системы.

← На главную