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