Как правильно реализовать оповещение о сроке действия карт в 1С:Предприятии?

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

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

Выясним причину ошибки

Ошибка Тип не определен (Запрос) или Переменная не определена возникает из-за того, что объект Запрос является серверным. В архитектуре управляемого приложения клиентская часть (тонкий клиент, веб-клиент) имеет ограниченные права доступа к данным. Клиент не может напрямую обращаться к таблицам базы данных. Для выполнения любого запроса необходимо отправить задачу на сервер, дождаться выполнения и получить результат.

Шаг 1: Настройка общего модуля

Чтобы функции общего модуля были доступны для вызова с клиента, необходимо правильно выставить свойства модуля в конфигураторе:

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

После этого система автоматически создаст механизмы для передачи вызова с клиента на сервер и обратно.

Шаг 2: Правильная структура серверного кода

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


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

Шаг 3: Вызов с клиента

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


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

Рекомендации по оптимизации

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

Следуя этим простым шагам, вы обеспечите стабильную работу системы и избавитесь от ошибок контекста выполнения.

← На главную