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

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

Как программно задать дату в 1С

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

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

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

Ниже разобраны основные приёмы с примерами кода, особенности работы с датой и временем, типичные ошибки и способы проверки результата. Материал применим к платформе 1С:Предприятие 8.x как в обычных, так и в управляемых формах.

Конструктор Дата() — основной способ задать дату в коде

Функция Дата() создаёт значение типа «Дата» из числовых параметров. Полный синтаксис: Дата(Год, Месяц, День, Час, Минута, Секунда). Обязательны первые три параметра, время можно опустить — тогда оно будет равно 00:00:00.

// Только дата, время 00:00:00

НоваяДата = Дата(2026, 3, 15);

// Дата со временем

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

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

ДокументОбъект.Дата = Дата(2026, 3, 15, 10, 0, 0);

Частая ошибка — перепутать порядок аргументов и написать сначала день, потом месяц, по привычке к российскому формату записи «15.03.2026». В конструкторе порядок строго «год, месяц, день», как в стандарте ISO. Передача Дата(15, 3, 2026) приведёт либо к ошибке, либо к дате 15 года нашей эры — в зависимости от контекста.

Если передать некорректные значения (месяц 13, день 32), платформа вызовет исключение. Поэтому при формировании даты из пользовательского ввода или внешних данных стоит проверять диапазоны до вызова конструктора или оборачивать код в попытку-исключение.

Литерал даты и преобразование из строки

Во встроенном языке есть литерал даты — последовательность цифр в одинарных кавычках в формате ГГГГММДД, опционально с часами, минутами и секундами. Это самый компактный способ зафиксировать конкретную дату прямо в коде.

// Литералы даты

ДатаОтчета = '20260315'; // 15.03.2026 00:00:00

ДатаВремя = '20260315143000'; // 15.03.2026 14:30:00

Литерал удобен для константных значений, но не подходит, когда дата приходит извне в виде строки «15.03.2026». Прямое преобразование Дата("15.03.2026") не сработает — конструктор ожидает числа. Для разбора строки нужно вручную извлечь части через СтрРазделить() или использовать XMLЗначение(Тип("Дата"), Строка), если строка в формате XML (ГГГГ-ММ-ДД).

// Разбор строки вида "15.03.2026"

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

Если Части.Количество() = 3 Тогда

Результат = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

КонецЕсли;

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

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

// На клиенте — время компьютера пользователя

Сообщить(ТекущаяДата());

// Унифицированное время сеанса — рекомендуется для записи в базу

ДокументОбъект.Дата = ТекущаяДатаСеанса();

Для реквизитов, записываемых в базу (даты документов, регистров), корректнее использовать ТекущаяДатаСеанса(): иначе пользователи из разных часовых поясов или с неверно настроенными часами создадут документы с разъезжающимися датами, что нарушит последовательность проведения и отчётность.

Для вычисления даты относительно текущей (например, «минус месяц») применяется функция ДобавитьМесяц(Дата, -1). Обычным вычитанием секунд месяц корректно не отнять — месяцы имеют разную длину.

Вчера       = ТекущаяДатаСеанса() - 86400;      // минус сутки в секундах

МесяцНазад = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);

НачалоДня = НачалоДня(ТекущаяДатаСеанса()); // 00:00:00 сегодня

КонецДня = КонецДня(ТекущаяДатаСеанса()); // 23:59:59 сегодня

Как задать дату в реквизите документа, справочника и на форме

Присвоение даты реквизиту объекта выполняется обычным присваиванием — важно лишь, чтобы справа стояло значение именно типа «Дата», а не строка. Строка «15.03.2026» при записи вызовет ошибку преобразования типов.

// Создание документа с заданной датой

НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДок.Дата = Дата(2026, 3, 15, 12, 0, 0);

НовыйДок.Записать();

На управляемой форме реквизит типа «Дата» связывается с полем ввода автоматически. Если нужно установить значение программно при открытии, делайте это в обработчике ПриСозданииНаСервере — там доступны и данные объекта, и серверные функции.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Объект.Ссылка.Пустая() Тогда

Объект.ДатаНачала = НачалоДня(ТекущаяДатаСеанса());

Объект.ДатаОкончания = КонецДня(ТекущаяДатаСеанса());

КонецЕсли;

КонецПроцедуры

