Как убрать время из даты при формировании ссылки или представления в СКД 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В работе с Системой Компоновки Данных (СКД) в 1С мы часто сталкиваемся с задачей корректного отображения дат. По умолчанию, многие даты в 1С хранятся с компонентом времени, даже если он равен "00:00:00". Это происходит из-за особенностей внутреннего представления данных. Когда мы формируем ссылки на объекты, создаем их представления или выводим данные в отчетах СКД, время может отображаться, что не всегда желательно. Например, вместо "25.03.2023 0:00:00" требуется видеть только "25.03.2023". Давайте вместе рассмотрим различные подходы и методы, которые помогут нам эффективно решить эту задачу, обеспечивая удобство и наглядность для конечных пользователей.

1. Использование выражения представления в наборе данных СКД

Один из наиболее прямых и часто применяемых способов убрать время из даты для конкретного поля или ссылки — это задать выражение представления непосредственно в наборе данных вашего отчета СКД. Этот метод позволяет нам контролировать формат вывода данных на самом низком уровне формирования запроса СКД, еще до того, как данные будут переданы для дальнейшей обработки.

Разберем по шагам, как это можно сделать:

  1. Откройте схему компоновки данных, с которой вы работаете (например, через конфигуратор, учитывая привилегированный режим СКД, или в режиме предприятия, если предусмотрена возможность изменения схемы).
  2. Перейдите на закладку "Наборы данных".
  3. Выберите ваш основной набор данных, который обычно представлен типом "Запрос".
  4. На закладке "Поля" найдите поле, для которого необходимо отформатировать дату (например, Заявка.Дата, Документ.Дата или любое другое поле типа Дата).
  5. В колонке "Выражение представления" для этого поля укажите функцию Формат(), которая позволит нам вывести дату в нужном виде, исключая компонент времени.

Посмотрим на пример выражения, предложенного на форуме, которое формирует полное представление ссылки:

"Заявка экспедирования "+Заявка.Номер+" от "+Формат(Заявка.Дата,"ДФ=dd.MM.yyy")

В этом выражении мы выполняем несколько действий:

Важный аспект, который следует учитывать: Как справедливо отмечалось в обсуждении, такой подход, хотя и является очень эффективным для конкретного случая или конкретного типа документа, может быть не универсален. Если у вас в отчете используются данные из нескольких типов документов (например, "Заявка", "Счет", "Заказ клиента"), и вы применяете одно и то же выражение, все они могут начать выводиться под общим названием "Заявка", что может ввести пользователя в заблуждение относительно типа документа. Для достижения более универсальных и гибких решений нам следует рассмотреть другие варианты, о которых мы поговорим далее.

2. Форматирование даты непосредственно в запросе СКД

Еще один мощный и часто используемый способ управления форматом даты — это выполнение необходимых преобразований непосредственно на уровне запроса, который лежит в основе набора данных СКД. Этот подход позволяет нам подготовить данные еще до того, как они попадут в компоновщик СКД, что делает их "чистыми" для дальнейшего использования.

Мы можем использовать встроенные системные функции 1С для работы с датами и временем, чтобы эффективно отсечь компонент времени:

  1. Функция НАЧАЛОПЕРИОДА(<Дата>, ДЕНЬ): Эта функция предназначена для получения даты, соответствующей началу указанного периода. Если в качестве периода мы указываем ДЕНЬ, функция возвращает дату с временем "00:00:00" (начало дня). Это эффективно удаляет любую информацию о времени, оставляя только календарную дату.
  2. Функция ДАТА(<Дата>): Эта функция прямо преобразует значение типа "Дата" (которое может содержать и дату, и время) в значение типа "Дата" без компонента времени. В контексте некоторых СУБД это может быть эквивалентно CAST(ТвояДата КАК ДАТА), но в языке запросов 1С мы используем ДАТА().

Рассмотрим пример использования этих функций непосредственно в запросе СКД:


ВЫБРАТЬ
    Заявка.Номер,
    НАЧАЛОПЕРИОДА(Заявка.Дата, ДЕНЬ) КАК ДатаБезВремени,
    ДАТА(Заявка.Дата) КАК ДатаТолько
ИЗ
    Документ.Заявка КАК Заявка

