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

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

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

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

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

В языке 1С дата — это отдельный примитивный тип, который хранит и день, и время с точностью до секунды. Записать её можно литералом в коде, получить функцией, преобразовать из строки или указать параметром запроса. Ниже разобраны все основные сценарии с примерами.

Запись даты литералом в коде

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

ДатаНачала = '20260115'; // 15 января 2026 года, время 00:00:00

ДатаСВременем = '20260115143000'; // 15 января 2026, 14:30:00

Порядок строго фиксирован: год, месяц, день, затем при необходимости часы, минуты и секунды. Если время не указано, оно равно началу дня — 00:00:00. Это важно при сравнениях: условие ДатаДокумента <= '20260115' не захватит документы, созданные 15 января в 10 утра, потому что их дата содержит время.

Типичная ошибка — попытка записать литерал в привычном виде '15.01.2026'. Такая строка не будет распознана как дата: платформа либо выдаст ошибку компиляции, либо воспримет значение иначе, чем ожидалось. Литерал даты в 1С всегда идёт в формате ГГГГММДД.

Получение текущей даты и её частей

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

Сейчас = ТекущаяДата(); // например, 15.01.2026 14:30:25

ДатаСеанса = ТекущаяДатаСеанса(); // дата по времени сеанса 1С

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

Для отсечения времени или, наоборот, получения конца дня служат функции НачалоДня(Дата) и КонецДня(Дата). Аналогичные функции существуют для недели, месяца, квартала и года — НачалоМесяца(), КонецКвартала() и так далее. Это стандартный способ построить границы периода для отчёта.

НачалоПериода = НачалоМесяца(ТекущаяДата());

КонецПериода = КонецМесяца(ТекущаяДата());

Форматирование даты для вывода пользователю

Когда дату нужно показать в сообщении, заголовке или печатной форме, применяется функция Формат() со строкой формата. Без неё дата выводится в виде по умолчанию, который зависит от региональных настроек и часто не подходит для документов.

СтрокаДаты = Формат(ДатаДокумента, "ДЛФ=D"); // "15 января 2026 г."

СтрокаКратко = Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"); // "15.01.2026"

СтрокаВремя = Формат(ДатаДокумента, "ДЛФ=DT"); // дата и время

Параметр ДЛФ задаёт локальный формат: D — длинная дата, T — время, DT — дата и время. Параметр ДФ позволяет собрать шаблон вручную из компонентов: dd — день, MM — месяц, yyyy — год, HH — часы, mm — минуты, ss — секунды. Для пустой даты полезно помнить, что она форматируется как «01.01.0001», и в печатных формах её обычно заменяют пустой строкой проверкой ЗначениеЗаполнено().

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

Если дата пришла из внешнего источника — файла, веб-сервиса, ввода пользователя — её нужно преобразовать из строки. Универсального «парсера» любого формата в языке нет, поэтому используют либо функцию Дата() с разобранными компонентами, либо стандарт ISO.

// Из компонентов

ДатаИзЧисел = Дата(2026, 1, 15); // год, месяц, день

// Из строки вида "15.01.2026"

Части = СтрРазделить("15.01.2026", ".");

ДатаИзСтроки = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

Обратное преобразование — дату в строку — выполняется той же функцией Формат(). Для обмена данными между системами принят формат ISO 8601: Формат(Дата, "ДФ=yyyy-MM-dd") или с временем "ДФ='yyyy-MM-ddTHH:mm:ss'". Такой вид корректно читается большинством внешних систем.

При разборе строки всегда оборачивайте преобразование в попытку-исключение: если во входных данных окажется «32.13.2026» или пустое значение, код без обработки завершится ошибкой и прервёт обмен.

1c
Попытка
    ДатаИзСтроки = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
Исключение
    ДатаИзСтроки = '00010101'; // пустая дата при ошибке разбора
КонецПопытки;

Даты в запросах 1С

В языке запросов дата передаётся параметром — это самый надёжный способ. Прямое встраивание даты в текст запроса возможно через литерал вида ДАТАВРЕМЯ(2026, 1, 15), но параметры предпочтительнее: запрос остаётся читаемым, а план запроса не перестраивается под каждое значение.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

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

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

