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