Разработка и Конфигурация · 10 мин
Как в 1С выразить значение как дату
Как использовать ВЫРАЗИТЬ КАК ДАТА в запросах 1С: синтаксис, преобразование строк и чисел в дату, работа с составными типами, типичные ошибки и примеры кода.
Функция ВЫРАЗИТЬ в языке запросов 1С используется для приведения значения к нужному типу. Конструкция «ВЫРАЗИТЬ КАК ДАТА» чаще всего нужна в трёх ситуациях: когда реквизит имеет составной тип и его нужно сравнить с конкретной датой, когда дата хранится в виде строки или числа, и когда требуется отсечь время, оставив только календарную дату.
Важно понимать ограничение: ВЫРАЗИТЬ в запросе не выполняет произвольный парсинг строк. Она приводит значение к типу ДАТА только если это физически возможно на уровне СУБД. Строку «15.03.2026» запрос сам не разберёт — для таких задач используется функция ДатаВремя() во встроенном языке или преобразование через ДАТАВРЕМЯ в запросе. ВЫРАЗИТЬ КАК ДАТА корректно работает с составными типами, где среди допустимых типов уже есть Дата.
Синтаксис ВЫРАЗИТЬ КАК ДАТА в запросе
Базовый синтаксис выглядит так: ВЫРАЗИТЬ(Выражение КАК ДАТА). В отличие от приведения к строке или числу, для типа ДАТА параметры длины и точности не указываются — у даты их нет. Выражением может быть поле таблицы, параметр запроса или результат другой функции.
ВЫБРАТЬ
ВЫРАЗИТЬ(Документ.ЗначениеСвойства КАК ДАТА) КАК ДатаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
ВЫРАЗИТЬ(Документ.ЗначениеСвойства КАК ДАТА) = &НужнаяДата
Если реквизит имеет составной тип (например, Дата, Строка, Число), то без ВЫРАЗИТЬ сравнение с параметром типа Дата может работать некорректно или замедлять запрос: платформа не сможет использовать индекс эффективно. Приведение типа сужает значение до одного типа и делает условие предсказуемым.
Как обрезать время и получить только дату
Частая практическая задача — сравнить документы по дню, игнорируя время. Тип Дата в 1С всегда содержит время, поэтому «чистая» дата — это дата с временем 00:00:00. Для отсечения времени в запросе используются две конструкции.
Первый способ — функция НАЧАЛОПЕРИОДА: НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ). Она возвращает начало дня и работает быстрее, чем приведение типов. Второй способ — ВЫРАЗИТЬ в сочетании с ДАТАВРЕМЯ: извлечь год, месяц и день функциями ГОД(), МЕСЯЦ(), ДЕНЬ() и собрать новую дату через ДАТАВРЕМЯ(ГОД(Поле), МЕСЯЦ(Поле), ДЕНЬ(Поле)).
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК День,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ)
Способы отсечь время
Рекомендуемый вариант: короткая запись, хорошо оптимизируется СУБД, подходит для группировок и сравнений
Громоздкая запись, оправдана только когда нужно собрать дату из отдельных числовых частей
Не отсекает время — только приводит тип. Для обрезки времени не подходит
Преобразование строки в дату во встроенном языке
Когда дата приходит извне — из файла, веб-сервиса, обмена — она обычно представлена строкой. Запрос здесь не поможет: преобразование выполняется во встроенном языке. Для строки в формате ISO «20260315» или «2026-03-15» есть несколько рабочих подходов.
Для строгого формата ГГГГММДДччммсс удобно собрать дату через функцию Дата(): Дата(Лев(Строка,4), Сред(Строка,5,2), Сред(Строка,7,2)). Для произвольных форматов надёжнее разобрать строку вручную по разделителям и собрать дату из компонентов, предварительно проверив корректность чисел.
Функция СтрокаВДату(СтрокаДаты)
// Формат "ДД.ММ.ГГГГ"
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() <> 3 Тогда
Возврат Дата(1,1,1);
КонецЕсли;
Попытка
Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
Исключение
Возврат Дата(1,1,1);
КонецПопытки;
КонецФункции
Пустая дата Дата(1,1,1) — общепринятый маркер неуспешного преобразования. Возвращать её безопаснее, чем текущую дату: ложное значение легко отфильтровать, а подмена текущей датой приведёт к тихим ошибкам в учёте.
Конструктор ДАТАВРЕМЯ в запросе
Если компоненты даты хранятся отдельными числами или нужно сформировать дату прямо в запросе, используется конструктор ДАТАВРЕМЯ(год, месяц, день, час, минута, секунда). Параметры времени можно опустить — тогда они примут нулевые значения.
ВЫБРАТЬ
ДАТАВРЕМЯ(Таблица.Год, Таблица.Месяц, 1) КАК ПервоеЧислоМесяца
ИЗ
РегистрСведений.ПериодыОтчетности КАК Таблица
Ограничение конструктора: все аргументы должны быть корректными числами. Если месяц равен 13 или день равен 0, запрос завершится ошибкой на уровне СУБД. Поэтому перед использованием ДАТАВРЕМЯ с данными из таблиц стоит добавить условие ВЫБОР с проверкой диапазонов.
Приведение типа в СКД и динамических списках
В схемах компоновки данных ВЫРАЗИТЬ КАК ДАТА применяется в вычисляемых полях и в запросе набора данных. Типичный сценарий — дополнительное свойство объекта хранится в регистре сведений с ресурсом составного типа, а в отчёте его нужно вывести как дату и отсортировать по ней.
При этом важно приводить тип уже в запросе набора данных, а не в вычисляемом поле СКД: отборы и сортировки по полю, вычисленному на уровне компоновки, выполняются в памяти и работают медленнее. Если по полю-дате планируется отбор пользователем, приведение типа в тексте запроса обязательно.
- 1Убедитесь, что в состав типа реквизита входит тип Дата (панель свойств реквизита в конфигураторе)
- 2В тексте запроса оберните поле: ВЫРАЗИТЬ(Реквизит КАК ДАТА)
- 3Добавьте условие на NULL, если в поле могут быть значения других типов
- 4Проверьте результат на тестовых данных: значения-даты должны выводиться, прочие — давать NULL
- 5Для сравнения по дню оберните результат в НАЧАЛОПЕРИОДА(..., ДЕНЬ)
Типичные ошибки и их последствия
Самая частая ошибка — ожидание, что ВЫРАЗИТЬ КАК ДАТА распарсит строку «01.02.2026». Этого не произойдёт: результатом будет NULL, и условие сравнения молча не сработает. Запрос выполнится без ошибки, но вернёт пустой результат, что затрудняет диагностику.
Вторая ошибка — сравнение дат с точностью до секунды там, где нужно сравнение по дню. Документ, проведённый в 14:30:00, не равен параметру «начало дня», и запись выпадает из выборки. Третья ошибка — игнорирование NULL после приведения типа: NULL не равен никакому значению, включая NULL, поэтому записи с NULL теряются в условиях ГДЕ без явной обработки через ЕСТЬ NULL или ЕСТЬNULL().
Проверка результата преобразования
После приведения типа результат стоит проверить тремя способами. Во-первых, вывести поле без условий и убедиться, что даты отображаются, а незаполненные значения дают NULL. Во-вторых, добавить условие ГДЕ ПриведенноеПоле ЕСТЬ NULL — так видно объём «потерянных» записей. В-третьих, сравнить количество записей до и после фильтрации: неожиданное уменьшение выборки указывает на проблему с типами.
Во встроенном языке тип результата проверяется функцией ТипЗнч(Значение) = Тип("Дата"), а сама дата — сравнением с пустым значением Дата(1,1,1). Для отладки запросов удобна консоль запросов: она показывает тип колонки результата и позволяет быстро проверить поведение ВЫРАЗИТЬ на реальных данных.
Как проверить результат
Колонка имеет тип Дата
Колонка строкового или составного типа — приведение не применено
Даты выводятся, прочие типы дают NULL
Все значения NULL — в поле нет данных типа Дата
Число записей соответствует ожиданиям по данным
Выборка резко сократилась — вероятны NULL или сравнение со временем
FAQ
Можно ли через ВЫРАЗИТЬ преобразовать строку «01.01.2026» в дату?
Нет. ВЫРАЗИТЬ КАК ДАТА не выполняет разбор строк — для строкового значения результатом будет NULL. Строку нужно преобразовать во встроенном языке через функцию Дата() с предварительным разбором по разделителям, либо собрать дату в запросе конструктором ДАТАВРЕМЯ из числовых компонентов.
Почему после ВЫРАЗИТЬ КАК ДАТА поле содержит NULL?
Это означает, что фактическое значение поля не является датой. Такое происходит с составными типами, когда в конкретной записи хранится строка, число или ссылка. NULL — нормальное поведение, а не ошибка; обработайте его через ЕСТЬNULL() или отфильтруйте условием ЕСТЬ NULL.
Как сравнить документ с конкретным днём, если в дате есть время?
Используйте НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &ДатаДня, где параметр — дата с временем 00:00:00. Альтернатива для производительности — условие диапазона: Документ.Дата МЕЖДУ &НачалоДня И &КонецДня, где конец дня вычисляется функцией КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).
Чем ВЫРАЗИТЬ отличается от ДАТАВРЕМЯ в запросе?
ВЫРАЗИТЬ приводит существующее значение к типу Дата и не создаёт новую дату. ДАТАВРЕМЯ — конструктор, который собирает дату из числовых компонентов (год, месяц, день и при необходимости время). Первую используют для составных типов, вторую — когда дату нужно сформировать из отдельных чисел.
Работает ли ВЫРАЗИТЬ КАК ДАТА с параметром запроса?
Да, конструкция ВЫРАЗИТЬ(&Параметр КАК ДАТА) допустима и полезна, когда параметр объявлен без явного типа. Это помогает платформе корректно построить план запроса и избежать неявных преобразований при сравнении с полями типа Дата.
Как получить пустую дату в запросе?
Пустая дата в запросе задаётся конструктором ДАТАВРЕМЯ(1,1,1). Именно с ней сравнивают незаполненные даты: условие вида Документ.СрокОплаты = ДАТАВРЕМЯ(1,1,1) выберет документы, где срок не указан. Сравнение с NULL здесь не подойдёт — пустая дата и NULL в 1С разные вещи.
Что важно запомнить
ВЫРАЗИТЬ КАК ДАТА приводит к типу Дата только те значения, которые уже являются датами, — строки она не разбирает. Для строк используйте Дата() во встроенном языке, для сборки из чисел — ДАТАВРЕМЯ в запросе, для отсечения времени — НАЧАЛОПЕРИОДА. Всегда обрабатывайте NULL после приведения составных типов.