Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и программисты, и обычные пользователи. Система по умолчанию хранит дату вместе со временем (2026-05-15 14:30:00), но во многих отчетах, документах или интерфейсах требуется показать только календарную дату без временной части. Например, при формировании печатной формы счета или акта выполненных работ клиенту не нужны часы и минуты — только чистая дата в формате ДД.ММ.ГГГГ.

Проблема усложняется тем, что в разных версиях платформы (1С 8.2, 1С 8.3) и конфигурациях (УТ 11, ERP 2, БП 3.0) способы решения могут отличаться. К тому же, некоторые методы работают только в тонком клиенте, другие — исключительно на сервере. В этой статье мы разберем все актуальные способы: от простых настроек формата до написания кода на встроенном языке, включая нюансы для типовых и нетиповых конфигураций.

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

1. Самый простой способ: настройка формата ячейки в отчете или документе

Если вам нужно вывести дату без времени в печатной форме, отчете или табличном документе, самый быстрый метод — изменить формат отображения прямо в настройках поля. Этот способ не требует программирования и доступен даже пользователям без прав редактирования конфигурации.

Как это сделать:

  • 📄 Откройте отчет или печатную форму, где нужно изменить формат даты.
  • 🖱️ Кликните правой кнопкой мыши по ячейке с датой и выберите Свойства (или Формат, в зависимости от версии).
  • 📅 В поле Формат введите одно из значений:
    • ДФ="d" — короткий формат (например, 15.05.2026)
    • ДФ="d MMMM yyyy" — полный формат (например, 15 мая 2026 года)
    • ДФ="dd.MM.yyyy" — фиксированный формат с ведущими нулями

Этот метод работает в большинстве типовых конфигураций (УТ 11, ERP 2, ЗУП 3.1), но имеет ограничение: он меняет только визуальное отображение, а не саму дату в базе. Если вам нужно передать "чистую" дату в другой документ или обработку, потребуются методы из следующих разделов.

📊 Какой формат даты вы чаще используете в 1С?
Короткий (ДД.ММ.ГГГГ)
Полный (15 мая 2026)
Международный (ГГГГ-ММ-ДД)
Другой

2. Функция НачалоДня(): универсальный инструмент для программистов

Для разработчиков самый надежный способ получить дату без времени — использовать встроенную функцию НачалоДня(). Она возвращает дату, у которой временная часть обнулена (установлена в 00:00:00). Этот метод работает во всех версиях платформы, включая 1С 8.2 и 1С 8.3, а также на сервере и в тонком клиенте.

Примеры применения:

// Пример 1: Получение текущей даты без времени

ТекущаяДатаБезВремени = НачалоДня(ТекущаяДата());

// Пример 2: Очистка времени у даты из документа

ДатаДокумента = НачалоДня(Документ.Дата);

// Пример 3: Использование в запросе

Запрос.Текст =

"ВЫБРАТЬ

| ДатаДокумента КАК Дата

|ИЗ

| Документ.ЗаказКлиента

|ГДЕ

| НачалоДня(ДатаДокумента) = &Дата";

Запрос.УстановитьПараметр("Дата", НачалоДня(ТекущаяДата()));

Важный нюанс: НачалоДня() не меняет тип данных — результат остается типом Дата, просто с нулевым временем. Если вам нужно преобразовать дату в строку (например, для вывода в сообщении), используйте функцию Формат():

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = Формат(НачалоДня(ТекущаяДата()), "ДФ=d");

Сообщение.Сообщить();

💡

Если вы работаете с большими выборками данных, используйте НачалоДня() прямо в запросе — это значительно ускорит выполнение по сравнению с обработкой результатов на клиенте.

3. Преобразование даты в строку с заданным форматом

Когда нужно не только убрать время, но и контролировать формат вывода (например, для экспорта в Excel или показа пользователю), удобно использовать функцию Формат(). Она позволяет гибко настраивать отображение даты, включая разделители, порядок дней/месяцев и даже локализацию.

Основные форматы:

Формат Пример вывода Описание
ДФ="d" 15.05.2026 Короткий формат (зависит от региональных настроек)
ДФ="dd.MM.yyyy" 15.05.2026 Фиксированный формат с ведущими нулями
ДФ="d MMMM yyyy" 15 мая 2026 г. Полный формат с названием месяца
ДФ="yyyy-MM-dd" 2026-05-15 Международный формат (ISO)
ДФ="d, MMMM" 15, мая День и месяц без года

Пример использования в коде:

// Для вывода в сообщении