Порядок действий
  1. 1
    Определите, откуда берётся дата: константа, пользовательский ввод, текущий момент или внешние данные
  2. 2
    Выберите способ: Дата(год, месяц, день) для константы, ТекущаяДатаСеанса() для текущего момента, разбор строки для внешних данных
  3. 3
    Присвойте значение типа «Дата» нужному реквизиту объекта или переменной
  4. 4
    Проверьте результат через Сообщить(Формат(Дата, "ДЛФ=DT")) или в отладчике
  5. 5
    Для документов убедитесь, что дата попадает в открытый период и документ проводится

Дата в запросах

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг

|ГДЕ Дата МЕЖДУ &Начало И &Конец";

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

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

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

Значение типа «Дата» хранится внутренне и при выводе преобразуется в строку по региональным настройкам. Для явного контроля представления используется функция Формат() с параметром форматной строки.

Формат(ДатаЗначение, "ДЛФ=D");        // 15.03.2026

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

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

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

Для обмена данными с внешними системами (веб-сервисы, JSON, XML) используйте формат yyyy-MM-dd или yyyy-MM-ddTHH:mm:ss — это стандарт ISO, который однозначно разбирается на приёмной стороне. Российский формат «дд.мм.гггг» при интеграциях регулярно становится источником ошибок из-за неоднозначности дня и месяца.

Типичные ошибки при работе с датами

Большинство проблем с датами связано не со сложностью языка, а с неочевидными деталями: типами, порядком аргументов и часовыми поясами. Ниже — ошибки, которые встречаются чаще всего.

Типичные ошибки
01
Перепутан порядок аргументов Дата(день, месяц, год) вместо Дата(год, месяц, день) — получается неверная дата или исключение
02
Присвоение строки "15.03.2026" реквизиту типа «Дата» — ошибка преобразования типов при записи объекта
03
Использование ТекущаяДата() на клиенте для записи в базу — документы пользователей из разных часовых поясов получают разнобой во времени
04
Сравнение дат с вычитанием месяца через секунды — 30 дней не равны месяцу, используйте ДобавитьМесяц()
05
Проверка заполненности даты сравнением с пустой строкой вместо Дата(1,1,1) — условие никогда не срабатывает
06
Фильтрация запросом по дате без КонецДня() — документы за последний день периода после 00:00:00 выпадают из выборки

Отдельного внимания заслуживает граница периода в запросах. Если задать конец периода как Дата(2026, 3, 31), это будет 31 марта 00:00:00 — все документы за этот день позже полуночи не попадут в выборку. Всегда оборачивайте верхнюю границу в КонецДня() или используйте КонецПериода() в запросе.

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

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

Тип значения после присвоения
Норма

ТипЗнч(Переменная) возвращает тип «Дата»

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

Значение осталось строкой — будет ошибка при записи

Вывод через Сообщить(Формат(Дата, "ДЛФ=DT"))
Норма

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

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

Месяц и день переставлены или время 00:00:00 вместо нужного

Записанный документ в списке
Норма

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

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

Ошибка «Дата вне периода» или дата смещена на часовой пояс

FAQ

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

Вызовите конструктор с тремя аргументами: Дата(2026, 3, 15) — время автоматически станет 00:00:00. Если нужно отсечь время у существующего значения с часами и минутами, примените функцию НачалоДня(ЗначениеДаты).

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

Используйте ДобавитьМесяц(Дата, КоличествоМесяцев) — функция корректно обрабатывает переход через год и разную длину месяцев. Для дней допустимо арифметическое сложение в секундах: Дата + 7 * 86400 прибавит неделю.

Почему при записи документа дата смещается на несколько часов?

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

Как проверить, что дата пустая?

Пустая дата равна Дата(1, 1, 1). Сравнивайте напрямую: Если МояДата = Дата(1, 1, 1) Тогда ... — или используйте универсальную функцию ЗначениеЗаполнено(МояДата), которая для пустой даты вернёт Ложь.

Как преобразовать строку из файла в дату?

Если строка в формате ISO (2026-03-15), используйте XMLЗначение(Тип("Дата"), Строка). Для формата «15.03.2026» разбейте строку через СтрРазделить(Строка, ".") и соберите дату конструктором Дата(год, месяц, день), предварительно проверив, что получилось три числовые части.

Итог

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

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