Работа с датами в 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), но имеет ограничение: он меняет только визуальное отображение, а не саму дату в базе. Если вам нужно передать "чистую" дату в другой документ или обработку, потребуются методы из следующих разделов.
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. Типовые ошибки и как их избежать
Даже опытные разработчики иногда сталкиваются с неожиданными проблемами при работе с датами в 1С. Вот самые распространенные ошибки и способы их решения:
| Ошибка | Причина | Решение |
|---|---|---|
| Дата в отчете отображается с временем, несмотря на настройки формата | Формат применен не к тому полю или переопределен в макете | Проверьте свойства ячейки в 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 даты могут интерпретироваться некорректно из-за разных версий платформы. Всегда тестируйте обмен на тестовых базах!
☑️ Проверка корректности работы с датами
FAQ: Частые вопросы по работе с датами в 1С
Можно ли в 1С хранить дату без времени в базе данных?
Нет, в 1С:Предприятие тип Дата всегда включает временную часть, даже если она равна 00:00:00. Однако вы можете контролировать отображение даты (без времени) и логику работы (например, сравнивать даты с обнуленным временем).
Почему в отчете дата отображается в формате ГГГГ-ММ-ДД, а не ДД.ММ.ГГГГ?
Это связано с региональными настройками базы или пользователя. Чтобы исправить:
- Откройте
Администрирование → Настройки программы → Региональные настройки. - Установите нужный формат даты (например,
ru-RUдляДД.ММ.ГГГГ). - Или явно задайте формат в макете отчета через
ДФ="dd.MM.yyyy".
Если проблема сохраняется, проверьте настройки операционной системы на сервере 1С.
Как в запросе выбрать документы за вчерашний день?
Используйте комбинацию НачалоДня() и вычитания дней:
ГДЕ ДатаДокумента >= НачалоДня(ТекущаяДата() - 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) Тогда
// Даты совпадают по календарному дню
КонецЕсли;