Сообщить(Формат(ТекущаяДата(), "ДФ=""dd.MM.yyyy"""));

// Для заполнения реквизита документа

Документ.ДатаПечати = Формат(Документ.Дата, "ДФ=""d MMMM yyyy""");

// В запросе (только для отображения, не для условий!)

Запрос.Текст =

"ВЫБРАТЬ

| Формат(ДатаДокумента, ""ДФ=""dd.MM.yyyy"") КАК ДатаДляОтчета

|ИЗ

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

⚠️ Внимание: Функция Формат() возвращает строку, а не дату. Если вам нужно дальше работать с этой датой в вычислениях (например, прибавлять дни), сначала преобразуйте её обратно в тип Дата с помощью Дата(строка).

4. Работа с датами в запросах 1С: особенности и ловушки

При написании запросов к базе данных 1С:Предприятие даты с временем могут создавать неожиданные проблемы. Например, если вы ищете документы за конкретный день, но не обнуляете временную часть, запрос может вернуть пустой результат или лишние записи. Рассмотрим правильные подходы.

Проблема: Запрос вида ГДЕ ДатаДокумента = &Дата не найдет документы, созданные в этот день, потому что сравнивает дату вместе со временем (например, 15.05.2026 00:00:00 не равно 15.05.2026 14:30:00).

Решения:

  • 🔍 Используйте НачалоДня() для обеих частей сравнения:
    ГДЕ НачалоДня(ДатаДокумента) = НачалоДня(&Дата)
  • 📊 Для диапазона дат используйте конструкцию МЕЖДУ:
    ГДЕ ДатаДокумента МЕЖДУ НачалоДня(&ДатаНачала) И КонецДня(&ДатаОкончания)
  • ⏳ Для выборки по текущему дню без параметров:
    ГДЕ ДатаДокумента >= НачалоДня(ТекущаяДата())
    

    | И ДатаДокумента < НачалоДня(ТекущаяДата()) + 86400

    (86400 — количество секунд в сутках)

Особое внимание уделите запросам с группировкой по датам. Если вы группируете данные по ДатаДокумента без обнуления времени, каждая секунда будет считаться отдельной группой! Всегда используйте:

ВЫБРАТЬ

НачалоДня(ДатаДокумента) КАК ДатаБезВремени,

СУММА(СуммаДокумента) КАК Итого

ИЗ

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

СГРУППИРОВАТЬ ПО

НачалоДня(ДатаДокумента)

Что будет, если не обнулять время в группировке?

В результате группировки по полю ДатаДокумента без функции НачалоДня() каждая миллисекунда будет создавать отдельную группу. Например, два документа с датами 15.05.2026 10:00:00 и 15.05.2026 10:00:01 попадут в разные строки итогов, хотя по логике бизнес-задачи должны быть сгруппированы по дню.

5. Продвинутые методы: работа с временными зонами и UTC

В распределенных системах или при интеграции с внешними сервисами (например, через REST API или 1C:EDT) даты могут храниться в формате UTC (всемирное координированное время). В этом случае простого обнуления времени через НачалоДня() недостаточно — нужно учитывать смещение временной зоны.

Пример проблемы: если сервер находится в московской временной зоне (UTC+3), а клиент — в екатеринбургской (UTC+5), то "начало дня" для одной и той же даты будет разным. Чтобы избежать путаницы, используйте:

// Преобразование в локальное время с обнулением

ЛокальнаяДата = НачалоДня(ВремяUTCВЛокальное(ДатаUTC));

// Или наоборот: из локального во UTC

ДатаUTC = НачалоДня(ЛокальноеВремяВUTC(ТекущаяДата()));

Для работы с временными зонами в 1С 8.3.14+ доступны дополнительные функции:

  • 🌍 ВремяUTCВЛокальное() — преобразует UTC во локальное время
  • 🌎 ЛокальноеВремяВUTC() — преобразует локальное время в UTC
  • ТекущаяУниверсальнаяДатаВремя() — возвращает текущую дату/время в UTC
⚠️ Внимание: При обмене данными с внешними системами (например, через 1C:EnterpriseData или Directum) всегда уточняйте, в каком формате передаются даты — в локальном времени или UTC. Несогласованность может привести к сдвигу дат на ± несколько часов.

6. Альтернативные подходы: использование регулярных выражений и строковых функций

В редких случаях, когда дата хранится в виде строки (например, после импорта из Excel или XML), а не в типе Дата, можно применить строковые функции или регулярные выражения для извлечения только датовой части. Этот метод менее надежен, чем работа с типом Дата, но иногда бывает полезен.

Примеры:

