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

Разработка и Конфигурация · 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

Для получения границ периода от существующей даты применяйте функции НачалоДня(), КонецДня(), НачалоМесяца(), КонецМесяца(), НачалоГода(), КонецГода(), а также аналоги для недели, квартала, часа и минуты. Это избавляет от ручного вычисления последнего дня месяца с учётом високосных лет.

bsl
НачалоМес = НачалоМесяца(ТекущаяДатаСеанса());
КонецМес = КонецМесяца(ТекущаяДатаСеанса());
НачалоТекДня = НачалоДня(ТекущаяДатаСеанса());

Как получить дату из строки

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

СтрокаДаты = "15.01.2026";

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

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

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

КонецЕсли;

Если строка в формате ГГГГММДД (например, из файла обмена «20260115»), её можно передать в функцию Дата() как литерал через код: Дата('20260115') — но только если значение записано литералом в коде. Для переменной строки такой приём не сработает напрямую; используйте извлечение подстрок функцией Сред() и сборку через Дата().

При загрузке дат из внешних файлов (CSV, Excel, XML) всегда проверяйте результат преобразования: некорректные значения вроде «32.13.2026» вызовут ошибку выполнения. Оборачивайте преобразование в попытку/исключение и протоколируйте пропущенные строки, чтобы не потерять данные молча.

Типичные ошибки
01
Присваивание строки '15.01.2026' переменной и ожидание типа «Дата» — значение остаётся строкой, сравнения и отборы работают неверно
02
Преобразование без проверки формата: строка '01/02/2026' может означать и 1 февраля, и 2 января в зависимости от источника
03
Отсутствие обработки исключений при разборе файла — одна битая строка прерывает всю загрузку

Как получить дату из реквизита объекта

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

// Обращение через ссылку

ДатаДок = ДокументСсылка.Дата;

// Через запрос — эффективнее для списков

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

"ВЫБРАТЬ РеализацияТоваровУслуг.Дата КАК Дата

|ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ РеализацияТоваровУслуг.Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ДатаДок = Выборка.Дата;

КонецЕсли;

В языке запросов дату можно получить и вычислить: функция ДАТАВРЕМЯ(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». Обратное преобразование выполняйте разбором строки через Сред() и сборкой функцией Дата().