Как в 1С запретить открытие отчета, если в нем нет данных?

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

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

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

Подход 1: Полный запрет открытия формы

Основная идея этого метода — перехватить процесс создания формы отчета на сервере, выполнить предварительную проверку наличия данных и, если их нет, отменить открытие.

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

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

Посмотрим на пример реализации в модуле формы отчета.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Получаем текущие настройки компоновки данных. 
    // Предполагается, что основные отборы заданы в них.
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

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

КонецПроцедуры

Нюансы и недостатки полного запрета

Несмотря на то, что технически задача решается, у такого подхода есть серьезные минусы, которые стоит учитывать:

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

Подход 2: Рекомендованный вариант — информирование внутри отчета

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

Логика этого подхода следующая:

Преимущества этого подхода:

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

← На главную