// Если дата в формате "ДД.ММ.ГГГГ ЧЧ:ММ:СС"

СтрокаДата = "15.05.2026 14:30:00";

ДатаБезВремени = Лев(СтрокаДата, Найти(СтрокаДата, " ")-1); // Результат: "15.05.2026"

// Использование регулярного выражения (1С 8.3.10+)

РегВыражение = Новый РегВыражение("^\d{2}\.\d{2}\.\d{4}");

ДатаБезВремени = РегВыражение.Найти(СтрокаДата).Значение;

Ограничения метода:

  • ❌ Не работает, если формат даты нестандартный (например, ГГГГ-ММ-ДД)
  • ❌ Может дать сбой при некорректных входных данных (например, если в строке нет разделителя)
  • ❌ Не преобразует результат обратно в тип Дата — только извлекает подстроку

Рекомендация: используйте этот способ только для разовых обработок или импорта данных. Для постоянной работы с датами всегда преобразовывайте строку в тип Дата с помощью функции Дата(строка):

ДатаИзСтроки = Дата(Лев(СтрокаДата, 10)); // Преобразуем "15.05.2026" в тип Дата

7. Типовые ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с неожиданными проблемами при работе с датами в . Вот самые распространенные ошибки и способы их решения:

Ошибка Причина Решение
Дата в отчете отображается с временем, несмотря на настройки формата Формат применен не к тому полю или переопределен в макете Проверьте свойства ячейки в 1C:Enterprise или макете SSB
Запрос не находит документы за текущий день Сравнение идет с учетом времени (ДатаДокумента = ТекущаяДата()) Используйте НачалоДня() для обеих частей условия
При экспорте в Excel дата преобразуется в число (например, 45341) Excel хранит даты как количество дней с 1900 года Форматируйте дату в строку перед экспортом или настройте формат ячейки в Excel
В разных базах одна и та же дата отображается по-разному Разные региональные настройки (например, ru-RU vs kk-KZ) Явно задавайте формат через ДФ="dd.MM.yyyy" вместо ДФ="d"
После обновления платформы перестали работать функции с датами Изменения в синтаксисе (например, в 1С 8.3.20+) Проверьте журнал совместимости и обновите код

Особое внимание уделите обмену данными между разными конфигурациями. Например, при переносе документов из УТ 10.3 в ERP 2 даты могут интерпретироваться некорректно из-за разных версий платформы. Всегда тестируйте обмен на тестовых базах!

☑️ Проверка корректности работы с датами

Выполнено: 0 / 5

FAQ: Частые вопросы по работе с датами в 1С

Можно ли в 1С хранить дату без времени в базе данных?

Нет, в 1С:Предприятие тип Дата всегда включает временную часть, даже если она равна 00:00:00. Однако вы можете контролировать отображение даты (без времени) и логику работы (например, сравнивать даты с обнуленным временем).

Почему в отчете дата отображается в формате ГГГГ-ММ-ДД, а не ДД.ММ.ГГГГ?

Это связано с региональными настройками базы или пользователя. Чтобы исправить:

  1. Откройте Администрирование → Настройки программы → Региональные настройки.
  2. Установите нужный формат даты (например, ru-RU для ДД.ММ.ГГГГ).
  3. Или явно задайте формат в макете отчета через ДФ="dd.MM.yyyy".

Если проблема сохраняется, проверьте настройки операционной системы на сервере .

Как в запросе выбрать документы за вчерашний день?

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

ГДЕ ДатаДокумента >= НачалоДня(ТекущаяДата() - 86400)

И ДатаДокумента < НачалоДня(ТекущаяДата())

Где 86400 — количество секунд в сутках.

Можно ли в 1С 8.2 использовать функции для работы с UTC?

Функции ВремяUTCВЛокальное() и ЛокальноеВремяВUTC() появились только в 1С 8.3.14. В 1С 8.2 для работы с UTC придется писать обходные решения, например:

// Ручное преобразование UTC в локальное время (для Москвы, UTC+3)

Функция UTCвЛокальное(ДатаUTC)

Возврат ДатаUTC + 3 * 3600; // +3 часа в секундах

КонецФункции

Учтите, что такой код не учитывает переход на зимнее/летнее время!

Почему при сравнении дат в коде иногда возвращается Ложь, хотя даты визуально одинаковые?

Скорее всего, сравниваются даты с разным временем (например, 15.05.2026 00:00:00 и 15.05.2026 00:00:01). Всегда обнуляйте время перед сравнением:

Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда

// Даты совпадают по календарному дню

КонецЕсли;