К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сформировать дату в 1С: способы, функции и примеры

Как сформировать дату в 1С: функция Дата(), ТекущаяДата(), форматирование через Формат(), работа с датами в запросах и типичные ошибки разработчиков.

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

Выбор способа зависит от контекста: в коде модуля используются одни конструкции, в языке запросов — другие, а для вывода даты пользователю в нужном виде применяется функция форматирования. Ошибки при работе с датами приводят к некорректным отборам в отчётах, неверным срокам в документах и проблемам при обмене данными между базами.

Ниже рассмотрены основные способы формирования даты во встроенном языке 1С, работа с датами в запросах, форматирование для вывода, а также типичные ошибки и способы их проверки.

Тип данных «Дата» в 1С и его особенности

В 1С дата хранится в виде типа «Дата», который всегда содержит и календарную часть, и время с точностью до секунды. Даже если вы задаёте только день, месяц и год, время будет равно 00:00:00 — началу дня. Это важно учитывать при сравнениях: дата документа, проведённого в 14:30, не равна дате с нулевым временем того же дня.

Диапазон допустимых значений — с 1 января 0001 года до 31 декабря 3999 года. Пустая дата (значение по умолчанию) — это Дата(1,1,1), то есть 01.01.0001 00:00:00. Проверка на пустую дату выполняется сравнением с этим значением или с литералом '00010101'.

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

Формирование даты функцией Дата()

Основной способ создать конкретную дату в коде — функция Дата(). У неё есть два варианта синтаксиса. Первый принимает числовые параметры: год, месяц, день и необязательно часы, минуты, секунды:

НоваяДата = Дата(2026, 3, 15);            // 15.03.2026 0:00:00

ДатаСВременем = Дата(2026, 3, 15, 14, 30, 0); // 15.03.2026 14:30:00

Второй вариант — строковый литерал в формате «ГГГГММДДччммсс», где части можно опускать справа:

Дата1 = Дата("20260315");        // 15.03.2026 0:00:00

Дата2 = Дата("20260315143000"); // 15.03.2026 14:30:00

Строковый формат удобен, когда дата приходит из внешнего источника — файла обмена, веб-сервиса или CSV — в виде упорядоченной строки. Если строка не соответствует формату или содержит несуществующую дату (например, 30 февраля), платформа вызовет ошибку выполнения, поэтому внешние данные стоит проверять до преобразования.

Проверка корректности при разборе строки

Если дата приходит в произвольном пользовательском формате («15.03.2026», «03/15/2026»), надёжнее разобрать её вручную: выделить части через СтрРазделить, привести к числам и передать в числовой вариант функции Дата() внутри конструкции Попытка...Исключение. Это защищает код от падения на некорректном вводе.

Текущая дата: ТекущаяДата() и ТекущаяДатаСеанса()

Для получения текущего момента есть две функции, и их часто путают. ТекущаяДата() на клиенте возвращает время компьютера пользователя, на сервере — время сервера. ТекущаяДатаСеанса() всегда возвращает время сервера с учётом часового пояса сеанса и доступна только в серверном контексте.

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

// Серверный код

Сейчас = ТекущаяДатаСеанса();

НачалоСегодня = НачалоДня(Сейчас);

Арифметика дат и функции сдвига

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

  • НачалоДня(Дата), КонецДня(Дата) — границы суток; аналогично есть НачалоМесяца, КонецМесяца, НачалоГода, КонецКвартала и другие;
  • ДобавитьМесяц(Дата, ЧислоМесяцев) — сдвиг на месяцы с корректной обработкой конца месяца (31 января плюс месяц даст конец февраля);
  • НачалоНедели(Дата), КонецНедели(Дата) — для недельных отчётов.
// Дата оплаты — 14 календарных дней от даты документа

ДатаОплаты = ДатаДокумента + 14 * 86400;

// Первое число следующего месяца

СледМесяц = НачалоМесяца(ДобавитьМесяц(ДатаДокумента, 1));

Для расчёта разницы между датами в днях используют выражение (Дата2 - Дата1) / 86400. При этом убедитесь, что обе даты приведены к началу дня, иначе разница во времени исказит результат.

Формирование даты в запросах

В языке запросов 1С дата задаётся литералом ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда) — время можно опустить:

ВЫБРАТЬ

Реализация.Ссылка

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Дата >= ДАТАВРЕМЯ(2026, 1, 1)

Однако «зашивать» даты в текст запроса — плохая практика: при изменении периода запрос будет перекомпилироваться. Правильнее передавать дату параметром:

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));

Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));

При отборе по виртуальным таблицам регистров (Остатки, Обороты) даты передаются в параметры виртуальной таблицы. Для остатков граница обычно формируется как КонецДня(Дата) либо объект типа «Граница», если нужно включить или исключить движения конкретного документа.

