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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке и доработке внешних отчетов на базе типового механизма Универсальный отчет (часто встречающегося в 1С:Управление торговлей 10.3, Комплексная автоматизация 1.1 и УПП 1.3) нередко возникает задача проанализировать сформированные данные. Например, требуется проверить корректность заполнения реквизитов номенклатуры, уведомить пользователя о наличии ошибок или вывести сводное сообщение после завершения формирования.

Рассмотрим, как правильно получить результат выполнения запроса во внешнем отчете, не дублируя запросы к СУБД и не нарушая работу базовых алгоритмов универсального отчета.

Особенности работы с объектом ПостроительОтчета

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

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

Корректный алгоритм перехвата результата в модуле внешнего отчета

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

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

Посмотрим на пример реализации данного подхода в коде процедуры формирования:


Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт

    // Выполняем построитель отчета
    УниверсальныйОтчет.ПостроительОтчета.Выполнить();
    
    // Получаем результат запроса без повторного обращения к СУБД
    РезультатЗапроса = УниверсальныйОтчет.ПостроительОтчета.Результат;
    
    Если Не РезультатЗапроса.Пустой() Тогда
        
        Выборка = РезультатЗапроса.Выбрать();
        КоличествоОшибок = 0;
        
        Пока Выборка.Следующий() Цикл
            // Проверяем заполнение необходимых параметров или реквизитов
            Если Не ЗначениеЗаполнено(Выборка.Номенклатура) Тогда
                Продолжить;
            КонецЕсли;
            
            // Пример проверки реквизита номенклатуры
            Если Не ЗначениеЗаполнено(Выборка.Номенклатура.Артикул) Тогда
                КоличествоОшибок = КоличествоОшибок + 1;
            КонецЕсли;
        КонецЦикла;
        
        // Выводим данные отчета в табличный документ
        УниверсальныйОтчет.ПостроительОтчета.Вывести(ТабличныйДокумент);
        
        // Оповещаем пользователя при обнаружении некорректных данных
        Если КоличествоОшибок > 0 Тогда
            Сообщить("Внимание! В отчете обнаружены позиции без заполненного артикула: " + Строка(КоличествоОшибок) + " шт.", СтатусСообщения.Важное);
        КонецЕсли;
        
    Иначе
        // Если результат пустой, выводим стандартный макет
        УниверсальныйОтчет.ПостроительОтчета.Вывести(ТабличныйДокумент);
    КонецЕсли;

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

Альтернативные способы анализа данных и выделения ошибок

Проанализируем альтернативные варианты, которые позволяют решить задачу оповещения пользователя без вмешательства в структуру выборки:

  1. Анализ расшифровки готового табличного документа: При стандартном выводе отчета ячейки группировок заполняются значениями расшифровки. После выполнения Вывести(ТабличныйДокумент) можно программно обойти строки табличного документа, прочитать свойство Расшифровка ячеек, собрать ссылки на элементы справочника Номенклатура и выполнить пакетную проверку.
  2. Использование условного оформления: Вместо всплывающих сообщений и окон можно использовать свойство ПостроительОтчета.УсловноеОформление. Это позволяет выделить проблемные строки прямо в бланке отчета (например, подсветить красным фоном строки с незаполненными реквизитами), что нагляднее для конечного пользователя.

Архитектурные рекомендации по контролю данных

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

По этой причине проверку качества заполнения нормативно-справочной информации (НСИ) рекомендуется переносить на этап записи элементов справочника (через подписку на событие ПередЗаписью) либо использовать отдельные сервисные обработки проверки данных вместо проверок при формировании отчетов.

← На главную