В типовых конфигурациях (таких как 1С:Управление торговлей, 1С:ERP Управление предприятием, 1С:Комплексная автоматизация) большинство стандартных отчетов, например, «Ведомость по товарам на складах», предоставляют пользователю возможность выбирать интервал только в пределах дат (дней). Однако при оперативном учете нередко возникает необходимость сформировать отчет за конкретные часы и минуты — к примеру, с 10:00 утра до 14:30 дня.
Разберем природу этого ограничения и пошагово рассмотрим, как доработать отчет для ввода времени, а также выясним, с какими программными нюансами можно столкнуться при реализации.
Проанализируем устройство типового отчета в схеме компоновки данных (СКД). На форме отчета обычно выведен параметр с типом СтандартныйПериод. Этот системный тип платформы «1С:Предприятие» предназначен строго для работы с календарными днями («Этот месяц», «Прошлый квартал», «Произвольный период» и др.) и на уровне платформы не поддерживает ввод времени.
При этом в схеме компоновки данных виртуальные таблицы регистров (например, ОстаткиИОбороты) фильтруются параметрами НачалоПериода и КонецПериода. В типовых решениях эти параметры скрыты (у них установлена галочка «Ограничение доступности»), а их значения рассчитываются через выражения:
&Период.ДатаНачала
&Период.ДатаОкончания
Таким образом, параметр Период служит лишь удобной визуальной оболочкой, передающей начало дня в НачалоПериода и конец дня в КонецПериода.
Самый прямой и надежный способ решить задачу — перенести отчет в расширение конфигурации (или сохранить как внешний отчет) и настроить параметры напрямую.
Период (или СтандартныйПериод). Удалим его либо снимем признак включения в пользовательские настройки.НачалоПериода и КонецПериода. Снимем у них флаг в колонке Ограничение доступности, чтобы они стали видимы для пользователя.НачалоПериода и КонецПериода, ссылавшиеся на параметр &Период.Дата, а в свойствах типа данных свойство Состав дат установлено в значение Дата и время. Если там будет стоять «Дата», форма сбросит или скроет введенное время.ДЛФ=D). При необходимости зададим явный формат: ДФ='dd.MM.yyyy HH:mm:ss'.После изменения схемы компоновки данных результат не всегда применяется сразу. Разберем скрытые препятствия, которые могут возникнуть при работе с типовыми конфигурациями на БСП:
1. Кэширование пользовательских настроек: подсистема вариантов отчетов БСП сохраняет последние настройки пользователя. Если после изменения схемы параметры на форме не появились или отображаются по-старому, откроем отчет, перейдем в меню Еще и выберем пункт Стандартные настройки.
2. Принудительное приведение дат в коде: в модуле объекта отчета (в процедурах ПриКомпоновкеРезультата) разработчики типовых решений нередко программно перезаписывают переданные границы. Например, для конечной даты может принудительно вызываться функция КонецДня(). Если при формировании отчета указанное пользователем время игнорируется, проверим модуль объекта и скорректируем обработку параметров в расширении.
3. Точность виртуальных таблиц: виртуальная таблица ОстаткиИОбороты регистров накопления обрабатывает дату с точностью до секунды. Документы, проведенные в ту же самую секунду, что и КонецПериода, попадают в выборку. Если требуется исключать определенные движения внутри одной секунды, возможностей стандартного интерактивного выбора СКД будет недостаточно: в таком случае границы требуется задавать программно через объект Граница с видом ВидГраницы.Исключая.
Если пользователи не хотят терять удобный выбор интервалов («Этот месяц», «Этот год»), можно применить компромиссный вариант: оставить параметр Период с типом СтандартныйПериод, но добавить два дополнительных пользовательских параметра ВремяНачала и ВремяОкончания с составом дат Время.
В этом случае в выражениях параметров НачалоПериода и КонецПериода СКД рассчитаем итоговые значения сложением даты и времени:
НачалоПериода: Дата(Год(&Период.ДатаНачала), Месяц(&Период.ДатаНачала), День(&Период.ДатаНачала), Час(&ВремяНачала), Минута(&ВремяНачала), Секунда(&ВремяНачала))
КонецПериода: Дата(Год(&Период.ДатаОкончания), Месяц(&Период.ДатаОкончания), День(&Период.ДатаОкончания), Час(&ВремяОкончания), Минута(&ВремяОкончания), Секунда(&ВремяОкончания))
Такой подход позволяет сохранить привычный выбор календарных периодов в один клик, одновременно обеспечивая нужную детализацию по часам и минутам.