При работе с запросами в системе 1С:Предприятие разработчики часто сталкиваются с неоднозначным поведением платформы при выводе полей типа Дата. В одном случае консоль запросов показывает только дату, в другом — добавляет время 00:00:00, а в третьем — выводит полное время с секундами. Рассмотрим подробнее, почему так происходит, как данные хранятся на самом деле и какими инструментами мы можем управлять визуализацией этих данных.
Первое и самое важное правило, которое нам необходимо усвоить: в платформе 1С:Предприятие 8 тип данных Дата всегда содержит и дату, и время. В отличие от некоторых систем управления базами данных, где разделены типы DATE и DATETIME, 1С использует единый тип. Даже если в метаданных конфигурации (например, у реквизита справочника или документа) установлено свойство Состав даты в значение "Только дата", это не означает, что время исчезло. Это лишь инструкция для пользовательского интерфейса, указывающая, как отображать это поле в формах и как позволять пользователю его редактировать.
Проанализируем ситуацию, когда мы выбираем дату рождения физического лица. В базе данных это значение хранится с временной меткой. Если время не было задано явно, оно записывается как 00:00:00. Однако, когда мы выполняем запрос в консоли, механизм вывода данных может применять свои алгоритмы форматирования.
Разберем по шагам, как работают различные консоли запросов. Большинство "классических" консолей (особенно для обычных форм) выводят результат в ТабличныйДокумент. Этот объект обладает встроенным интеллектом: если значение ячейки имеет тип Дата и время в этом значении равно 00:00:00 (начало дня), система по умолчанию может скрывать временную часть, чтобы не загромождать отчет лишними нулями.
Посмотрим на пример, который привел автор темы. В простом запросе:
ВЫБРАТЬ
т.А как А,
НачалоПериода(т.А, ДЕНЬ) как АА
ИЗ
(ВЫБРАТЬ ДАТАВРЕМЯ(2023, 2, 9, 10, 15, 45) как А) как т
Здесь в колонке "А" время задано явно (10:15:45), поэтому любая консоль обязана его показать. В колонке "АА" используется функция НАЧАЛОПЕРИОДА, которая "обнуляет" время, делая его равным 00:00:00. Проанализируем результат: консоль видит "нулевое" время и, следуя настройкам форматирования ячейки, отображает только дату. Это визуальный эффект, а не изменение типа данных.
Выясним причину такого поведения на уровне СУБД. На уровне SQL Server или PostgreSQL 1С хранит даты в полях типа datetime или timestamp. Интересный технический нюанс заключается в том, что 1С использует смещение в 2000 лет. Дата «01.01.2023» фактически хранится в таблицах SQL как «01.01.4023». Это необходимо для корректной поддержки дат ранее 1753 года (минимальная дата для MS SQL Server). Но независимо от смещения, в SQL это поле всегда имеет компоненту времени.
Если ваша консоль запросов построена на базе СКД, то управление форматом даты становится еще более гибким. В СКД за вывод отвечает не просто ячейка таблицы, а настройки оформления полей. Посмотрим, как мы можем принудительно задать формат:
ДФ=dd.MM.yyyy для вывода только даты или ДФ='dd.MM.yyyy HH:mm:ss' для полного вывода.Если формат в СКД не задан, система анализирует метаданные поля. Если поле получено напрямую из реквизита с составом "Только дата", СКД применит соответствующую маску автоматически. Однако, если поле является результатом вычисления (как в случае с НАЧАЛОПЕРИОДА), метаданных о составе даты у него нет, и система может вывести время по умолчанию.
Рассмотрим еще один способ повлиять на формат вывода непосредственно в тексте запроса — использование оператора ПРЕДСТАВЛЕНИЕ. Этот оператор преобразует дату в строку в соответствии с региональными настройками сеанса пользователя.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(ФизическиеЛица.ДатаРождения) КАК ДатаСтрокой
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
Важный момент: результат выполнения функции ПРЕДСТАВЛЕНИЕ — это всегда строка (String). Это удобно для визуализации в консоли, так как вы увидите именно то, что увидел бы пользователь в экранной форме. Но помните, что с таким результатом нельзя выполнять математические операции или использовать его в дальнейших соединениях запроса как дату.
Если вы программируете и выполняете запрос из кода, а затем выгружаете результат в таблицу значений (РезультатЗапроса.Выгрузить()), то никакое визуальное форматирование не скроет время. В колонке таблицы значений будут объекты типа Дата. Проверить это можно простым кодом:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Значение: " + Выборка.ДатаРождения + " | Тип: " + ТипЗнч(Выборка.ДатаРождения));
КонецЦикла;
В окне сообщений вы увидите полное представление даты со временем, даже если это 00:00:00. Это подтверждает, что вопрос "исчезновения" времени — это исключительно вопрос инструментария визуализации, такого как консоль запросов.
Проанализируем ситуацию с пустой датой. В 1С пустая дата — это 01.01.0001 00:00:00. Разные консоли запросов отображают её по-разному:
ГДЕ ДатаРождения = ДАТАВРЕМЯ(1, 1, 1).
Мы выяснили, что в 1С дата без времени не существует как отдельный физический тип. Если вы видите в консоли дату без времени, это происходит по одной из трех причин:
ТабличныйДокумент, который скрывает нулевое время.ДФ).