Как реализовать всплывающее уведомление об окончании срока действия банковских карт в 1С?

Программист 1С v8.3 (Обычные формы) Финансы и профессиональные услуги
← На главную

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

Постановка задачи и выбор стратегии

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

Мы проанализируем три основных способа реализации этой задачи:

  1. Проверка при начале работы системы.
  2. Периодическая проверка с использованием обработчика ожидания.
  3. Использование регламентных заданий (для серверных баз).

Реализация через обработчик ожидания (Обычное приложение)

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

Сначала создадим процедуру проверки. Важно помнить, что тип Дата в 1С содержит время, поэтому простое равенство может не сработать. Проанализируем ситуацию: если в базе записано «10.12.2023 00:00:00», а текущая дата «10.12.2023 15:45:00», равенство ДатаОкончания = ТекущаяДата() вернет «Ложь».

Разберем правильный код запроса:


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

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


Процедура ПриНачалеРаботыСистемы()
    // Можно ограничить проверку только для конкретных ролей или пользователей
    Если ИмяПользователя() = "Администратор" Тогда
        ПодключитьОбработчикОжидания("ПроверкаСрокаДействияКарт", 3600);
    КонецЕсли;
КонецПроцедуры

Особенности реализации в Управляемом приложении (v8.3)

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

Рассмотрим по шагам, как это реализовать:

  1. Создадим общий модуль (например, ПроверкиСервер) с установленными флагами «Сервер» и «Вызов сервера».
  2. Перенесем логику запроса в этот модуль.
  3. В модуле управляемого приложения вызовем проверку.

Посмотрим на пример серверной функции, которая возвращает массив уведомлений:


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

На стороне клиента вместо обычного Сообщить лучше использовать современный метод ПоказатьОповещениеПользователя. Это всплывающее «toast-уведомление», которое не блокирует работу пользователя. Рассмотрим подробнее этот метод:


// В модуле управляемого приложения
Процедура ПроверитьКартыНаКлиенте() Экспорт
    НайденныеКарты = ПроверкиСервер.ПолучитьСписокПросроченныхКарт();
    Для Каждого Карта Из НайденныеКарты Цикл
        ТекстОповещения = "Срок действия карты " + Карта.Наименование + " истек!";
        ПоказатьОповещениеПользователя("Внимание!", ПолучитьНавигационнуюСсылку(Карта.Ссылка), ТекстОповещения);
    КонецЦикла;
КонецПроцедуры

Визуальный контроль в списках

Помимо всплывающих окон, мы рекомендуем настроить условное оформление в форме списка справочника. Это позволит пользователю видеть проблему еще до того, как сработает скрипт уведомления. Разберем, как это настроить в конфигураторе:

Откройте форму списка справочника, перейдите на вкладку «Условное оформление» и добавьте новое правило:

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

Если ваш справочник содержит тысячи записей, ежечасный поиск может привести к «подтормаживанию» интерфейса. Проанализируем ситуацию с точки зрения СУБД: чтобы запрос работал быстро, поле ДатаОкончания должно быть индексировано. В конфигураторе в свойствах реквизита установите значение Индексировать. Это позволит системе мгновенно находить нужные записи, не перебирая весь справочник целиком.

Также стоит рассмотреть использование Библиотеки стандартных подсистем (БСП). Если ваша конфигурация типовая (БП 3.0, УТ 11), в ней уже есть механизм «Напоминания пользователя». Вместо написания своего кода, вы можете программно создавать записи в регистре сведений НапоминанияПользователя, и система сама возьмет на себя вывод окон и возможность «отложить» напоминание на потом.

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

← На главную