Как реализовать форму заметок с оповещением на управляемых формах 1С

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

В процессе разработки пользовательских интерфейсов часто возникает задача создания системы оперативных уведомлений. Например, это может быть список «проблемных» договоров, по которым менеджеру необходимо принять решение в определенное время. Рассмотрим, как правильно спроектировать такую систему, начиная от структуры данных и заканчивая оптимизацией клиент-серверного взаимодействия.

Проектирование структуры данных

Для начала нам необходимо создать фундамент нашей системы — место, где будут храниться заметки. Оптимальным решением для этой задачи является использование независимого непериодического регистра сведений. Разберем состав его полей:

Измерения:

Ресурсы и реквизиты:

Реализация логики проверки на сервере

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

Для эффективной работы нам нужно, чтобы сервер возвращал простой ответ: «Нужно ли показывать форму прямо сейчас?». Рассмотрим оптимизированный код функции в общем модуле (например, ОбщегоНазначения), который проверяет наличие актуальных задач для текущего пользователя:


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

КонецФункции

Обратим внимание на использование ВЫБРАТЬ ПЕРВЫЕ 1. Нам не нужно получать все записи, достаточно убедиться, что хотя бы одна заметка требует внимания. Это существенно снижает нагрузку на базу данных.

Настройка обработчика ожидания на клиенте

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

Разберем, как инициализировать этот процесс:


// В модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
    // Устанавливаем интервал в секундах (например, 900 секунд для 15 минут)
    // Для тестирования можно использовать 10-20 секунд
    ПодключитьОбработчикОжидания("ПроверитьНаличиеЗаметок", 900, Ложь);
КонецПроцедуры

Процедура ПроверитьНаличиеЗаметок() Экспорт
    // Вызываем серверную проверку
    Если ОбщегоНазначения.ЕстьАктуальныеЗаметкиНаСервере() Тогда
        // Если есть задачи, открываем форму
        ОткрытьФорму("ОбщаяФорма.ФормаОповещенияЗаметок");
    КонецЕсли;
КонецПроцедуры

Использование флага Ложь в третьем параметре метода ПодключитьОбработчикОжидания означает, что процедура будет выполняться многократно с заданным интервалом.

Улучшение пользовательского интерфейса (UI/UX)

Простое открытие формы может раздражать пользователя, прерывая его текущую работу. Проанализируем более современные способы уведомлений, доступные в платформе 1С 8.3.

1. Использование всплывающих оповещений (Toasts)

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


Процедура ПроверитьНаличиеЗаметок() Экспорт
    Если ОбщегоНазначения.ЕстьАктуальныеЗаметкиНаСервере() Тогда
        ТекстОповещения = "У вас есть нерешенные задачи по договорам!";
        ОписаниеОповещения = Новый ОписаниеОповещения("ПриНажатииНаОповещение", ЭтотОбъект);
        ПоказатьОповещениеПользователя("Внимание!", , ТекстОповещения, БиблиотекаКартинок.Информация, СтатусОповещенияПользователя.Важное);
    КонецЕсли;
КонецПроцедуры

2. Механизм «Отложить»

В самой форме заметок полезно реализовать возможность переноса напоминания. Это реализуется обновлением ресурса ДатаОповещения в регистре сведений. Например, если пользователь нажимает кнопку «Напомнить через 30 минут», мы выполняем следующий код на сервере:


МенеджерЗаписи = РегистрыСведений.Заметки.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = ТекущийПользователь;
МенеджерЗаписи.Договор = ТекущийДоговор;
МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.ДатаОповещения = ТекущаяДата() + 1800; // Добавляем 1800 секунд
    МенеджерЗаписи.Записать();
КонецЕсли;

Оптимизация производительности и использование БСП

Рассмотрим ситуацию, когда база данных имеет большой объем. Постоянные запросы к регистру каждые 15 минут от каждого пользователя могут создать заметную нагрузку. Для минимизации влияния на производительность рекомендуется:

  1. Проверка активности: Не запускать проверку, если пользователь не проявлял активности в программе более 30 минут.
  2. Использование фоновых заданий: Для сложных проверок (например, если логика включает анализ остатков или взаиморасчетов) лучше запускать проверку в фоне, а на клиент возвращать уже готовый результат.
  3. Библиотека стандартных подсистем (БСП): Если в вашей конфигурации внедрена БСП, мы настоятельно рекомендуем использовать подсистему НапоминанияПользователя. В ней уже реализованы механизмы интервалов, привязки к любым объектам и оптимизированные запросы, которые учитывают часовые пояса и графики работы.

Выясним причину, по которой иногда форма может открываться «впустую». Это происходит из-за отсутствия жесткой типизации возвращаемого значения. Если ваша функция на сервере возвращает Дата(1,1,1), а на клиенте вы сравниваете её с ТекущаяДата(), условие может выполниться ошибочно. Поэтому всегда приводите результат к Булево (Истина/Ложь) — это самый надежный способ управления интерфейсом в логических задачах.

Таким образом, мы разобрали полный цикл создания системы заметок: от структуры хранения в регистре до элегантного вывода уведомлений пользователю. Используя эти подходы, вы сможете создать комфортную рабочую среду, которая будет помогать пользователям не забывать о важных задачах, не перегружая при этом систему лишними вызовами.

← На главную