В запросах доступны функции для работы с датой: ГОД(), МЕСЯЦ(), ДЕНЬ(), НАЧАЛОПЕРИОДА(Дата, ДЕНЬ), КОНЕЦПЕРИОДА(Дата, МЕСЯЦ), ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 7). Они выполняются на стороне СУБД и не требуют выгрузки данных в код.

Отдельный нюанс — виртуальные таблицы регистров. В параметрах Остатки или Обороты граница периода также задаётся датой, и забытый КонецДня() здесь приводит к тем же потерянным документам за последний день.

Типичные ошибки
01
Сравнение даты документа с литералом без КонецДня() — документы за последний день выпадают из выборки.
02
Запись литерала в виде '15.01.2026' — платформа не распознает такую дату, нужен формат '20260115'.
03
Использование ТекущаяДата() в серверном коде вместо ТекущаяДатаСеанса() — время может отличаться от времени сервера.
04
Вывод пустой даты без проверки — в печатной форме появляется «01.01.0001».

Работа с датой на форме и в полях ввода

Пользователь вводит дату в поле ввода формы в привычном виде — «15.01.2026» или выбором из календаря. Поле само следит за корректностью ввода: неправильное значение просто не запишется в реквизит. Разработчику нужно лишь убедиться, что у реквизита указан тип «Дата» и правильно выбран состав даты.

Состав даты задаётся в свойствах реквизита: «Дата», «Время» или «Дата и время». Если у реквизита документа выбран состав «Дата», время всегда будет 00:00:00, и попытки записать туда часы бессмысленны. Для журналов, где важен порядок документов внутри дня, платформа хранит время отдельно у самого документа.

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

Арифметика дат и типичные расчёты

К дате можно прибавлять и вычитать секунды обычными операторами: Завтра = ТекущаяДата() + 86400;. Но для сдвига на месяцы и годы такой подход не работает из-за разной длины месяцев — здесь нужна функция ДобавитьМесяц(Дата, КоличествоМесяцев).

ЧерезНеделю = ТекущаяДата() + 7  24  60 * 60;

ЧерезКвартал = ДобавитьМесяц(ТекущаяДата(), 3);

РазницаВСекундах = Дата2 - Дата1; // разность дат — число секунд

Разность двух дат — это число секунд между ними. Чтобы получить разницу в днях, делят на 86400. Для точного расчёта календарных разниц (например, стажа) простого деления недостаточно из-за високосных лет; в типовых конфигурациях для этого есть специальные функции общих модулей.

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

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

Литерал даты в коде
Норма

Записан как '20260115' в апострофах, модуль компилируется без ошибок

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

Формат '15.01.2026' — ошибка компиляции или неверное значение

Фильтр по периоду в запросе
Норма

Границы через НачалоДня() и КонецДня(), все документы периода в выборке

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

Документы за последний день периода отсутствуют

Дата в печатной форме
Норма

Выводится «15 января 2026 г.» или нужный шаблон

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

Видно «01.01.0001» или сырое значение с лишним временем

Частые вопросы о датах в 1С

Как записать дату без времени?

Литералом без компонентов времени — '20260115', время автоматически будет 00:00:00. Если нужно отсечь время у существующей даты, используйте НачалоДня(Дата).

Почему пустая дата выводится как 01.01.0001?

В 1С нет отдельного «пустого» значения даты: пустой считается дата 1 января года 1. Перед выводом проверяйте реквизит функцией ЗначениеЗаполнено() и подставляйте пустую строку, если дата не задана.

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

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

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

Функцией ДобавитьМесяц(Дата, 1). Прибавлять 30 или 31 день в секундах нельзя — длина месяцев различается, а функция корректно обрабатывает переход, например с 31 января на конец февраля.

Можно ли в запросе написать дату прямо в тексте?

Да, через конструкцию ДАТАВРЕМЯ(2026, 1, 15, 0, 0, 0). Но для значений, которые меняются от запуска к запуску, лучше передавать дату параметром — так запрос работает стабильнее и не перекомпилируется под каждое значение.

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

Приведите обе стороны к началу дня: НачалоДня(Дата1) = НачалоДня(Дата2). В запросе для этого служит функция НАЧАЛОПЕРИОДА(Дата, ДЕНЬ).

Итог

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

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