Работа с датой в 1С программно: текущая дата, начало месяца, формат и разность
Срок оплаты, период отчёта, имя файла с датой, возраст сотрудника — задачи с датами встречаются в каждой конфигурации. В статье собраны рабочие приёмы для встроенного языка: как создать дату, чем отличаются ТекущаяДата и ТекущаяДатаСеанса, как получить начало и конец периода, прибавить день или месяц, найти разность в днях, отформатировать дату и разобрать её из строки. Работа с датами внутри запроса вынесена в отдельную статью.
Задача: создавать и обрабатывать даты в коде
Даты встречаются в любой конфигурации: срок оплаты, период отчёта, имя файла выгрузки, возраст сотрудника, разница между двумя документами. Во встроенном языке 1С для них есть набор функций, и большинство задач решается ими без самодельных вычислений. Статья о коде на встроенном языке; о датах внутри текста запроса (ДАТАВРЕМЯ, НАЧАЛОПЕРИОДА, РАЗНОСТЬДАТ) читайте в отдельной статье про дату в запросе.
Как создать дату: Дата(), литерал и строка
Значение типа «Дата» в 1С всегда содержит и дату, и время. Если время не указано, оно равно 0:00:00. Создать дату можно тремя способами.
Дата1 = Дата(2026, 11, 1); // 01.11.2026 0:00:00
Дата2 = Дата(2026, 11, 1, 14, 30, 0); // 01.11.2026 14:30:00
Дата3 = Дата("20261101"); // из строки формата ГГГГММДД
Дата4 = Дата("20261101143000"); // из строки ГГГГММДДЧЧММСС
Дата5 = '20261101'; // литерал даты прямо в коде
ПустаяДата = Дата(1, 1, 1); // пустая дата
Литерал в одинарных кавычках разбирается при компиляции, он быстрее и нагляднее для констант. Параметры Дата(Год, Месяц, День) проверяются при выполнении: несуществующая комбинация, например Дата(2026, 2, 30) или Дата(2026, 13, 1), вызывает исключение. Если значения приходят извне, оборачивайте создание в Попытка ... Исключение.
Текущая дата: ТекущаяДата и ТекущаяДатаСеанса
Функций для получения текущего момента три, и выбирать между ними нужно осознанно.
| Функция | Что возвращает | Когда использовать |
|---|---|---|
ТекущаяДата() | Время компьютера, на котором выполняется код (на сервере — время сервера, на клиенте — клиента) | Почти никогда в прикладной логике |
ТекущаяДатаСеанса() | Текущее время с учётом часового пояса сеанса пользователя | Основная функция: проставление дат в документах, отчёты, сроки |
ТекущаяУниверсальнаяДата() | Время UTC | Хранение меток времени, обмен между часовыми поясами |
Если все пользователи находятся в одном часовом поясе с сервером, разницы можно не заметить. Но стоит появиться удалённому филиалу или серверу в другом поясе, как ТекущаяДата() начинает давать «чужое» время. Поэтому в новом коде используйте ТекущаяДатаСеанса().
Начало и конец периода
Чтобы отбросить время или получить границы периода, не нужно считать вручную — есть готовые функции.
Сегодня = ТекущаяДатаСеанса(); НачалоСегодня = НачалоДня(Сегодня); // сегодня 0:00:00 КонецСегодня = КонецДня(Сегодня); // сегодня 23:59:59 ПервоеЧисло = НачалоМесяца(Сегодня); ПоследнееЧисло = КонецМесяца(Сегодня); // последняя секунда месяца НачалоГодаДата = НачалоГода(Сегодня); НачалоКварталаДата = НачалоКвартала(Сегодня); ПонедельникНедели = НачалоНедели(Сегодня); // неделя начинается с понедельника ВоскресеньеНедели = КонецНедели(Сегодня); // Предыдущий месяц целиком НачалоПрошлого = НачалоМесяца(ДобавитьМесяц(Сегодня, -1)); КонецПрошлого = КонецМесяца(НачалоПрошлого);
Функция КонецДня возвращает последнюю секунду суток, поэтому её значение удобно передавать в отбор «по дату включительно». Аналогично существуют КонецГода, КонецКвартала, НачалоЧаса, НачалоМинуты.
Прибавить день к дате и сдвиг по месяцам
Арифметика с датами проста: число, прибавляемое к дате, трактуется как количество секунд. Поэтому сутки — это 86400.
ЗавтраДата = Дата + 86400; // плюс один день ЧерезНеделю = Дата + 7 * 86400; ВчераДата = Дата - 86400; ЧерезЧас = Дата + 3600; // Месяцы нельзя прибавлять секундами — длина месяца разная ЧерезМесяц = ДобавитьМесяц(Дата, 1); ЧерезГод = ДобавитьМесяц(Дата, 12); МесяцНазад = ДобавитьМесяц(Дата, -1);
Классическая ошибка новичка: Дата + 1 прибавляет не день, а одну секунду. Функция ДобавитьМесяц учитывает разную длину месяцев: если нужного дня нет в целевом месяце, возвращается его последний день, то есть 31 января плюс один месяц даст конец февраля. Время суток при этом сохраняется.
Разность дат в днях
Вычитание одной даты из другой возвращает число секунд между ними. Чтобы получить дни, делим на 86400 и при необходимости округляем.
// Полных суток между моментами Дней = Цел((КонецПериода - НачалоПериода) / 86400); // Календарных дней, время суток игнорируем КалендарныхДней = (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400;
Возраст и стаж считают отдельной функцией, чтобы не зависеть от високосных лет:
Функция ПолныхЛет(ДатаНачала, НаДату)
Лет = Год(НаДату) - Год(ДатаНачала);
Если ДобавитьМесяц(ДатаНачала, Лет * 12) > НаДату Тогда
Лет = Лет - 1;
КонецЕсли;
Возврат Лет;
КонецФункции
Функция ПолныхЛет подходит для расчёта возраста и стажа. Она корректно обрабатывает и дату 29 февраля, потому что опирается на ДобавитьМесяц.
Год, месяц, день, день недели
Компоненты даты извлекаются функциями с одноимёнными названиями. Все они возвращают число.
Г = Год(Дата); М = Месяц(Дата); Д = День(Дата); Ч = Час(Дата); Мин = Минута(Дата); С = Секунда(Дата); ДеньНед = ДеньНедели(Дата); // 1 — понедельник ... 7 — воскресенье НомерНедели = НеделяГода(Дата); ДеньВГоду = ДеньГода(Дата); Выходной = ДеньНедели(Дата) > 5; ДнейВМесяце = День(КонецМесяца(Дата));
Проверка на выходной по номеру дня недели не учитывает праздники и переносы: для них используют производственный календарь конфигурации.
Формат даты: Формат() и ДФ, ДЛФ
Для вывода даты в нужном виде служит функция Формат(Значение, ПараметрыФормата). Шаблон даты задаётся параметром ДФ, в котором работают привычные обозначения: dd — день, MM — месяц, yyyy — год, HH — часы в 24-часовом формате, mm — минуты, ss — секунды.
Формат(Дата, "ДФ=dd.MM.yyyy") // 01.11.2026 Формат(Дата, "ДФ='dd.MM.yyyy HH:mm:ss'") // 01.11.2026 14:30:00 Формат(Дата, "ДФ=yyyy-MM-dd") // 2026-11-01 Формат(Дата, "ДФ=yyyyMMdd") // 20261101, удобно для имён файлов Формат(Дата, "ДЛФ=Д") // короткая дата по настройкам системы Формат(Дата, "ДЛФ=ДД") // длинная дата («1 ноября 2026 г.») Формат(Дата, "ДЛФ=В") // только время ИмяФайла = "Выгрузка_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss") + ".xml";
Если шаблон содержит пробелы или двоеточия, его заключают в апострофы. Главная ловушка: регистр букв имеет значение. MM — месяц, mm — минуты; HH — 24-часовой формат, hh — 12-часовой. Вместо ДФ часто используют ДЛФ — формат, который зависит от региональных настроек: удобно для интерфейса, но не для обмена данными, где нужен предсказуемый шаблон. Функция Строка(Дата) тоже выводит дату в региональном представлении.
Преобразование строки в дату
Функция Дата("...") принимает только цифровые строки формата ГГГГММДД или ГГГГММДДЧЧММСС. Строка вида «01.11.2026» таким способом не преобразуется и вызовет ошибку. Для разных источников есть несколько способов.
// 1. Из ISO-формата 2026-11-01T14:30:00 (XML, JSON, веб-сервисы)
ДатаИзXML = XMLЗначение(Тип("Дата"), "2026-11-01T14:30:00");
// Обратное преобразование
Строка = XMLСтрока(ДатаИзXML);
Строку формата «ДД.ММ.ГГГГ» разбирают вручную:
Функция СтрокаВДату(Знач Строка)
Части = СтрРазделить(СокрЛП(Строка), ".");
Если Части.Количество() <> 3 Тогда
Возврат Дата(1, 1, 1);
КонецЕсли;
Попытка
Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
Исключение
Возврат Дата(1, 1, 1);
КонецПопытки;
КонецФункции
Функция СтрокаВДату возвращает пустую дату, если строка не распознана, — так вызывающий код может проверить результат через ЗначениеЗаполнено. Формат XMLЗначение стоит использовать при чтении данных из внешних систем (подробнее — в статьях про JSON и XML), а в пользовательском вводе разбирайте строку по правилам нужного формата.
Пустая дата и проверка заполненности
Незаполненная дата в 1С — это 01.01.0001 0:00:00. Получить её можно как Дата(1, 1, 1) или литералом '00010101'. Для проверки используйте ЗначениеЗаполнено(), а не сравнение с датой:
Если Не ЗначениеЗаполнено(Объект.ДатаОплаты) Тогда
Объект.ДатаОплаты = НачалоДня(ТекущаяДатаСеанса());
КонецЕсли;
// Эквивалентное сравнение
Если Объект.ДатаОплаты = '00010101' Тогда
// дата не заполнена
КонецЕсли;
Сравнивать даты можно операторами <, > и =. Помните, что равенство учитывает и время: чтобы узнать, что два момента приходятся на один день, сравните НачалоДня(Дата1) = НачалоДня(Дата2).
Часовые пояса
1С хранит даты без часового пояса, поэтому «14:30» само по себе не говорит, в чьём это времени. Поведение определяют настройки сеанса. Для переходов между поясами есть функции:
ЧасовойПояс = ЧасовойПоясСеанса();
// Сохранённый в UTC момент показать пользователю
Местное = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс);
// Введённое пользователем время привести к UTC
Универсальное = УниверсальноеВремя(Местное, ЧасовойПояс);
// Задать пояс для сеанса (серверный код)
УстановитьЧасовойПоясСеанса("Europe/Moscow");
Практическое правило для распределённых систем: хранить и передавать метки времени в UTC, а показывать в часовом поясе пользователя.
Типичные ошибки с датами
Дата + 1вместоДата + 86400— прибавляется секунда, а не день.ТекущаяДата()в серверном коде при пользователях из разных поясов — расхождение с ожидаемым временем.- Шаблон
"ДФ=dd.mm.yyyy"— вместо месяца выводятся минуты (нуженMM). Дата("01.11.2026")— исключение; допустимы только цифровые форматы ГГГГММДД[ЧЧММСС].- Сравнение
Дата1 = Дата2без учёта времени — документы одного дня оказываются «неравными». - Расчёт месяцев делением секунд на 2 592 000 — вместо
ДобавитьМесяци сравнения границ. - Форматирование пустой даты без проверки заполненности — на выходе пустая или бессмысленная строка.
Функции работы с датой: шпаргалка
| Задача | Код |
|---|---|
| Дата без времени | НачалоДня(Дата) |
| Конец дня, месяца | КонецДня(Дата), КонецМесяца(Дата) |
| Прибавить день | Дата + 86400 |
| Прибавить месяц | ДобавитьМесяц(Дата, 1) |
| Разность в днях | (НачалоДня(Д2) - НачалоДня(Д1)) / 86400 |
| Дата в строку | Формат(Дата, "ДФ=dd.MM.yyyy") |
| Строка в дату | Дата("20261101"), XMLЗначение(Тип("Дата"), ...) |
| Пустая дата | Дата(1, 1, 1), проверка ЗначениеЗаполнено |
| Текущая дата для пользователя | ТекущаяДатаСеанса() |
Актуальность для новых версий
Функции Дата, НачалоДня, КонецМесяца, ДобавитьМесяц, Формат и функции извлечения частей даты одинаково работают во всех версиях платформы 8.3. Функции часовых поясов сеанса (ЧасовойПоясСеанса, МестноеВремя, УниверсальноеВремя) доступны в актуальных релизах 8.3; в прикладных решениях всегда используйте ТекущаяДатаСеанса() вместо ТекущаяДата(). Результат ДЛФ зависит от региональных настроек системы.
Частые вопросы
Как прибавить день к дате в 1С?
Прибавьте 86400 секунд: ЗавтраДата = Дата + 86400. Для месяцев используйте ДобавитьМесяц(Дата, 1), потому что длина месяца разная. Выражение Дата + 1 прибавляет только одну секунду.
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время компьютера, на котором выполняется код. ТекущаяДатаСеанса() учитывает часовой пояс сеанса пользователя, поэтому подходит для прикладной логики и документов.
Как получить начало месяца в 1С?
Функцией НачалоМесяца(Дата). Конец месяца даёт КонецМесяца(Дата) — последняя секунда месяца. Аналогично работают НачалоГода, НачалоКвартала, НачалоНедели и НачалоДня.
Как преобразовать строку в дату в 1С?
Строки вида ГГГГММДД или ГГГГММДДЧЧММСС принимает функция Дата("20261101"). Формат ISO разбирает XMLЗначение(Тип("Дата"), "2026-11-01T14:30:00"). Строку «01.11.2026» нужно разобрать вручную по частям.