При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с особенностью платформы 1С:Предприятие 8.3: система запоминает последние введенные пользователем параметры. С одной стороны, это удобно для пользователя, но с другой — часто требуется, чтобы при каждом новом открытии отчета в полях Дата начала и Дата окончания автоматически проставлялся текущий день, независимо от того, какие значения вводились ранее.
В этой статье мы разберем, почему стандартные выражения в схеме СКД не всегда работают так, как ожидается, и проанализируем несколько способов принудительной установки параметров, опираясь на основные принципы работы с компоновщиком настроек. Для ознакомления с другими вариантами программного управления компоновщиком можно использовать примеры программной работы с СКД.
Когда мы прописываем в схеме компоновки данных для параметра выражение типа ТекущаяДата(), это значение устанавливается только при самом первом запуске отчета пользователем. Как только пользователь изменил дату и сформировал отчет, платформа сохраняет эти настройки в специальное хранилище. При следующем открытии КомпоновщикНастроек загружает значения из этого кэша, и они имеют приоритет над тем, что написано в конфигураторе.
Рассмотрим подробнее варианты решения этой задачи, начиная от самых простых и заканчивая наиболее гибкими программными методами.
Как было отмечено в обсуждении программной настройки отчетов, наиболее надежный способ — это вмешательство в модуль формы отчета. Если в вашем отчете используется автогенерируемая форма, вам необходимо создать её вручную. Рассмотрим по шагам, что нужно сделать:
ПриОткрытии.Проанализируем пример кода для управляемых форм:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УстановитьНачальныеДатыНаСервере();
КонецПроцедуры
&НаСервере
Процедура УстановитьНачальныеДатыНаСервере()
// Получаем доступ к параметрам компоновщика настроек
ПараметрыДанных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
// Устанавливаем ДатаНачала на начало текущего дня
ПараметрДатаНачала = ПараметрыДанных.Элементы.Найти("ДатаНачала");
Если ПараметрДатаНачала <> Неопределено Тогда
ПараметрДатаНачала.Значение = НачалоДня(ТекущаяДатаСеанса());
ПараметрДатаНачала.Использование = Истина;
КонецЕсли;
// Устанавливаем ДатаОкончания на конец текущего дня
ПараметрДатаОкончания = ПараметрыДанных.Элементы.Найти("ДатаОкончания");
Если ПараметрДатаОкончания <> Неопределено Тогда
ПараметрДатаОкончания.Значение = КонецДня(ТекущаяДатаСеанса());
ПараметрДатаОкончания.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование функции ТекущаяДатаСеанса() вместо ТекущаяДата(). Мы рекомендуем использовать именно её, так как она учитывает часовой пояс пользователя, что критично для клиент-серверных баз данных.
Если в вашем отчете используется единый параметр типа СтандартныйПериод, код будет выглядеть немного иначе. Объект СтандартныйПериод содержит сразу две даты: ДатаНачала и ДатаОкончания. Подобный подход часто применяется для автоматизации выбора стандартных периодов в аналитических отчетах.
Посмотрим на пример установки текущего дня для такого типа данных:
&НаСервере
Процедура УстановитьПериодНаСегодня()
ПараметрПериод = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Elements.Найти("СтандартныйПериод");
Если ПараметрПериод <> Неопределено Тогда
НовыйПериод = Новый СтандартныйПериод;
НовыйПериод.Вариант = ВариантСтандартногоПериода.Сегодня;
ПараметрПериод.Значение = НовыйПериод;
ПараметрПериод.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что в пользовательском интерфейсе сразу будет отображаться значение Сегодня, и отчет всегда будет актуален при открытии.
Если вам не важно, сохраняет ли пользователь свои группировки, отборы и настройки полей, вы можете полностью отключить механизм запоминания состояния отчета. Проанализируем, как это сделать через настройки хранилища:
Важно: Мы не рекомендуем этот способ для сложных аналитических отчетов, так как пользователи будут недовольны необходимостью каждый раз заново настраивать колонки и фильтры.
Если вы не хотите создавать форму, можно прописать логику в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Однако помните, что этот код сработает не в момент открытия окна, а в момент нажатия кнопки Сформировать.
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, ИсточникДоступныхНастроек, КомпоновкаДанных, СтандартнаяОбработка)
Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
Если Параметр <> Неопределено И НЕ Параметр.Использование Тогда
Параметр.Значение = НачалоДня(ТекущаяДатаСеанса());
Параметр.Использование = Истина;
КонецЕсли;
КонецПроцедуры
В данном примере мы добавили проверку НЕ Параметр.Использование. Это позволит устанавливать дату по умолчанию только в том случае, если пользователь сам не установил флажок использования параметра.
Разберем еще несколько нюансов, которые помогут сделать работу с отчетами более профессиональной:
ПользовательскиеНастройки. Если программная установка в Настройки не помогает, попробуйте найти параметр в Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Таким образом, мы выяснили, что наиболее надежным и «чистым» решением является использование программной установки значений в событии ПриОткрытии формы отчета. Это гарантирует актуальность данных и сохраняет при этом удобство работы с остальными настройками компоновки.