При работе в системе 1С:Предприятие начинающие разработчики часто сталкиваются с ситуацией, когда дата в отчете или табличном документе отображается вместе со временем (например, 13.11.2019 0:00:00), даже если в запросе была использована функция НачалоПериода(Дата, День). Рассмотрим подробнее, почему это происходит и какими способами можно добиться вывода «чистой» даты без лишних нулей.
Для начала проанализируем ситуацию: в 1С тип данных Дата всегда содержит и календарную дату, и время (часы, минуты, секунды). Функция НачалоПериода не «отрезает» время физически, а лишь устанавливает его значения в 00:00:00. Проблема кроется не в самом запросе, а в способе визуализации данных. Разберем по шагам все возможные решения этой задачи.
Если мы выводим данные программно, перебирая результат запроса или таблицу значений, самым простым и надежным методом будет использование функции Формат(). Посмотрим на пример кода, который преобразует дату в строку нужного вида:
Для Каждого СтрокаРезультата Из ТаблицаЗначений Цикл
// Преобразуем дату в строку формата ДД.ММ.ГГГГ
СтрокаДата = Формат(СтрокаРезультата.Дата, "ДФ=dd.MM.yyyy");
// Выводим в нужное поле табличного документа
ОбластьМакета.Параметры.ДатаДокумента = СтрокаДата;
КонецЦикла;
Важный нюанс: как было замечено в обсуждении на форуме, если вы пытаетесь записать результат функции Формат() обратно в колонку таблицы значений, которая имеет тип Дата, система автоматически преобразует строку обратно в дату и снова добавит время 0:00:00. Чтобы этого избежать, колонка в таблице-приемнике должна иметь тип Строка.
Если мы используем классический способ вывода через макет (.mxl), нам вообще не нужно менять запрос или писать сложный код. Мы можем настроить визуальное представление прямо в свойствах ячейки. Выполним следующие действия:
ДЛФ=Д).В этом случае, даже если в параметре Дата будет передано значение со временем, пользователь в печатной форме увидит только число, месяц и год. Это наиболее «правильный» путь с точки зрения производительности системы.
В случаях, когда для вывода используется ПостроительОтчета (как упоминалось в Сообщении 4), формат можно задать через настройки колонок. Проанализируем, как это сделать программно:
мПостроитель = Новый ПостроительОтчета;
мПостроитель.Текст = "ВЫБРАТЬ Дата ИЗ Документ.Заявка";
мПостроитель.ЗаполнитьНастройки();
// Устанавливаем формат для конкретного выбранного поля
ПолеДата = мПостроитель.ВыбранныеПоля.Найти("Дата");
Если ПолеДата <> Неопределено Тогда
ПолеДата.Формат = "ДФ=dd.MM.yyyy";
КонецЕсли;
мПостроитель.Выполнить();
мПостроитель.Вывести(ТабличныйДок);
Иногда возникает необходимость получить дату без времени непосредственно в тексте запроса (например, для последующего объединения строк). Поскольку в языке запросов 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-сервер. Помните, что преобразование данных для представления — это задача интерфейсного уровня (клиента), а не базы данных.
Если ваш отчет строится на базе СКД, это самый гибкий вариант. Выясним, где именно задаются эти настройки:
ДЛФ=Д.Преимущество этого метода в том, что в самих данных поле остается полноценной датой, что позволяет корректно сортировать отчет или использовать его в расшифровках, в то время как пользователь видит дату без времени.
Рассмотрев все варианты, мы можем сделать вывод: попытка убрать время через НачалоПериода в запросе — это лишь подготовка данных (обнуление времени). Окончательное «исчезновение» времени происходит только в момент форматирования. Для отчетов лучшим выбором будет настройка свойств ячейки макета или условного оформления СКД. Для программной обработки используйте функцию Формат(), но учитывайте типы колонок в таблицах значений.