Разработка и Конфигурация · 11 мин
Как задать дату в коде 1С: все рабочие способы
Как задать дату в коде 1С: литералы дат, функции Дата(), ТекущаяДата(), работа с составными частями, форматирование и типичные ошибки разработчиков.
Во встроенном языке 1С дата — это отдельный примитивный тип данных, а не строка и не число. Поэтому задать её «как текст» не получится: значение нужно либо записать литералом, либо получить через функции языка. Путаница между строковым представлением даты и самим типом «Дата» — самая частая причина ошибок вида «Преобразование значения к типу Дата не может быть выполнено».
Тип «Дата» в 1С всегда содержит и дату, и время с точностью до секунды. Если время не указано явно, оно равно 00:00:00 — такое значение называют «пустым временем» или началом дня. Это важно учитывать при сравнениях: дата «15.03.2026 00:00:00» не равна дате «15.03.2026 14:30:00», хотя календарный день один и тот же.
Ниже разобраны все рабочие способы задать дату в коде: литералы, функции-конструкторы, получение текущей даты, разбор строк, работа с составными частями и типичные ошибки с проверкой результата.
Литерал даты — самый простой способ
Литерал даты записывается в одинарных кавычках в формате ГГГГММДДччммсс — год (4 цифры), месяц, день, затем необязательные часы, минуты и секунды. Внутри литерала нет разделителей: ни точек, ни двоеточий, ни пробелов.
ДатаОтгрузки = '20260315'; // 15.03.2026 0:00:00
МоментОплаты = '20260315143000'; // 15.03.2026 14:30:00
НачалоГода = '20260101'; // 01.01.2026 0:00:00
Допустимы и сокращённые формы: можно указать только дату без времени или дату с часами и минутами без секунд — '202603151430'. Платформа сама дополнит отсутствующие части нулями. А вот переставлять порядок (например, писать ДДММГГГГ) нельзя: литерал '15032026' вызовет ошибку, потому что месяц с номером 0320 не существует.
Литерал удобен, когда дата известна заранее и фиксирована: граница перехода на новый алгоритм, дата начала применения ставки НДС, контрольная точка в условии. Для дат, которые вычисляются или приходят извне, литерал не подходит — нужны функции.
Функция Дата() — сборка даты из чисел
Когда год, месяц и день хранятся в отдельных переменных (например, пришли из формы или внешнего файла), дату собирают функцией Дата(Год, Месяц, День, Час, Минута, Секунда). Параметры времени можно опустить.
ГодРасчета = 2026;
МесяцРасчета = 3;
ДеньРасчета = 15;
ДатаДокумента = Дата(ГодРасчета, МесяцРасчета, ДеньРасчета);
ДатаСоВременем = Дата(2026, 3, 15, 14, 30, 0);
Функция строго проверяет диапазоны: месяц от 1 до 12, день — в пределах конкретного месяца с учётом високосных лет. Вызов Дата(2026, 2, 30) завершится ошибкой, потому что 30 февраля не существует. Если день приходит из внешних данных, перед вызовом стоит проверить корректность или обернуть вызов в попытку.
Также функция Дата() умеет разбирать строковое представление, если передать её одним параметром, но для этого надёжнее использовать явную проверку через ОписаниеТипов — об этом ниже.
Текущая дата: ТекущаяДата() и ТекущаяДатаСеанса()
Для получения текущего момента есть две функции, и выбор между ними принципиален. ТекущаяДата() на клиенте возвращает время компьютера пользователя, на сервере — время сервера. ТекущаяДатаСеанса() всегда возвращает время сервера с учётом часового пояса сеанса, и именно её рекомендуется использовать в серверном коде: документы, проведение, записи в регистры.
// В серверных процедурах и модулях объектов:
Объект.Дата = ТекущаяДатаСеанса();
// На клиенте, для отображения пользователю:
Сообщить("Сейчас: " + ТекущаяДата());
Опасность ТекущаяДата() на клиенте в том, что часы на рабочем месте пользователя могут быть сбиты или стоять в другом часовом поясе. Документ, записанный с клиентской датой, может «провалиться» в прошлый период или оказаться в будущем относительно сервера, что ломает последовательность проведения и отчёты.
Для получения только календарного дня без времени применяют функцию НачалоДня():
Сегодня = НачалоДня(ТекущаяДатаСеанса()); // время обнулено до 00:00:00
Преобразование строки в дату
Строки вида «15.03.2026» или «2026-03-15» приходят из файлов обмена, веб-сервисов и пользовательского ввода. Надёжный способ преобразования — попытка приведения через ОписаниеТипов:
ОписаниеДаты = Новый ОписаниеТипов("Дата");
Результат = ОписаниеДаты.ПривестиЗначение("15.03.2026");
Если Результат = Дата(1, 1, 1) Тогда
// строка не распознана, получена пустая дата
КонецЕсли;
Признак неудачи — получение пустой даты Дата(1,1,1) (01.01.0001). Именно так и проверяют результат: если после приведения значение равно пустой дате, а исходная строка не была пустой, значит формат не распознан. Учтите, что порядок «день-месяц-год» при разборе строки зависит от региональных настроек, поэтому для машинных форматов (ISO 8601, XML) лучше использовать специализированные функции, например XMLЗначение(Тип("Дата"), СтрокаISO).
Разбор даты вручную через СтрРазделить
Когда формат строки известен точно, надёжнее разобрать её самостоятельно и собрать дату функцией Дата():
Части = СтрРазделить("15.03.2026", ".");
Если Части.Количество() = 3 Тогда
ДатаИзСтроки = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
КонецЕсли;
Такой подход устойчив к региональным настройкам: вы сами контролируете, какая часть строки является днём, а какая — месяцем.
Работа с частями даты и сдвиг дат
Из готовой даты извлекают составные части функциями Год(), Месяц(), День(), Час(), Минута(), Секунда(). Для сдвига даты на заданный интервал есть ДобавитьМесяц(Дата, КоличествоМесяцев) и простое арифметическое сложение с секундами:
Завтра = ТекущаяДатаСеанса() + 86400; // +1 день в секундах
ЧерезНеделю = ТекущаяДатаСеанса() + 7 * 86400;
ЧерезМесяц = ДобавитьМесяц(ТекущаяДатаСеанса(), 1);
КонецПериода = КонецДня(ДатаОтчета); // 23:59:59
НачалоКвартала = НачалоКвартала(ДатаОтчета);
Сложение в секундах корректно работает для дней, часов и минут, но не для месяцев и лет — у них переменная длительность. Для месяцев всегда используйте ДобавитьМесяц(): она корректно обрабатывает переходы, например 31 января плюс один месяц даст последний день февраля, а не несуществующее 31 февраля.
Семейство функций НачалоДня(), КонецДня(), НачалоНедели(), НачалоМесяца(), КонецМесяца(), НачалоКвартала(), НачалоГода() и их «конечные» пары особенно полезно при формировании периодов отчётов и отборов в запросах.
Дата в запросах и параметрах
В тексте запроса дату передают через параметр, а не конкатенацией строк. Прямая подстановка даты в текст запроса через строковое представление — грубая ошибка: формат зависит от настроек, и запрос ломается.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));
Обратите внимание на пару НачалоДня()/КонецДня() в параметрах: условие «МЕЖДУ» включает границы, и если передать просто дату окончания с нулевым временем, все документы за последний день после 00:00:00 выпадут из выборки. Это классическая причина «в отчёте не хватает документов за последний день».
В тексте запроса также доступны литералы вида ДАТАВРЕМЯ(2026, 3, 15, 0, 0, 0) — они удобны для жёстко заданных границ прямо в запросе.
Как проверить результат
В отладчике тип «Дата», значение совпадает с ожидаемым
Тип «Строка» или значение 01.01.0001 — дата не задалась
В выборку попадают все документы последнего дня
Документы последнего дня пропадают — граница задана без КонецДня()
Совпадает с датой сервера
Дата «прыгает» между клиентами — используется клиентская ТекущаяДата()
Форматирование даты для вывода
Когда дату нужно показать пользователю или выгрузить в файл, её превращают в строку функцией Формат(). Без неё платформа выведет дату в формате по умолчанию, который зависит от региональных настроек информационной базы.
Формат(ДатаДокумента, "ДЛФ=D"); // 15.03.2026
Формат(ДатаДокумента, "ДЛФ=DD"); // 15 марта 2026 г.
Формат(ДатаДокумента, "ДФ=yyyy-MM-dd"); // 2026-03-15 (для обмена)
Формат(ДатаДокумента, "ДФ='yyyy-MM-dd HH:mm:ss'");
Для машинных форматов (обмен с сайтами, API, выгрузка в CSV) всегда задавайте шаблон явно через параметр ДФ — тогда строка будет одинаковой независимо от настроек сервера. Помните и обратную сторону: результат Формат() — это строка, сравнивать и складывать её как дату нельзя.
Удобный приём при отладке: выводите дату через Формат(Значение, "ДФ='yyyy-MM-dd HH:mm:ss'") в сообщениях и журнале. Так сразу видно и календарный день, и скрытую составляющую времени, которая часто становится причиной «неработающих» сравнений.
Частые вопросы
Как задать пустую дату в коде?
Пустая дата — это Дата(1, 1, 1), то есть 01.01.0001 00:00:00. Её же даёт литерал '00010101'. Проверка на пустоту выполняется сравнением: Если МояДата = Дата(1,1,1) Тогда ... либо через ЗначениеЗаполнено(МояДата), которое для пустой даты вернёт Ложь.
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время того компьютера, где выполняется код — на клиенте это часы рабочего места пользователя. ТекущаяДатаСеанса() всегда берёт время сервера с учётом часового пояса сеанса. Для записи данных в базу используйте второй вариант, иначе документы разных пользователей получат несогласованные даты.
Как сравнить две даты только по календарному дню?
Приведите обе к началу дня: Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда ... Без этого сравнение учитывает время, и две даты одного дня с разным временем окажутся неравны.
Почему литерал '15032026' вызывает ошибку?
Формат литерала — строго ГГГГММДДччммсс. Строка '15032026' читается как год 1503, месяц 20, что невозможно. Правильная запись для 15 марта 2026 года — '20260315'.
Как прибавить к дате один рабочий день с учётом календаря?
Встроенной функции «прибавить рабочий день» нет. Нужно использовать регистр сведений с производственным календарём (в типовых конфигурациях — «РегламентированныйПроизводственныйКалендарь» или аналог): в цикле сдвигать дату на сутки и проверять, является ли день рабочим по данным календаря.
Как получить дату из строки формата ISO 8601 (2026-03-15T14:30:00)?
Используйте XMLЗначение(Тип("Дата"), "2026-03-15T14:30:00") — эта функция корректно разбирает формат XML/ISO. Самостоятельный разбор через СтрРазделить тоже возможен, но требует отдельной обработки части со временем.
Что важно запомнить
Дата в 1С — отдельный тип со временем до секунды. Фиксированные даты задавайте литералом 'ГГГГММДДччммсс', вычисляемые — функцией Дата(), текущий момент на сервере — ТекущаяДатаСеанса(). При сравнениях обнуляйте время через НачалоДня(), границы периодов в запросах задавайте парой НачалоДня()/КонецДня(), а месяцы прибавляйте только через ДобавитьМесяц().