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

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

Как перевести дату в 1С: способы преобразования и примеры

Как перевести дату в 1С: преобразование строки в дату и обратно, функции Дата(), Формат(), работа с датами в запросах и типовые ошибки с примерами кода.

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

Под «переводом даты» обычно понимают три операции: преобразование строки в дату, преобразование даты в строку нужного формата и изменение состава даты (отсечь время, получить начало дня, прибавить период). Ниже разобраны все три сценария с примерами кода на встроенном языке, работой в запросах и типичными ошибками.

Как устроен тип «Дата» в 1С

Тип «Дата» в 1С всегда содержит и календарную дату, и время с точностью до секунды. Отдельного типа «только дата без времени» в платформе нет: если время не задано, оно равно 00:00:00. Это важно учитывать при сравнениях — дата документа «10.03.2026 14:30:00» не равна дате «10.03.2026 00:00:00», хотя календарный день один и тот же.

Пустая дата — это значение '00010101000000' (1 января 0001 года). Именно с ним сравнивают реквизиты, чтобы проверить, заполнена ли дата: Если Док.ДатаОплаты = '00010101' Тогда .... Проверка на пустую строку или Неопределено здесь не сработает.

Внутри базы дата хранится в формате, не зависящем от региональных настроек, поэтому перенос данных между базами с разными настройками Windows сам по себе даты не портит. Проблемы возникают только на этапе преобразования из строки или в строку.

Как перевести строку в дату

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

ДатаОплаты = Дата("20260310");        // 10.03.2026 00:00:00

ДатаВремя = Дата("20260310143000"); // 10.03.2026 14:30:00

// или через числовые параметры:

ДатаОплаты = Дата(2026, 3, 10); // год, месяц, день

Если исходная строка пришла из файла в виде «10.03.2026» или «2026-03-10», её сначала разбирают вручную: выделяют подстроки функциями Лев(), Сред(), Прав() или разбивают через СтрРазделить(), а затем собирают дату из чисел. Универсального «умного» парсера произвольного формата во встроенном языке нет.

При загрузке из CSV и Excel всегда проверяйте результат преобразования: если разделители или порядок дня и месяца в файле отличаются от ожидаемых, вы либо получите ошибку выполнения, либо — что хуже — молча неверную дату, где день и месяц перепутаны местами.

Перевод строки вида «ДД.ММ.ГГГГ» в дату
  1. 1
    Разбейте строку функцией СтрРазделить(Строка, ".") — получите массив из дня, месяца и года
  2. 2
    Проверьте, что массив содержит три элемента и все они числовые
  3. 3
    Соберите дату: Дата(Число(Год), Число(Месяц), Число(День))
  4. 4
    Проверьте результат: выведите его через Формат() и сравните с исходной строкой

Как перевести дату в строку нужного формата

Для вывода даты пользователю, в печатную форму или в файл обмена используется функция Формат() с форматной строкой:

Строка1 = Формат(ТекущаяДатаСеанса(), "ДЛФ=D");      // 10.03.2026

Строка2 = Формат(ТекущаяДатаСеанса(), "ДЛФ=DD"); // 10 марта 2026 г.

Строка3 = Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd"); // 2026-03-10

Строка4 = Формат(ТекущаяДатаСеанса(), "ДФ='yyyyMMddHHmmss'"); // для обмена

Разница между параметрами принципиальна: ДЛФ (локальный формат даты) подстраивается под региональные настройки и удобен для интерфейса, а ДФ (формат даты) задаёт шаблон жёстко и используется для файлов обмена, где формат должен быть стабильным независимо от настроек компьютера.

Для выгрузки в XML и JSON часто требуется формат ISO 8601 (yyyy-MM-ddTHH:mm:ss). Его собирают через Формат() с явным шаблоном либо используют средства сериализации платформы (XDTO, ЗаписьJSON), которые форматируют даты автоматически.

Как отсечь время и сдвинуть дату

Частая задача — привести дату к началу или концу периода. Для этого есть готовые функции:

  • НачалоДня(Дата) — 00:00:00 того же дня;
  • КонецДня(Дата) — 23:59:59;
  • НачалоМесяца(), КонецМесяца(), НачалоКвартала(), НачалоГода() — аналогично для периодов;
  • ДобавитьМесяц(Дата, 3) — сдвиг на месяцы с корректной обработкой конца месяца.

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

Типовой приём для отбора документов за день: задать границы от НачалоДня(Дата) до КонецДня(Дата). Если сравнивать просто «ДатаДокумента = ВыбраннаяДата», документы с ненулевым временем в выборку не попадут.

