Разработка и Конфигурация · 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» или пустое значение, код без обработки завершится ошибкой и прервёт обмен.
Попытка
ДатаИзСтроки = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
Исключение
ДатаИзСтроки = '00010101'; // пустая дата при ошибке разбора
КонецПопытки;Даты в запросах 1С
В языке запросов дата передаётся параметром — это самый надёжный способ. Прямое встраивание даты в текст запроса возможно через литерал вида ДАТАВРЕМЯ(2026, 1, 15), но параметры предпочтительнее: запрос остаётся читаемым, а план запроса не перестраивается под каждое значение.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(Дата1));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(Дата2));
В запросах доступны функции для работы с датой: ГОД(), МЕСЯЦ(), ДЕНЬ(), НАЧАЛОПЕРИОДА(Дата, ДЕНЬ), КОНЕЦПЕРИОДА(Дата, МЕСЯЦ), ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 7). Они выполняются на стороне СУБД и не требуют выгрузки данных в код.
Отдельный нюанс — виртуальные таблицы регистров. В параметрах Остатки или Обороты граница периода также задаётся датой, и забытый КонецДня() здесь приводит к тем же потерянным документам за последний день.
Работа с датой на форме и в полях ввода
Пользователь вводит дату в поле ввода формы в привычном виде — «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С пишется литералом 'ГГГГММДД' в апострофах, текущая дата берётся через ТекущаяДатаСеанса(), вывод форматируется функцией Формат(), а в запросах даты передаются параметрами. Помните про скрытое время в датах и проверяйте пустые значения перед выводом.