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