При работе с отчетами в 1С:УНФ пользователи часто сталкиваются с ситуацией, когда стандартные поля ввода периода позволяют указать только дату, а время по умолчанию устанавливается на начало дня (00:00:00) для даты начала и на конец дня (23:59:59) для даты окончания. Это может быть неудобно, особенно когда требуется получить данные на конкретный момент времени, например, на конец определенной рабочей смены или на заданный час вчерашнего дня. Рассмотрим, как можно решить эту проблему и получить возможность более гибкого управления временем в отчетах.
Изначально, разработчики 1С предусматривают такое поведение для удобства большинства пользователей, поскольку для многих задач вполне достаточно агрегированных данных за полный день. Однако в реальных условиях бизнеса, особенно в сферах с посменной работой или высоким товарооборотом, детализация по времени становится критически важной. Например, в отчете по остаткам товара нам может быть необходимо видеть цифры не на начало дня, а на текущий момент или на конец определенной смены.
Для начала, давайте проанализируем текущее поведение отчетов. Когда мы выбираем период, например, с 10.03.2023 по 10.03.2023, система автоматически подставляет время. Для даты начала это будет 10.03.2023 00:00:00, а для даты окончания 10.03.2023 23:59:59. Некоторые пользователи отмечают, что отладчик может показывать дату начала всегда с временем 00:00:00, что еще больше сбивает с толку относительно фактического периода отчета. В то же время, как показали коллеги, для даты окончания чаще всего устанавливается 23:59:59.
Главная причина такого поведения кроется в использовании стандартного типа "СтандартныйПериод" в Системе Компоновки Данных (СКД) и типовых механизмах, использующих Библиотеку Стандартных Подсистем (БСП). Этот тип по умолчанию настроен на работу с полными днями. Если нам требуется иная логика, отчет необходимо доработать.
Наиболее корректным и предпочтительным способом доработки типовых конфигураций, таких как 1С:УНФ, является использование механизма расширений. Это позволяет внести необходимые изменения без снятия конфигурации с поддержки, что значительно упрощает дальнейшие обновления.
Рассмотрим по шагам, как можно реализовать возможность указания времени:
Создание расширения и заимствование отчета.
Для начала, создайте новое расширение в режиме конфигуратора. Затем, добавьте в него нужный отчет. Для этого в дереве конфигурации найдите интересующий отчет (например, "ОтчетОстаткиТоваров"), кликните правой кнопкой мыши и выберите "Добавить в расширение".
Изменение схемы компоновки данных (СКД).
Откройте схему компоновки данных заимствованного отчета. Вместо использования стандартного параметра "Период", который часто имеет тип СтандартныйПериод, мы будем использовать два отдельных параметра типа Дата.
Перейдите на вкладку "Параметры" в СКД.
Добавьте два новых параметра, например, НачалоПериодаСВременем и КонецПериодаСВременем.
Для каждого из этих параметров:
Дата.Обычный.Это позволит пользователю вводить не только дату, но и время в полях, которые будут связаны с этими параметрами на форме отчета.
В тексте запроса СКД, где раньше использовался параметр "Период", замените его на новые параметры. Например, если у вас было условие ГДЕ Период МЕЖДУ &НачалоПериода И &КонецПериода, то измените его на ГДЕ Период МЕЖДУ &НачалоПериодаСВременем И &КонецПериодаСВременем. Убедитесь, что параметры в запросе соответствуют новым названиям.
Модификация формы отчета через расширение.
Далее нам необходимо заимствовать форму отчета и внести изменения, чтобы пользователь мог взаимодействовать с новыми параметрами.
Заимствуйте форму отчета в расширение. Для этого в расширении откройте отчет, выберите "Формы" и заимствуйте основную форму отчета.
На форме отчета найдите элементы, связанные со стандартным периодом (обычно это поле ввода типа СтандартныйПериод или группа с полями "С" и "По").
Установите для этих стандартных элементов свойство "Видимость" в Ложь. Таким образом, мы скроем стандартный механизм ввода периода.
Добавьте на форму два новых элемента управления типа "Поле ввода".
Свяжите эти поля с новыми параметрами СКД. Для поля, отвечающего за начало периода, укажите Путь к данным: КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы["НачалоПериодаСВременем"].Значение. Аналогично для конца периода: КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы["КонецПериодаСВременем"].Значение.
Важно отметить, что доступ к параметрам компоновщика настроек можно получить, как показано в сообщении форума: КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы[0].Значение, где индекс [0] может меняться в зависимости от порядка параметров. Надежнее использовать доступ по имени: КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти("ИмяПараметра").Значение.
Для добавленных полей ввода установите свойство "Формат": ДФ='dd.MM.yyyy HH:mm:ss' (или любой другой подходящий формат, включающий время). Также для свойства "Состав даты" выберите Дата и время.
При необходимости, добавьте обработчики событий для этих полей (например, ПриИзменении), чтобы при изменении даты/времени обновлялись настройки отчета или производились дополнительные действия.
После этих изменений пользователи смогут вводить точные дату и время непосредственно на форме отчета.
Если нам не нужно, чтобы пользователь каждый раз вручную вводил время, а есть какая-то предопределенная логика (например, всегда устанавливать время на конец смены, которая завершается в 20:00), мы можем программно изменять значения параметров непосредственно перед формированием отчета.
Этот подход также реализуется в расширении и требует заимствования модуля отчета.
Заимствование модуля объекта отчета.
В расширении заимствуйте модуль объекта отчета. Для этого в дереве расширения, найдите отчет, откройте его и заимствуйте "Модуль объекта".
Переопределение обработчика ПриКомпоновкеРезультата.
Добавьте или переопределите процедуру ПриКомпоновкеРезультата в модуле объекта отчета.
В этой процедуре мы можем получить доступ к параметрам СКД и изменить их значения.
&НаСервере
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, если полностью перехватываем формирование
// Получаем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Ищем параметр НачалоПериода
ПараметрНачалоПериода = Настройки.ПараметрыДанных.Найти("НачалоПериода"); // или "НачалоПериодаСВременем", если используете новые параметры
Если ПараметрНачалоПериода <> Неопределено Тогда
// Устанавливаем желаемое время для начала периода
// Например, 8:00 утра
Если ТипЗнч(ПараметрНачалоПериода.Значение) = Тип("Дата") Тогда
ПараметрНачалоПериода.Значение = НачалоДня(ПараметрНачалоПериода.Значение) + 8 * 3600; // 8 часов * 3600 секунд
КонецЕсли;
КонецЕсли;
// Ищем параметр КонецПериода
ПараметрКонецПериода = Настройки.ПараметрыДанных.Найти("КонецПериода"); // или "КонецПериодаСВременем"
Если ПараметрКонецПериода <> Неопределено Тогда
// Устанавливаем желаемое время для конца периода
// Например, 20:00 (конец смены)
Если ТипЗнч(ПараметрКонецПериода.Значение) = Тип("Дата") Тогда
ПараметрКонецПериода.Значение = НачалоДня(ПараметрКонецПериода.Значение) + 20 * 3600; // 20 часов * 3600 секунд
КонецЕсли;
КонецЕсли;
// Применяем измененные настройки к компоновщику
КомпоновщикНастроек.УстановитьНастройки(Настройки);
// Вызываем стандартную процедуру формирования отчета с измененными параметрами
// Это может быть вызов метода Супер, если он есть, или прямое формирование
// КомпоновщикМакета.Выполнить(КомпоновщикНастроек); // Пример, если нет Супер.ПриКомпоновкеРезультата
// Если вы использовали Супер.ПриКомпоновкеРезультата() в начале и СтандартнаяОбработка = Истина,
// то можно не перехватывать полностью. Но если логика требует полного перехвата, то так.
// Для типовых отчетов часто используется вызов процедуры из общего модуля
// Например: Отчеты.СформироватьОтчет(КомпоновщикНастроек.СхемаКомпоновкиДанных, Настройки, ДокументРезультат, ДанныеРасшифровки);
// Или просто вызвать Супер.ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, Истина); после изменения настроек.
// В большинстве случаев для типовых отчетов, использующих БСП, достаточно модифицировать настройки
// и вернуть СтандартнаяОбработка = Истина, чтобы типовой код продолжил формирование.
СтандартнаяОбработка = Истина; // Возвращаем стандартную обработку после изменения параметров
КонецПроцедуры
Обратите внимание, что мы сначала получаем настройки компоновщика, затем изменяем значения параметров типа Дата, добавляя к ним необходимое количество секунд для получения желаемого времени. После этого мы обновляем настройки компоновщика и позволяем стандартной обработке продолжить формирование отчета.
Текущая дата/время без периода. Если в некоторых отчетах вы очищаете поле периода, система 1С:Предприятие 8.3 автоматически может вывести остатки на текущую дату и время, включая минуты и секунды. Это стандартное поведение для определенных типов запросов, но оно не позволяет получить данные на произвольную прошлую дату со временем.
Контроль остатков. В 1С:УНФ по умолчанию контроль остатков при проведении документов часто осуществляется на текущий момент проведения, а не на дату документа. Это может приводить к отрицательным остаткам при вводе документов "задним числом". Реализация контроля остатков на дату и время документа требует дополнительных доработок, но это выходит за рамки данной темы.
Форматирование выводимых полей. Даже если мы успешно настроили ввод времени, важно убедиться, что время корректно отображается в самом отчете. В СКД можно настроить формат отображения даты и времени для выводимых полей. Для этого на вкладке "Настройки" СКД в элементе "Выбранные поля" или "Поля" для поля типа "Дата" можно указать Строку формата, например, ДФ='dd.MM.yyyy HH:mm:ss'. Это обеспечит вывод даты с временем в сформированном отчете.
Расширения – наш основной инструмент. Еще раз подчеркнем, что все перечисленные доработки следует выполнять с использованием расширений. Это значительно упростит процесс обновлений типовой конфигурации и минимизирует риски возникновения ошибок.
Таким образом, хотя стандартные механизмы 1С:УНФ могут быть ограничены в гибкости указания времени для отчетов, существуют эффективные способы доработки, позволяющие добиться требуемой детализации. Используя комбинацию модификаций СКД и формы отчета через расширение, а также при необходимости программную корректировку параметров, мы можем получить отчеты, которые будут точно соответствовать нашим операционным требованиям, позволяя анализировать данные на любой необходимый момент времени.