Разработка и Конфигурация · 10 мин
1С: как получить значение даты
Как получить значение даты в 1С: ТекущаяДата(), Дата(), Формат(), НачалоДня, извлечение даты из строки и реквизитов. Примеры кода на встроенном языке 1С.
Работа с датами — одна из самых частых задач при разработке и доработке конфигураций 1С. Дата нужна при записи документов, формировании отчётов, отборах в запросах, проверке периодов и сравнении сроков. Во встроенном языке 1С для этого есть тип «Дата» и набор функций, которые позволяют получить текущую дату, создать дату из компонентов, извлечь её из строки или реквизита объекта.
Ошибки с датами приводят к серьёзным последствиям: документ проводится не в том периоде, отчёт показывает неверные остатки, обмен данными отбраковывает записи. Поэтому важно понимать, как именно получить значение даты в каждой ситуации — в модуле формы, в запросе, при обработке строки из файла или при работе с реквизитом справочника.
Материал ориентирован на тех, кто работает со встроенным языком 1С:Предприятие 8.3: разработчиков, внедренцев и продвинутых пользователей, которые пишут обработки или дорабатывают типовые механизмы.
Тип «Дата» в 1С и как он устроен
Тип «Дата» в 1С хранит одновременно дату и время с точностью до секунды. Даже если вы задаёте только день, внутри значения присутствует время — по умолчанию 00:00:00 (начало дня). Это важно учитывать при сравнениях: дата документа 15.01.2026 14:30:25 не равна дате 15.01.2026 00:00:00, хотя календарный день один и тот же.
Пустое (незаполненное) значение даты — это 01.01.0001 00:00:00. Проверить, заполнена ли дата, можно функцией ЗначениеЗаполнено(Дата) или сравнением с пустой датой '00010101'. Игнорирование пустых дат — частая причина ошибок в отчётах: пустая дата попадает в отбор «меньше или равно» и искажает результат.
Как получить текущую дату
Для получения текущей даты есть две функции, и выбор между ними имеет значение. ТекущаяДата() возвращает дату и время компьютера, на котором выполняется код: на клиенте — время рабочей станции пользователя, на сервере — время сервера. ТекущаяДатаСеанса() возвращает дату сеанса с учётом часового пояса, установленного для информационной базы или пользователя.
В серверных процедурах и при записи данных в базу правильнее использовать ТекущаяДатаСеанса(): тогда все пользователи из разных часовых поясов получат единообразное время. ТекущаяДата() на клиенте подходит только для интерфейсных задач — например, подставить дату в поле формы по умолчанию.
// На клиенте — для подстановки в поле формы
ДатаДокумента = ТекущаяДата();
// На сервере — для записи в базу
ДатаЗаписи = ТекущаяДатаСеанса();
Как создать произвольную дату
Произвольную дату создают функцией Дата() с числовыми параметрами: год, месяц, день и при необходимости часы, минуты, секунды. Например, Дата(2026, 1, 15) вернёт 15.01.2026 00:00:00, а Дата(2026, 1, 15, 23, 59, 59) — конец того же дня.
Альтернатива — литерал даты в одинарных кавычках: '20260115' или '20260115235959'. Формат литерала — ГГГГММДДччммсс, время можно опустить. Литералы удобны для констант в коде, функция Дата() — когда компоненты вычисляются динамически.
НачалоПериода = Дата(2026, 1, 1);
КонецПериода = Дата(2026, 12, 31, 23, 59, 59);
ДатаЛитералом = '20260315'; // 15.03.2026 00:00:00
Для получения границ периода от существующей даты применяйте функции НачалоДня(), КонецДня(), НачалоМесяца(), КонецМесяца(), НачалоГода(), КонецГода(), а также аналоги для недели, квартала, часа и минуты. Это избавляет от ручного вычисления последнего дня месяца с учётом високосных лет.
НачалоМес = НачалоМесяца(ТекущаяДатаСеанса());
КонецМес = КонецМесяца(ТекущаяДатаСеанса());
НачалоТекДня = НачалоДня(ТекущаяДатаСеанса());Как получить дату из строки
Строка вида «15.01.2026» не преобразуется в дату автоматически — прямое присваивание даст строку, а не значение типа «Дата». Самый надёжный способ — разобрать строку на компоненты и собрать дату функцией Дата().
СтрокаДаты = "15.01.2026";
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() = 3 Тогда
Результат = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
КонецЕсли;
Если строка в формате ГГГГММДД (например, из файла обмена «20260115»), её можно передать в функцию Дата() как литерал через код: Дата('20260115') — но только если значение записано литералом в коде. Для переменной строки такой приём не сработает напрямую; используйте извлечение подстрок функцией Сред() и сборку через Дата().
При загрузке дат из внешних файлов (CSV, Excel, XML) всегда проверяйте результат преобразования: некорректные значения вроде «32.13.2026» вызовут ошибку выполнения. Оборачивайте преобразование в попытку/исключение и протоколируйте пропущенные строки, чтобы не потерять данные молча.
Как получить дату из реквизита объекта
Дата документа хранится в стандартном реквизите Дата, даты в справочниках и регистрах — в пользовательских реквизитах типа «Дата». Обращение к ним выполняется через точку от ссылки или объекта. При работе со ссылкой платформа неявно выполняет запрос к базе, поэтому в циклах по большому числу ссылок лучше выбирать даты одним запросом.
// Обращение через ссылку
ДатаДок = ДокументСсылка.Дата;
// Через запрос — эффективнее для списков
Запрос = Новый Запрос(
"ВЫБРАТЬ РеализацияТоваровУслуг.Дата КАК Дата
|ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ РеализацияТоваровУслуг.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДатаДок = Выборка.Дата;
КонецЕсли;
В языке запросов дату можно получить и вычислить: функция ДАТАВРЕМЯ(2026, 1, 15) создаёт дату, а НАЧАЛОПЕРИОДА(Таблица.Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(Таблица.Дата, ДЕНЬ) отсекают время. Для передачи даты параметром используйте Запрос.УстановитьПараметр("Период", ДатаЗначение) — не вставляйте дату конкатенацией в текст запроса.
Как извлечь части даты и отформатировать её
Отдельные компоненты даты возвращают функции Год(), Месяц(), День(), Час(), Минута(), Секунда(), а также ДеньНедели(), ДеньГода(), НеделяГода(). Все они принимают значение типа «Дата» и возвращают число.
Для представления даты пользователю применяется функция Формат() со строкой формата. Примеры: Формат(ДатаЗначение, "ДЛФ=D") — «15.01.2026», Формат(ДатаЗначение, "ДЛФ=DD") — «15 января 2026 г.», Формат(ДатаЗначение, "ДФ='yyyy-MM-dd'") — «2026-01-15» для обмена с внешними системами.
ГодДокумента = Год(ДатаДок); // 2026
НомерМесяца = Месяц(ДатаДок); // 1
СтрокаДляПечати = Формат(ДатаДок, "ДЛФ=DD");
СтрокаДляОбмена = Формат(ДатаДок, "ДФ='yyyy-MM-dd HH:mm:ss'");
Для арифметики с датами используйте ДобавитьМесяц(ДатаЗначение, 3) для сдвига по месяцам и простое сложение в секундах для дней: ДатаЗначение + 7 24 60 * 60 прибавит неделю. Помните, что вычитание двух дат даёт разность в секундах, а не в днях.
Как проверить результат
ТипЗнч(Значение) возвращает «Дата»
Тип остался «Строка» — сравнения и отборы будут работать неправильно
Документ виден в отчёте за свой период
Документ за последний день периода пропал — вероятно, не учтено время
ЗначениеЗаполнено() возвращает Ложь для пустого реквизита
Пустая дата прошла в запрос и исказила итоги
Выбор способа в зависимости от задачи
Единого «правильного» способа получить дату нет — выбор зависит от контекста. Для подстановки в поле формы достаточно ТекущаяДата(), для записи в базу — ТекущаяДатаСеанса(), для констант в коде — литералов, для разбора внешних данных — сборки через Дата() с проверками.
Как выбрать действие
Что важно запомнить
Текущую дату получают через ТекущаяДата() или ТекущаяДатаСеанса(), произвольную — через Дата() или литерал. Тип «Дата» всегда содержит время, поэтому при сравнениях используйте НачалоДня() и КонецДня(). Строки преобразуют в дату только явным разбором с проверкой, пустые даты контролируют через ЗначениеЗаполнено().
Частые вопросы
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время того компьютера, где выполняется код, а ТекущаяДатаСеанса() — время с учётом часового пояса сеанса и сервера. Для записи данных в базу и в многочасовых внедрениях корректнее ТекущаяДатаСеанса().
Как проверить, что дата пустая?
Используйте функцию ЗначениеЗаполнено(Дата) — она вернёт Ложь для пустой даты. Альтернатива — сравнение с литералом '00010101'. В запросах применяйте условие Дата = ДАТАВРЕМЯ(1,1,1).
Как получить только дату без времени?
Примените функцию НачалоДня(ДатаЗначение) — она обнуляет время до 00:00:00. В запросах аналог — НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Для вывода пользователю без изменения значения используйте Формат() с шаблоном без времени.
Как прибавить к дате несколько дней или месяцев?
Дни прибавляют в секундах: Дата + N * 86400. Для месяцев используйте ДобавитьМесяц(Дата, N) — функция корректно обрабатывает переход через год и разную длину месяцев, чего ручное сложение не гарантирует.
Почему документ не попадает в отчёт за последний день периода?
Чаще всего потому, что дата документа содержит время, а граница периода задана как начало дня. Передавайте в отбор КонецДня(ДатаОкончания) или используйте параметр «Период» виртуальных таблиц, который включает весь указанный момент.
Как преобразовать дату в строку формата «ГГГГ-ММ-ДД» для обмена?
Используйте Формат(ДатаЗначение, "ДФ='yyyy-MM-dd'"). Для даты со временем добавьте в шаблон « HH:mm:ss». Обратное преобразование выполняйте разбором строки через Сред() и сборкой функцией Дата().