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

Программист 1С v8.3 (Обычные формы)
← На главную

При работе в системе 1С:Предприятие начинающие разработчики часто сталкиваются с ситуацией, когда дата в отчете или табличном документе отображается вместе со временем (например, 13.11.2019 0:00:00), даже если в запросе была использована функция НачалоПериода(Дата, День). Рассмотрим подробнее, почему это происходит и какими способами можно добиться вывода «чистой» даты без лишних нулей.

Для начала проанализируем ситуацию: в 1С тип данных Дата всегда содержит и календарную дату, и время (часы, минуты, секунды). Функция НачалоПериода не «отрезает» время физически, а лишь устанавливает его значения в 00:00:00. Проблема кроется не в самом запросе, а в способе визуализации данных. Разберем по шагам все возможные решения этой задачи.

Способ 1. Использование форматной строки в коде

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


Для Каждого СтрокаРезультата Из ТаблицаЗначений Цикл
    // Преобразуем дату в строку формата ДД.ММ.ГГГГ
    СтрокаДата = Формат(СтрокаРезультата.Дата, "ДФ=dd.MM.yyyy");
    // Выводим в нужное поле табличного документа
    ОбластьМакета.Параметры.ДатаДокумента = СтрокаДата;
КонецЦикла;

Важный нюанс: как было замечено в обсуждении на форуме, если вы пытаетесь записать результат функции Формат() обратно в колонку таблицы значений, которая имеет тип Дата, система автоматически преобразует строку обратно в дату и снова добавит время 0:00:00. Чтобы этого избежать, колонка в таблице-приемнике должна иметь тип Строка.

Способ 2. Настройка формата в макете табличного документа

Если мы используем классический способ вывода через макет (.mxl), нам вообще не нужно менять запрос или писать сложный код. Мы можем настроить визуальное представление прямо в свойствах ячейки. Выполним следующие действия:

  1. Откроем макет отчета.
  2. Выберем ячейку (или параметр), куда выводится дата.
  3. Нажмем правую кнопку мыши и выберем «Свойства».
  4. Найдем поле «Формат» и нажмем на кнопку с многоточием.
  5. В появившемся конструкторе форматной строки перейдем на вкладку «Дата» и выберем локальный формат даты (например, ДЛФ=Д).

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

Способ 3. Форматирование при использовании Построителя отчета

В случаях, когда для вывода используется ПостроительОтчета (как упоминалось в Сообщении 4), формат можно задать через настройки колонок. Проанализируем, как это сделать программно:


мПостроитель = Новый ПостроительОтчета;
мПостроитель.Текст = "ВЫБРАТЬ Дата ИЗ Документ.Заявка";
мПостроитель.ЗаполнитьНастройки();

// Устанавливаем формат для конкретного выбранного поля
ПолеДата = мПостроитель.ВыбранныеПоля.Найти("Дата");
Если ПолеДата <> Неопределено Тогда
    ПолеДата.Формат = "ДФ=dd.MM.yyyy";
КонецЕсли;

мПостроитель.Выполнить();
мПостроитель.Вывести(ТабличныйДок);

Способ 4. «Хитрый» метод преобразования в строку внутри запроса

Иногда возникает необходимость получить дату без времени непосредственно в тексте запроса (например, для последующего объединения строк). Поскольку в языке запросов 1С нет функции Формат, программисты прибегают к конкатенации подстрок. Разберем пример кода, предложенный участниками форума:


ВЫБРАТЬ
    ПОДСТРОКА("0123456789", ДЕНЬ(Заявка.Дата) / 10 + 1, 1) + 
    ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(Заявка.Дата))) / 6 + 1, 1) + "." + 
    ПОДСТРОКА("0123456789", МЕСЯЦ(Заявка.Дата) / 10 + 1, 1) + 
    ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(Заявка.Дата))) / 6 + 1, 1) + "." + 
    ПОДСТРОКА("0123456789", ГОД(Заявка.Дата) / 1000 + 1, 1) + 
    // ... и так далее для всех разрядов года
    КАК ДатаСтрокой
ИЗ
    Документ.Заявка КАК Заявка

Внимание: мы крайне не рекомендуем использовать этот метод без острой необходимости. Подобные конструкции сильно усложняют чтение кода и создают избыточную нагрузку на SQL-сервер. Помните, что преобразование данных для представления — это задача интерфейсного уровня (клиента), а не базы данных.

Способ 5. Оформление в Системе компоновки данных (СКД)

Если ваш отчет строится на базе СКД, это самый гибкий вариант. Выясним, где именно задаются эти настройки:

  1. Перейдем на закладку «Наборы данных».
  2. Найдем нужное поле с типом дата.
  3. В колонке «Оформление» нажмем кнопку выбора.
  4. В параметре «Формат» укажем ДЛФ=Д.

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

Резюме

Рассмотрев все варианты, мы можем сделать вывод: попытка убрать время через НачалоПериода в запросе — это лишь подготовка данных (обнуление времени). Окончательное «исчезновение» времени происходит только в момент форматирования. Для отчетов лучшим выбором будет настройка свойств ячейки макета или условного оформления СКД. Для программной обработки используйте функцию Формат(), но учитывайте типы колонок в таблицах значений.

← На главную