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