Отчет о потреблении на основе суточных данных с детализацией по суткам с неполной наработкой почасовыми значениями

Стоит задача автоматической рассылки отчетов о потреблении на основе суточных значений. Отчет представляет собой ведомость параметров. Если в отчетном периоде есть сутки с неполной наработкой, то для этих суток (и только для них) формируется дополнительная ведомость параметров, основанная на часовых данных. Например, если в отчете за период с 1 по 31 марта данные за 10 и 12 марта содержат неполную нааботку в часах, то к отчету потребления на основе суточных данных необходимо добавить еще один отчет с часовыми данными за 10 и 12 марта. Таким образом, в дополнительном отчете будет таблица с 48 строками данных.

Дополнительный отчет может быть представлен в виде дополнительных страниц в основном отчете (начиная со второй страницы) или в виде отдельного файла – это не принципиально.

Я не смог найти решение этой задачи средствами ЛЭРС Учет. Есть ли способы ее реализации?

Формировать отчет можно только по одному типу данных. Одновременно по часовым и по суточным сформировать отчет невозможно.

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

Насколько я понимаю, эта схема значительно увеличит время формирования отчета. Минимум, в 10 раз.

А это требование из той системы, под которую делается это: [15859] Массовая рассылка отчетов о потреблении. То есть, и так, скорее всего, придется распределять по времени формирование отчетов, а тут из-за небольшого количества дополнительных отчетов мы все отчеты будем формировать значительно медленнее.

Я полагаю, будет более разумно, с точки зрения эксплуатации системы, обсудить с вами появление автоматической рассылки отчетов, которая происходит при выполнении условия. В данном случае, если за отчетный период наработка в часах меньше отчетного периода.

Видите ли вы неточности в моих рассуждениях?

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

Не понял ответа. Я предположил, что отчёт с двумя подотчётами, в котором суточные данные будут формироваться из часовых, будет формироваться, по моим прикидкам, как минимум на порядок дольше, чем отчёт, где только суточные данные за тот же период.

Это так?

Я предполагаю, что можно реализовать следующую схему:

• Рассылать обычный отчёт о потреблении на основе посуточных данных всем адресатам.
• Сделать условную рассылку отчёта с почасовыми данными, как вы и советовали: “… где выводить часовые данные только по суткам с неполной наработкой”.

Эта схема, в общем случае, на мой взгляд, должна значительно меньше нагружать сервер, и рассылка будет проходить быстро.

Если из контекста не ясно, то в конкретной системе предполагается, что нужно сделать рассылку отчётов нескольким сотням адресатов в один день.

Теперь ваша идея стала более понятной. Вы можете оформить отдельное предложение по улучшению добавить желаемый способ запуска автоматического формирования отчетов.

Почти получилось сделать отчет по Вашему совету. Осталось выполнить “фильтрацию вы можете реализовать в скрипте в обработчике события BaseReport_DataSourceDemanded.” Насколько я понимаю, что-то подобное описано в примере https://docs.lers.ru/manual/reporting/how-to/calcfield-with-data-from-different-timestamps/index.html
// Количество записей в источнике данных для секции Detail
int n = (int)DataSourceUtils.GetRecordsCount(tableCell_DataDate);
// Формируем коллекции возвращаемых значений для вычисляемых полей
for(int i = 0; i < n; i++)
{…}
Вопрос 1. Можно ли сразу без вывода через вычисляемые поля проверить ячейку с наработкой и удалить запись из секции Detail?
Вопрос 2. Как обратиться к секции Detail 1 вложенного отчета? В приведенном куске кода привязка идет по названию ячейки, видимо нужно просто его поменять на названии ячейки из секции Detail 2?

Не совсем корректная постановка вопроса. Секция Detail является своего рода шаблоном строки соответствующей таблицы отчета, которая будет сформирована при формировании отчета. На сколько я понимаю, речь идет именно об этой таблице из которой после формирования отчета вы хоте ли бы удалить лишние строки часовых данных. Нет, редактирование данной таблицы сформированного отчета не предусмотрено.

Вы можете обращаться к ячейкам обеих секций в коде, но вам стоит учитывать, что обработка секций происходит последовательно. Например, если вы будете обращаться к ячейкам секции Detail2 из обработчика события, например, BeforePrint ячеек секции Detail1, то в значения ячейки из секции Detail2 еще не будет заполнено.
Более того стоит учитывать что в ячейке хранится только последнее значение, сохраненное в ячейке. То есть после формирования таблицы по секции Detail1 в ячейках данной секции будет хранится только последнее значение, с которым происходила работа в рамках формирования таблицы секции. Например, если вы просто сформируете талицу по секции Detail1 без фильтрации, то в ячейках таблицы будут хранится значения последней строки данной таблицы.

Не получается сделать фильтрацию обработчике события BaseReport_DataSourceDemanded.
Как только я добавляю вложенные отчеты, метод DataSourceUtils.GetRecordsCount(tableCell_DataDate) начинает возвращать 0. Попытался вызывать обработчик BaseReport_DataSourceDemanded не для всего отчета, а только для нового подотчета, но ничего не изменилось. Подскажите, что можно ещё сделать?

Приложите, пожалуйста, вашу отчетную форму.