Типичные ошибки
01
Отбор вида Дата = &Дата без приведения к началу дня — документы того же дня, но с другим временем, не попадают в выборку
02
Использование ТекущаяДата() на клиенте в клиент-серверном режиме — документы получают разное время из-за часовых поясов пользователей
03
Сравнение даты со строкой вместо преобразования типов — условие всегда ложно или вызывает ошибку
04
Сложение месяцев через 30 * 86400 вместо ДобавитьМесяц() — накопление ошибки и неверные даты на длинных периодах

Форматирование даты для вывода

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

Формат(Дата, "ДЛФ=D");        // 15.03.2026

Формат(Дата, "ДЛФ=DD"); // 15 марта 2026 г.

Формат(Дата, "ДЛФ=DT"); // 15.03.2026 14:30:00

Формат(Дата, "ДФ=dd.MM.yyyy"); // произвольный шаблон

Формат(Дата, "ДФ='yyyy-MM-dd'"); // для обмена: 2026-03-15

Параметры с префиксом ДЛФ — локализуемые форматы, они учитывают региональные настройки сеанса. Параметр ДФ задаёт шаблон явно и используется, когда нужен строго определённый вид, например при выгрузке в XML или формировании имени файла.

Для вывода пустой даты пустой строкой (а не «01.01.0001») добавьте параметр ДП: Формат(Дата, "ДЛФ=D; ДП=''") — или задайте нужный текст вместо пустой даты. В отчётах на СКД формат задаётся в свойствах поля на закладке «Наборы данных» или через оформление.

bsl
Функция ДатаСтрокойДляФайла(Дата)
	Возврат Формат(Дата, "ДФ=yyyy-MM-dd_HH-mm-ss");
КонецФункции

Проверка результата и границы безопасной работы

После формирования даты полезно проверить результат до записи в базу. Быстрый способ — вывести значение через Сообщить() в файловой копии или воспользоваться консолью кода. Проверяйте три вещи: календарная часть соответствует ожиданиям, время не содержит неожиданных значений (особенно при сравнениях), а дата не оказалась пустой из-за ошибки разбора строки.

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

Контрольные точки

Как проверить результат

Значение сформированной даты
Норма

Календарная часть и время соответствуют задуманному

Тревожный признак

Дата 01.01.0001 — признак ошибки разбора или неинициализированной переменной

Отбор в запросе по периоду
Норма

Выборка включает все документы последнего дня периода

Тревожный признак

Документы последнего дня пропадают — верхняя граница задана без КонецДня()

Вывод даты пользователю
Норма

Формат соответствует ожиданиям, пустая дата показана пустой строкой

Тревожный признак

Отображается 01.01.0001 или время, которого не должно быть

Итог

Что важно запомнить

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

Частые вопросы

Как получить дату без времени (начало дня)?

Примените функцию НачалоДня(Дата) — она обнуляет время, возвращая 00:00:00 указанного дня. Это стандартный приём перед сравнением дат и передачей границ периода в запрос.

Как преобразовать строку «15.03.2026» в дату?

Разделите строку функцией СтрРазделить(Строка, "."), приведите части к числам и передайте их в Дата(Год, Месяц, День) внутри конструкции Попытка...Исключение. Прямой вызов Дата("15.03.2026") не сработает — строковый вариант функции понимает только формат ГГГГММДД.

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?

ТекущаяДата() возвращает время того компьютера, где выполняется код, а ТекущаяДатаСеанса() — время сервера с учётом часового пояса сеанса. В клиент-серверной работе используйте второй вариант, чтобы все пользователи оперировали единым временем.

Как прибавить к дате один месяц?

Используйте ДобавитьМесяц(Дата, 1). Функция корректно обрабатывает концы месяцев: от 31 января результатом будет последний день февраля, а не несуществующая дата. Прибавление 30 * 86400 секунд такой гарантии не даёт.

Как задать период в запросе, чтобы не потерять документы последнего дня?

Передайте параметры НачалоДня(ДатаНачала) и КонецДня(ДатаОкончания) и используйте условие «Дата МЕЖДУ &НачалоПериода И &КонецПериода» или сравнения на больше-меньше. КонецДня возвращает 23:59:59, поэтому весь последний день попадёт в выборку.

Как проверить, что реквизит типа «Дата» не заполнен?

Сравните значение с пустой датой: Реквизит = Дата(1,1,1) или Реквизит = '00010101'. В запросах используйте условие «Реквизит = ДАТАВРЕМЯ(1,1,1)». Функция ЗначениеЗаполнено() также корректно определяет пустую дату.