При работе с отчетами, построенными на Системе Компоновки Данных (СКД) в 1С, мы часто сталкиваемся с тем, что параметры типа «Дата» в пользовательских настройках по умолчанию отображаются с привязкой к «Началу дня». Например, вместо просто «01.01.2023» мы видим «Начало текущего дня: 01.01.2023 0:00:00». Это может вызывать недопонимание у пользователей, особенно если отчет по своему смыслу предполагает формирование данных на «Конец дня» (23:59:59).
Рассмотрим различные подходы и решения, которые помогут нам избавиться от навязчивого «Начала дня» и настроить параметры даты таким образом, чтобы они были интуитивно понятны и корректно обрабатывались отчетом.
Это один из наиболее штатных и предпочтительных способов управления выбором дат и временных интервалов в отчетах СКД. Использование СтандартногоПериода позволяет нам значительно упростить интерфейс для пользователя и автоматически решить проблему с «концом дня».
Создаем параметр типа СтандартныйПериод в СКД:
Начнем с добавления нового параметра в нашу схему компоновки данных. Перейдите на вкладку «Параметры» схемы компоновки данных и создайте новый параметр, например, назовем его ПериодОтчета. Установите для него тип СтандартныйПериод.
Привязываем существующие параметры к СтандартномуПериоду:
Если в вашем запросе или наборе данных уже используются параметры для начала и конца периода (например, ДатаНачала и ДатаОкончания), теперь нам нужно привязать их к свойствам нового параметра ПериодОтчета. В выражении для ДатаНачала укажите &ПериодОтчета.ДатаНачала, а для ДатаОкончания – &ПериодОтчета.ДатаОкончания.
Особенности СтандартногоПериода:
Главное преимущество этого подхода заключается в том, что при выборе стандартного периода (например, «Сегодня», «Эта неделя», «Этот месяц») конечная дата автоматически устанавливается на 23:59:59, а начальная дата — на 00:00:00. Это избавляет нас от необходимости вручную дописывать время или использовать функции преобразования.
Также важно отметить, что если пользователь не заполнит дату окончания в СтандартномПериоде, то свойство ДатаОкончания будет содержать пустую дату, что упрощает логику обработки в некоторых случаях.
Скрываем исходные параметры даты:
Чтобы пользователь не видел устаревшие параметры ДатаНачала и ДатаОкончания, управляемые теперь через ПериодОтчета, установите для них флажок «Ограничение доступности» (или аналогичное свойство, делающее их недоступными для прямого редактирования). Таким образом, на форме останется только удобный выбор ПериодаОтчета.
Тонкая настройка отображения элементов СтандартногоПериода:
Иногда даже при использовании СтандартногоПериода нам может потребоваться дополнительно настроить его отображение на форме, например, убрать кнопки выпадающего списка или выбора значений. Это можно сделать программно в модуле объекта отчета или в форме отчета. Мы получим доступ к элементам формы, связанным с этим параметром, и можем изменить их свойства.
Рассмотрим пример кода, который может быть размещен в обработчике события формы, который выполняется после создания или обновления элементов, например, в обработчике ПриСозданииНаСервере или ПриКомпоновкеРезультата (если элементы настроек уже доступны):
Если ТекущиеДанные.Настройка = "Период" Тогда // Или имя элемента на форме, связанного со СтандартнымПериодом
Элемент.ТекущийЭлемент.КнопкаВыпадающегоСписка = Ложь;
Элемент.ТекущийЭлемент.КнопкаСпискаВыбора = Ложь;
КонецЕсли;
Этот код позволяет нам убрать стандартные кнопки выбора, если мы хотим оставить только ручной ввод даты или предоставить пользователю другой механизм выбора.
Если по какой-то причине использование СтандартногоПериода нам не подходит, и мы хотим работать с обычным параметром типа Дата, но при этом убрать отображение времени и привязку к «Началу дня», мы можем использовать свойство «Состав даты».
Устанавливаем свойство «Состав даты»:
Для параметра типа Дата в настройках схемы компоновки данных перейдите на вкладку «Параметры» и для вашего параметра найдите свойство «Состав даты». Установите его значение в Дата (вместо ДатаВремя).
Эффект от настройки:
Эта настройка гарантирует, что в поле ввода пользователь будет видеть и выбирать только календарную дату, а время будет игнорироваться при отображении. Однако важно понимать, что сама переменная даты в 1С всегда содержит компонент времени, и по умолчанию он будет установлен в 00:00:00. Для корректной интерпретации как «конец дня» нам все равно потребуется использовать специальные функции в запросе.
Независимо от того, какой метод выбора даты мы используем (СтандартныйПериод, обычный параметр с настроенным «Составом даты» или даже ручной ввод), крайне важно правильно интерпретировать выбранную пользователем дату в запросе СКД.
Для того чтобы выбранная пользователем дата (например, «01.01.2023») гарантированно интерпретировалась как начало или конец соответствующего дня, мы должны использовать стандартные функции языка запросов 1С.
Функции для работы с датами:
НАЧАЛОПЕРИОДА(&ПараметрДаты, ДЕНЬ): Эта функция возвращает дату, соответствующую началу указанного периода (в данном случае — дня). Например, для «01.01.2023 10:30:00» она вернет «01.01.2023 0:00:00».
КОНЕЦПЕРИОДА(&ПараметрДаты, ДЕНЬ): Эта функция возвращает дату, соответствующую концу указанного периода. Для «01.01.2023 10:30:00» она вернет «01.01.2023 23:59:59». Именно эта функция позволяет нам получить «конец дня».
Пример использования в запросе СКД:
Предположим, у нас есть параметр ДатаОтчета, и мы хотим получить данные на конец этого дня. В запросе мы бы использовали его следующим образом:
ВЫБРАТЬ
Таблица.Поле1,
Таблица.Поле2
ИЗ
РегистрСведений.МойРегистр.СрезПоследних(КОНЕЦПЕРИОДА(&ДатаОтчета, ДЕНЬ)) КАК Таблица
ГДЕ
Таблица.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачалаПериода, ДЕНЬ) И КОНЕЦПЕРИОДА(&ДатаОкончанияПериода, ДЕНЬ)
Использование этих функций обеспечивает, что даже если пользователь ввел только календарную дату, в запросе она будет корректно расшифрована до начала или конца соответствующего дня, предотвращая когнитивный диссонанс и обеспечивая точность данных.
В некоторых случаях, когда стандартные средства СКД или СтандартныйПериод не позволяют достичь желаемого уровня кастомизации интерфейса, мы можем прибегнуть к программной доработке формы отчета. Этот подход дает нам полный контроль над элементами управления, но является более трудоемким. Для этой задачи можно использовать методику связывания элементов управляемой формы с пользовательскими настройками СКД.
Когда использовать программный подход:
Этот метод применяется, если нам нужно полностью убрать список предопределенных значений (например, «Начало текущего дня», «Начало прошлой недели»), оставить только календарь или ручной ввод, и другие методы не дают такого гибкости. Это может быть актуально для заказчиков-перфекционистов, которым важна каждая деталь пользовательского интерфейса.
Основные события и методы:
Для программной манипуляции элементами формы отчета в управляемом приложении мы можем использовать следующие события и методы:
ПослеЗаполненияПанелиБыстрыхНастроек: это событие модуля объекта отчета (не формы). Оно срабатывает после того, как СКД сформировала свою панель быстрых настроек. В этом событии мы можем получить доступ к элементам настроек и, возможно, повлиять на их свойства, хотя напрямую изменять свойства элементов формы из модуля объекта бывает затруднительно.
ПриОбновленииСоставаПользовательскихНастроекНаСервере: если у вас своя форма отчета, это событие формы отчета на сервере. Здесь мы можем получить доступ к объекту КомпоновщикНастроек и его элементам, но прямое управление визуальными свойствами элементов формы лучше производить на клиенте или в серверных процедурах, которые имеют доступ к элементам формы.
Работа с элементами формы: платформа 1С в управляемых формах динамически создает элементы формы для настроек СКД. Метод СоздатьЭлементыФормыПользовательскихНастроек, упомянутый в обсуждении, является внутренним механизмом платформы, который отвечает за эту отрисовку. Чтобы повлиять на внешний вид, нам нужно получить доступ к уже созданным элементам формы.
Пример программного скрытия кнопок:
Мы можем получить ссылку на элемент формы, связанный с нашим параметром даты, и изменить его свойства, отвечающие за отображение кнопок выбора. Предположим, у нас есть поле ввода на форме, которое связано с параметром даты:
// В модуле формы отчета, например, в ПриСозданииНаСервере или ПриКомпоновкеРезультатаНаСервере
// (после того как элементы формы уже созданы)
// Функция для получения элемента формы по его имени (если оно совпадает с именем параметра или явно задано)
Функция ПолучитьЭлементУправленияПоИмени(ИмяЭлемента)
Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда
Возврат Элементы[ИмяЭлемента];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции;
// Пример использования:
Процедура ПослеСозданияНаСервере(Отказ, СтандартнаяОбработка)
ЭлементДаты = ПолучитьЭлементУправленияПоИмени("ПараметрДатаОтчета"); // Имя вашего элемента на форме, связанного с параметром даты СКД
Если ЭлементДаты <> Неопределено И ТипЗнч(ЭлементДаты) = Тип("ПолеВвода") Тогда
// Убираем кнопку выпадающего списка (с предопределенными значениями)
ЭлементДаты.КнопкаВыпадающегоСписка = Ложь;
// Убираем кнопку списка выбора (например, для произвольных значений или календаря, если это не основная кнопка)
ЭлементДаты.КнопкаСпискаВыбора = Ложь;
// Оставим только кнопку выбора даты календарем
// Если вы хотите убрать все кнопки и оставить только ручной ввод:
// ЭлементДаты.КнопкаВыбора = Ложь;
КонецЕсли;
// Пример для СтандартногоПериода, как обсуждалось в форуме (сообщение 22)
// Если у вас на форме есть поле, напрямую связанное с настройкой "Период"
ЭлементПериода = ПолучитьЭлементУправленияПоИмени("ПериодОтчета");
Если ЭлементПериода <> Неопределено И ТипЗнч(ЭлементПериода) = Тип("ПолеВвода") Тогда
ЭлементПериода.КнопкаВыпадающегоСписка = Ложь;
ЭлементПериода.КнопкаСпискаВыбора = Ложь;
КонецЕсли;
КонецПроцедуры;
Этот подход позволяет нам манипулировать свойствами элементов управления формы, чтобы убрать ненужные кнопки выбора, списки значений, и таким образом создать более чистый и понятный интерфейс для пользователя. Однако это требует понимания структуры формы и имен элементов, а также может потребовать дополнительных усилий при обновлении конфигурации или платформы. Для упрощения технического обслуживания таких баз можно автоматизировать регулярное обновление и тестирование нескольких информационных баз.
Мы рассмотрели несколько методов для решения проблемы отображения параметра типа «Дата» в пользовательских настройках отчетов СКД. Для большинства случаев использование параметра типа СтандартныйПериод в сочетании с корректным применением функций НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() в запросах является наиболее оптимальным и менее затратным решением. Этот подход обеспечивает правильную интерпретацию дат и удобство для пользователя.
Если же требуется максимальная гибкость и тонкая настройка пользовательского интерфейса, или стандартные средства не удовлетворяют специфическим требованиям, мы можем прибегнуть к программному управлению элементами формы. Этот путь дает полный контроль, но сопряжен с дополнительными затратами на разработку и поддержку.