В результате выполнения такого запроса, поля ДатаБезВремени и ДатаТолько в наборе данных СКД будут содержать значения дат уже без компонента времени. Это значительно упрощает их дальнейшее использование в отчете, так как компоновщик будет работать уже с "чистыми" датами, и нам не потребуется дополнительное форматирование для удаления времени.

3. Использование выражения в поле на закладке "Поля" СКД

Если вы не хотите изменять основной запрос или выражение представления для ссылки (как в первом варианте), но вам необходимо контролировать отображение конкретного поля даты в отчете, вы можете использовать возможности вкладки "Поля" в настройках схемы компоновки данных. Этот метод позволяет применять форматирование к отдельным полям, уже включенным в набор данных.

Разберем, как это реализовать:

  1. Откройте схему компоновки данных и перейдите на закладку "Поля".
  2. Найдите ваше поле даты, для которого необходимо применить форматирование (например, ДатаДокумента).
  3. В колонке "Выражение" для этого поля можно задать формулу форматирования, аналогичную той, что мы использовали в первом методе, но уже применительно к конкретному полю.

Например, чтобы отформатировать поле ДатаПоля:

Формат(ДатаПоля, "ДФ=dd.MM.yyyy")

Или, если вы предпочитаете использовать функцию начала периода, как мы рассматривали для запроса:

НачалоПериода(ДатаПоля, День)

Этот подход удобен в тех случаях, когда вы работаете с уже готовыми полями набора данных и хотите применить к ним специфическое форматирование только для вывода в отчете, не затрагивая при этом логику запроса или представления ссылки. Это гибкое решение для управления отображением данных в конкретных элементах отчета. Для решения более сложных задач, например, когда требуется сгруппировать колонки по периодам, можно использовать пример формирования шапки отчета по неделям и месяцам в СКД.

4. Обработка получения представления в модуле менеджера объекта

Для более универсального и централизованного управления представлением объектов (таких как документы, справочники или другие объекты метаданных) в 1С, включая форматирование даты, мы можем использовать специальные процедуры, расположенные в модуле менеджера соответствующего объекта. Этот метод является очень мощным, поскольку он изменяет то, как объект представляется *везде* в системе (в списках, ссылках, полях выбора, при автоматическом формировании наименования), а не только в конкретном отчете СКД.

Рассмотрим подробнее процедуры ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления:

  1. ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка): Эта процедура вызывается платформой для определения, какие поля объекта будут доступны для формирования его строкового представления. Здесь мы указываем, какие данные объекта нам понадобятся (например, Наименование, Дата). Установка СтандартнаяОбработка = Ложь означает, что мы полностью берем на себя формирование списка полей.
  2. ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка): В этой процедуре фактически формируется окончательное строковое представление объекта. Здесь мы получаем доступ к данным объекта через параметр Данные и можем применить к ним необходимое форматирование, чтобы сформировать желаемую строку Представление. Установка СтандартнаяОбработка = Ложь указывает, что мы самостоятельно формируем представление, отменяя стандартный механизм.