Типичные ошибки
01
Сравнение дат на равенство без отсечения времени — документы за день теряются из выборки; используйте диапазон НачалоДня–КонецДня
02
Передача строки «10.03.2026» напрямую в параметр типа Дата — получаете ошибку преобразования или пустое значение
03
Арифметика месяцами через секунды (30 * 86400) — сдвиг «плывёт» из-за разной длины месяцев; используйте ДобавитьМесяц()
04
Проверка даты на пустоту через ПустаяСтрока() — функция не работает с типом Дата; сравнивайте с '00010101'

Как работать с датами в запросах

В языке запросов свои функции для дат. Литерал даты задаётся через ДАТАВРЕМЯ(2026, 3, 10), а приведение к границам периода — через НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(Дата, ДЕНЬ):

ВЫБРАТЬ

Реализация.Ссылка

ИЗ

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

ГДЕ

Реализация.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)

И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)

Для преобразования даты в строку прямо в запросе штатной функции нет — строковое представление формируют уже в коде после получения результата. Если строковый формат нужен для группировки (например, по месяцам), используют НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) и группируют по полученному значению.

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

bsl
// Преобразование даты в запросе и обратно в коде
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) КАК НачалоМесяца";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
СтрокаДляФайла = Формат(Выборка.НачалоМесяца, "ДФ=yyyy-MM-dd");

Как перевести дату при обмене данными

При выгрузке в универсальные форматы даты сериализуются автоматически: в XML — как dateTime в формате ISO, в JSON — строкой в согласованном формате. Ручное преобразование нужно только при нестандартных форматах обмена, например при интеграции с сайтом, принимающим дату в виде «dd/mm/yyyy».

При загрузке из внешних источников всегда фиксируйте ожидаемый формат в коде и пишите разбор строки с проверкой. Если источник присылает Unix-время (число секунд от 01.01.1970), перевод выполняется сложением: Дата = Дата(1970,1,1) + ЧислоИзИсточника, с учётом часового пояса, если время в UTC.

Особое внимание — часовым поясам. ТекущаяДатаСеанса() возвращает дату сеанса с учётом пояса, а ТекущаяУниверсальнаяДата() — время в UTC. При обмене между системами в разных поясах договоритесь, в каком времени передаются даты, иначе документы «уедут» на соседние сутки.

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

После любого преобразования выведите значение в явном формате и сверьте с источником: Сообщить(Формат(Результат, "ДЛФ=DDT")). Это сразу покажет и дату, и время, и вы увидите, не потерялись ли часы и минуты.

Для загрузок из файлов добавьте контрольные суммы: посчитайте количество успешно преобразованных строк и количество ошибок, запишите проблемные строки в протокол. Молчаливый пропуск ошибочных значений приводит к документам с пустыми датами, которые потом сложно найти.

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

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

Вывод даты после преобразования
Норма

День, месяц и год совпадают с исходной строкой

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

День и месяц переставлены или дата пустая (01.01.0001)

Время в преобразованной дате
Норма

Время соответствует ожиданию (00:00:00, если не задано)

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

Время обрезано или добавлено неожиданное смещение по часовому поясу

Отбор документов за период
Норма

В выборку попали все документы за нужный день

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

Документы с ненулевым временем отсутствуют — значит, сравнение идёт без НачалоДня/КонецДня

Частые вопросы

Как получить текущую дату без времени?

Используйте НачалоДня(ТекущаяДатаСеанса()) — время будет сброшено в 00:00:00. Само значение останется типом «Дата», поскольку отдельного типа без времени в платформе нет.

Почему Дата("10.03.2026") выдаёт ошибку?

Функция Дата() со строковым параметром принимает только формат ГГГГММДДччммсс без разделителей: Дата("20260310"). Строку с точками нужно сначала разобрать вручную через СтрРазделить() и собрать дату из чисел.

Как сравнить две даты только по дню, игнорируя время?

Сравните НачалоДня(Дата1) = НачалоДня(Дата2). В запросе аналогично: НАЧАЛОПЕРИОДА(Дата1, ДЕНЬ) = НАЧАЛОПЕРИОДА(Дата2, ДЕНЬ).

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

Функцией ДобавитьМесяц(Дата, 1). Она корректно обрабатывает конец месяца: ДобавитьМесяц от 31 января даст последний день февраля, а не несуществующую дату.

Как перевести дату в строку для имени файла?

Используйте Формат(Дата, "ДФ=yyyyMMdd_HHmmss") — получится строка вида 20260310_143000 без запрещённых в именах файлов символов. Шаблон ДФ гарантирует одинаковый результат на любом компьютере.

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

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

Итог

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

Строку в дату переводят через Дата("ГГГГММДД") или сборку из чисел, дату в строку — через Формат() с шаблоном ДФ или ДЛФ. Для отбора за период используйте НачалоДня/КонецДня, для сдвига месяцев — ДобавитьМесяц(), а результат любого преобразования проверяйте выводом в явном формате.