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