В работе с Системой Компоновки Данных (СКД) в 1С мы часто сталкиваемся с задачей корректного отображения дат. По умолчанию, многие даты в 1С хранятся с компонентом времени, даже если он равен "00:00:00". Это происходит из-за особенностей внутреннего представления данных. Когда мы формируем ссылки на объекты, создаем их представления или выводим данные в отчетах СКД, время может отображаться, что не всегда желательно. Например, вместо "25.03.2023 0:00:00" требуется видеть только "25.03.2023". Давайте вместе рассмотрим различные подходы и методы, которые помогут нам эффективно решить эту задачу, обеспечивая удобство и наглядность для конечных пользователей.
Один из наиболее прямых и часто применяемых способов убрать время из даты для конкретного поля или ссылки — это задать выражение представления непосредственно в наборе данных вашего отчета СКД. Этот метод позволяет нам контролировать формат вывода данных на самом низком уровне формирования запроса СКД, еще до того, как данные будут переданы для дальнейшей обработки.
Разберем по шагам, как это можно сделать:
Заявка.Дата, Документ.Дата или любое другое поле типа Дата).Формат(), которая позволит нам вывести дату в нужном виде, исключая компонент времени.Посмотрим на пример выражения, предложенного на форуме, которое формирует полное представление ссылки:
"Заявка экспедирования "+Заявка.Номер+" от "+Формат(Заявка.Дата,"ДФ=dd.MM.yyy")
В этом выражении мы выполняем несколько действий:
+).Заявка.Номер), который является текстовым или числовым представлением.Формат() для даты заявки (Заявка.Дата) с параметром форматирования "ДФ=dd.MM.yyy". Параметр "ДФ" означает "дата-формат", где dd — день (две цифры), MM — месяц (две цифры), yyy — год (четыре цифры). Это гарантирует, что время будет полностью исключено из выводимой строки, и мы получим дату в удобном и привычном формате.Важный аспект, который следует учитывать: Как справедливо отмечалось в обсуждении, такой подход, хотя и является очень эффективным для конкретного случая или конкретного типа документа, может быть не универсален. Если у вас в отчете используются данные из нескольких типов документов (например, "Заявка", "Счет", "Заказ клиента"), и вы применяете одно и то же выражение, все они могут начать выводиться под общим названием "Заявка", что может ввести пользователя в заблуждение относительно типа документа. Для достижения более универсальных и гибких решений нам следует рассмотреть другие варианты, о которых мы поговорим далее.
Еще один мощный и часто используемый способ управления форматом даты — это выполнение необходимых преобразований непосредственно на уровне запроса, который лежит в основе набора данных СКД. Этот подход позволяет нам подготовить данные еще до того, как они попадут в компоновщик СКД, что делает их "чистыми" для дальнейшего использования.
Мы можем использовать встроенные системные функции 1С для работы с датами и временем, чтобы эффективно отсечь компонент времени:
НАЧАЛОПЕРИОДА(<Дата>, ДЕНЬ): Эта функция предназначена для получения даты, соответствующей началу указанного периода. Если в качестве периода мы указываем ДЕНЬ, функция возвращает дату с временем "00:00:00" (начало дня). Это эффективно удаляет любую информацию о времени, оставляя только календарную дату.ДАТА(<Дата>): Эта функция прямо преобразует значение типа "Дата" (которое может содержать и дату, и время) в значение типа "Дата" без компонента времени. В контексте некоторых СУБД это может быть эквивалентно CAST(ТвояДата КАК ДАТА), но в языке запросов 1С мы используем ДАТА().Рассмотрим пример использования этих функций непосредственно в запросе СКД:
ВЫБРАТЬ
Заявка.Номер,
НАЧАЛОПЕРИОДА(Заявка.Дата, ДЕНЬ) КАК ДатаБезВремени,
ДАТА(Заявка.Дата) КАК ДатаТолько
ИЗ
Документ.Заявка КАК Заявка
В результате выполнения такого запроса, поля ДатаБезВремени и ДатаТолько в наборе данных СКД будут содержать значения дат уже без компонента времени. Это значительно упрощает их дальнейшее использование в отчете, так как компоновщик будет работать уже с "чистыми" датами, и нам не потребуется дополнительное форматирование для удаления времени.
Если вы не хотите изменять основной запрос или выражение представления для ссылки (как в первом варианте), но вам необходимо контролировать отображение конкретного поля даты в отчете, вы можете использовать возможности вкладки "Поля" в настройках схемы компоновки данных. Этот метод позволяет применять форматирование к отдельным полям, уже включенным в набор данных.
Разберем, как это реализовать:
ДатаДокумента).Например, чтобы отформатировать поле ДатаПоля:
Формат(ДатаПоля, "ДФ=dd.MM.yyyy")
Или, если вы предпочитаете использовать функцию начала периода, как мы рассматривали для запроса:
НачалоПериода(ДатаПоля, День)
Этот подход удобен в тех случаях, когда вы работаете с уже готовыми полями набора данных и хотите применить к ним специфическое форматирование только для вывода в отчете, не затрагивая при этом логику запроса или представления ссылки. Это гибкое решение для управления отображением данных в конкретных элементах отчета. Для решения более сложных задач, например, когда требуется сгруппировать колонки по периодам, можно использовать пример формирования шапки отчета по неделям и месяцам в СКД.
Для более универсального и централизованного управления представлением объектов (таких как документы, справочники или другие объекты метаданных) в 1С, включая форматирование даты, мы можем использовать специальные процедуры, расположенные в модуле менеджера соответствующего объекта. Этот метод является очень мощным, поскольку он изменяет то, как объект представляется *везде* в системе (в списках, ссылках, полях выбора, при автоматическом формировании наименования), а не только в конкретном отчете СКД.
Рассмотрим подробнее процедуры ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления:
ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка): Эта процедура вызывается платформой для определения, какие поля объекта будут доступны для формирования его строкового представления. Здесь мы указываем, какие данные объекта нам понадобятся (например, Наименование, Дата). Установка СтандартнаяОбработка = Ложь означает, что мы полностью берем на себя формирование списка полей.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка): В этой процедуре фактически формируется окончательное строковое представление объекта. Здесь мы получаем доступ к данным объекта через параметр Данные и можем применить к ним необходимое форматирование, чтобы сформировать желаемую строку Представление. Установка СтандартнаяОбработка = Ложь указывает, что мы самостоятельно формируем представление, отменяя стандартный механизм.Посмотрим на пример кода из обсуждения на форуме, который демонстрирует этот подход:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Наименование");
Поля.Добавить("Дата");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
Наименование = ?(ПустаяСтрока(Данные.Наименование), НСтр("ru = 'Без описания'"), Данные.Наименование);
Дата = Формат(Данные.Дата, ?(ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"), "ДЛФ=DT", "ДЛФ=D"));
Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 от %2'"), Наименование, Дата);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Проанализируем этот пример более детально:
ОбработкаПолученияПолейПредставления мы явно добавляем поля Наименование и Дата в список доступных для формирования представления.ОбработкаПолученияПредставления, мы получаем доступ к этим полям через структуру Данные.Формат(). Здесь применяется условное форматирование: ?(ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"), "ДЛФ=DT", "ДЛФ=D"). Это означает, что если функциональная опция "ИспользоватьДатуИВремяВСрокахЗадач" включена, то дата будет форматироваться с временем ("ДЛФ=DT" — длинный формат даты и времени), в противном случае — только дата ("ДЛФ=D" — длинный формат даты). Это очень гибкое решение, позволяющее настроить поведение системы в зависимости от пользовательских настроек или требований.СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(), формируется строка представления, например, "Заявка №123 от 25.03.2023", без указания времени, если функциональная опция выключена.Этот подход является наиболее универсальным, так как он влияет на то, как объект отображается не только в отчетах СКД, но и во всех местах, где система автоматически формирует представление объекта: в полях выбора, динамических списках, ссылках, журналах документов и так далее. Это обеспечивает единый и консистентный вид данных по всей информационной базе.
Подстрока()Хотя функция Подстрока() была упомянута на форуме как возможный вариант, для работы непосредственно с датами в 1С она менее предпочтительна, чем специализированные функции форматирования или работы с датами. Это связано с тем, что Подстрока() оперирует со строками, а не с типом данных Дата. Она может быть применена, если у вас уже есть строковое представление даты со временем, и вы хотите "отрезать" часть этой строки.
Например, если у вас есть строковая переменная с датой и временем в формате "25.03.2023 15:30:00" и вам нужно получить только "25.03.2023", вы можете использовать:
Подстрока("25.03.2023 15:30:00", 1, 10)
Здесь 1 — это начальная позиция (первый символ), а 10 — количество символов, которые нужно извлечь. В результате мы получим строку "25.03.2023".
Однако, если вы работаете с переменной типа Дата, всегда лучше использовать специализированные функции, такие как Формат(), НачалоПериода() или ДАТА(). Эти функции оперируют непосредственно с типом данных Дата, гарантируют корректность преобразования независимо от региональных настроек системы или специфического формата вывода, и являются более надежными и читаемыми для работы с датами.
В некоторых сценариях работы с отчетами СКД вам может потребоваться сохранить оригинальное поле с датой и временем (например, для детализации или дальнейших расчетов), но при этом иметь отдельное поле только с датой для отображения в отчете. В этом случае мы можем создать пользовательское поле в схеме компоновки данных.
Давайте разберем, как добавить пользовательское поле:
МояДатаСоВременем:
Формат(МояДатаСоВременем, "ДФ=dd.MM.yyyy")
Или, используя функцию начала периода:
НачалоПериода(МояДатаСоВременем, День)
После создания такого пользовательского поля, вы сможете включить его в отчет рядом с исходной датой или вместо нее, чтобы отображать только дату без времени. Этот подход позволяет гибко управлять тем, какие данные и в каком формате отображаются в отчете, не затрагивая при этом исходные поля набора данных и сохраняя их в первоначальном виде.
Для самой тонкой настройки внешнего вида отчета мы можем применить форматирование непосредственно в макете компоновки данных. Этот метод дает максимальный контроль над представлением данных на этапе формирования печатной формы отчета и может быть особенно полезен, если вы хотите изменить формат вывода даты только в определенных ячейках или областях отчета, не меняя при этом общие настройки полей.
Рассмотрим шаги для настройки форматирования в макете:
Дата и настройте его так, чтобы отображались только компоненты дня, месяца и года, без часов, минут и секунд.Этот метод форматирования имеет самый высокий приоритет и позволяет переопределить все предыдущие настройки на уровне полей или выражений. Это делает его идеальным для специфических требований к дизайну отчета, где необходимо тонко настроить вывод данных в соответствии с макетом.
Как мы видим, в 1С существует несколько эффективных способов убрать время из даты при работе с СКД и формировании представлений. Выбор конкретного метода зависит от ваших задач и требуемого уровня универсальности: хотите ли вы изменить форматирование для всей системы (через модуль менеджера объекта), для конкретного запроса (в самом запросе СКД), для отдельного поля отчета (выражение в наборе данных или пользовательское поле) или для его представления в макете. Наиболее универсальными и рекомендуемыми для корректной работы с типом Дата являются функции Формат(), НачалоПериода() и ДАТА(), а также централизованная обработка представления в модуле менеджера объекта. Мы рекомендуем вам проанализировать свою ситуацию и выбрать тот способ, который наилучшим образом соответствует архитектуре вашего решения и требуемой гибкости.