Посмотрим на пример кода из обсуждения на форуме, который демонстрирует этот подход:


Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
    Поля.Добавить("Наименование");
    Поля.Добавить("Дата");
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    Наименование = ?(ПустаяСтрока(Данные.Наименование), НСтр("ru = 'Без описания'"), Данные.Наименование);
    Дата = Формат(Данные.Дата, ?(ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"), "ДЛФ=DT", "ДЛФ=D"));
    Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 от %2'"), Наименование, Дата);
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Проанализируем этот пример более детально:

Этот подход является наиболее универсальным, так как он влияет на то, как объект отображается не только в отчетах СКД, но и во всех местах, где система автоматически формирует представление объекта: в полях выбора, динамических списках, ссылках, журналах документов и так далее. Это обеспечивает единый и консистентный вид данных по всей информационной базе.

5. Использование функции Подстрока()

Хотя функция Подстрока() была упомянута на форуме как возможный вариант, для работы непосредственно с датами в 1С она менее предпочтительна, чем специализированные функции форматирования или работы с датами. Это связано с тем, что Подстрока() оперирует со строками, а не с типом данных Дата. Она может быть применена, если у вас уже есть строковое представление даты со временем, и вы хотите "отрезать" часть этой строки.

Например, если у вас есть строковая переменная с датой и временем в формате "25.03.2023 15:30:00" и вам нужно получить только "25.03.2023", вы можете использовать:

Подстрока("25.03.2023 15:30:00", 1, 10)

Здесь 1 — это начальная позиция (первый символ), а 10 — количество символов, которые нужно извлечь. В результате мы получим строку "25.03.2023".

Однако, если вы работаете с переменной типа Дата, всегда лучше использовать специализированные функции, такие как Формат(), НачалоПериода() или ДАТА(). Эти функции оперируют непосредственно с типом данных Дата, гарантируют корректность преобразования независимо от региональных настроек системы или специфического формата вывода, и являются более надежными и читаемыми для работы с датами.

6. Использование пользовательских полей в СКД

В некоторых сценариях работы с отчетами СКД вам может потребоваться сохранить оригинальное поле с датой и временем (например, для детализации или дальнейших расчетов), но при этом иметь отдельное поле только с датой для отображения в отчете. В этом случае мы можем создать пользовательское поле в схеме компоновки данных.

Давайте разберем, как добавить пользовательское поле:

  1. Откройте схему компоновки данных и перейдите на закладку "Настройки".
  2. В структуре отчета (например, в детальных записях, в группировке или в выбранных полях) найдите раздел "Пользовательские поля" или добавьте новое поле через "Выбранные поля", выбрав тип "Пользовательское поле".
  3. Создайте новое поле и в его "Выражении" укажите формулу форматирования, аналогичную тем, что мы уже рассмотрели. Например, если ваше исходное поле даты называется МояДатаСоВременем:

Формат(МояДатаСоВременем, "ДФ=dd.MM.yyyy")

Или, используя функцию начала периода:

НачалоПериода(МояДатаСоВременем, День)

После создания такого пользовательского поля, вы сможете включить его в отчет рядом с исходной датой или вместо нее, чтобы отображать только дату без времени. Этот подход позволяет гибко управлять тем, какие данные и в каком формате отображаются в отчете, не затрагивая при этом исходные поля набора данных и сохраняя их в первоначальном виде.

7. Настройка форматирования на уровне макета компоновки данных

Для самой тонкой настройки внешнего вида отчета мы можем применить форматирование непосредственно в макете компоновки данных. Этот метод дает максимальный контроль над представлением данных на этапе формирования печатной формы отчета и может быть особенно полезен, если вы хотите изменить формат вывода даты только в определенных ячейках или областях отчета, не меняя при этом общие настройки полей.

Рассмотрим шаги для настройки форматирования в макете:

  1. Откройте схему компоновки данных и перейдите на закладку "Макеты".
  2. Создайте новый макет или измените существующий для нужной области отчета (например, для заголовка, подвала, группировки, детальных записей или конкретного поля).
  3. В редакторе макета выделите ячейку, в которой отображается дата.
  4. Откройте свойства этой ячейки. В разделе "Формат" (или "Параметры форматирования") вы сможете явно указать формат даты, исключающий время. Для этого выберите тип Дата и настройте его так, чтобы отображались только компоненты дня, месяца и года, без часов, минут и секунд.

Этот метод форматирования имеет самый высокий приоритет и позволяет переопределить все предыдущие настройки на уровне полей или выражений. Это делает его идеальным для специфических требований к дизайну отчета, где необходимо тонко настроить вывод данных в соответствии с макетом.

Как мы видим, в 1С существует несколько эффективных способов убрать время из даты при работе с СКД и формировании представлений. Выбор конкретного метода зависит от ваших задач и требуемого уровня универсальности: хотите ли вы изменить форматирование для всей системы (через модуль менеджера объекта), для конкретного запроса (в самом запросе СКД), для отдельного поля отчета (выражение в наборе данных или пользовательское поле) или для его представления в макете. Наиболее универсальными и рекомендуемыми для корректной работы с типом Дата являются функции Формат(), НачалоПериода() и ДАТА(), а также централизованная обработка представления в модуле менеджера объекта. Мы рекомендуем вам проанализировать свою ситуацию и выбрать тот способ, который наилучшим образом соответствует архитектуре вашего решения и требуемой гибкости.

← На главную