Работа с датами в системе компоновки данных (СКД) 1С — одна из самых распространённых задач при формировании отчётов. Часто данные приходят в виде строк ("20260515"), чисел (45345 — количество дней с 1900 года) или нестандартных форматов, а вам нужно преобразовать их в полноценный тип Дата для корректной сортировки, фильтрации или вывода. Без правильного преобразования отчёт может показывать бессмыслицу: вместо"15 мая 2026" вы увидите"45345" или ошибку приведения типов.
В этой статье разберём все способы, как в 1С 8.3 (актуально и для 1С 8.2) выразить значение как дату прямо в выражениях СКД — от простых функций до сложных конструкций с условиями. Особое внимание уделим типичным ошибкам, которые приводят к падению отчётов или некорректным данным. Если вы когда-нибудь сталкивались с тем, что дата в отчёте отображается как"01.01.0001" или возникает исключение"Ошибка приведения значения к типу Дата", эта инструкция поможет разобраться в причинах и исправить их.
Почему в СКД нужно явно преобразовывать данные в дату
Система компоновки данных 1С не всегда автоматически распознаёт формат входящих данных. Например:
- 📅 Строки:"
2026-05-15","15.05.24" или"15 мая 2026" для СКД — просто текст, пока вы не укажете, как его интерпретировать. - 🔢 Числа: значение
45345может означать количество дней с01.01.1900(стандартный формат хранения дат в 1С), но СКД не знает об этом без явного указания. - 🗑️ NULL или пустые значения: если поле может быть не заполнено, попытка приведения к дате вызовет ошибку.
Без явного преобразования вы рискуете получить:
- ❌ Неправильную сортировку (строки"
10.05.2026" и"2.05.2026" отсортируются как"10...","2...", а не по хронологии). - ❌ Ошибки при группировке по периодам (месяцам, кварталам).
- ❌ Падение отчёта, если в данных попадётся некорректный формат.
Базовые функции для преобразования в дату
В выражениях СКД доступны стандартные функции 1С для работы с датами. Основные из них:
| Функция | Описание | Пример использования |
|---|---|---|
Дата(Год, Месяц, День) |
Создаёт дату из числовых компонентов | Дата(2026, 5, 15) → 15.05.2026 |
НачалоДня(Дата) |
Обнуляет время (устанавливает 00:00:00) |
НачалоДня(ТекущаяДата) |
ДобавитьМесяц(Дата, Количество) |
Сдвигает дату на указанное количество месяцев | ДобавитьМесяц(Дата(2026,1,31), 1) → 28.02.2026 |
СтрокаКакДата(Строка, Формат) |
Преобразует строку в дату по заданному формату | СтрокаКакДата("15.05.2026","DD.MM.YYYY") |
Самая универсальная функция для преобразования строк — СтрокаКакДата. Она позволяет явно указать формат исходной строки, что критично для корректной интерпретации. Например:
СтрокаКакДата(ПолеСтроки,"YYYYMMDD") // Для строки"20260515"
СтрокаКакДата(ПолеСтроки,"DD.MM.YY") // Для строки"15.05.24"
Если формат даты в исходных данных может варьироваться (например, иногда"DD.MM.YYYY", а иногда"DD-MM-YYYY"), используйте функцию Попытка с несколькими вариантами преобразования, чтобы избежать ошибок.
Преобразование чисел в дату (формат"дни с 1900 года")
В 1С даты часто хранятся как числа — количество дней, прошедших с 01.01.1900. Например, значение 45345 соответствует 15.05.2026. Чтобы преобразовать такое число в дату, используйте функцию Дата с параметром:
Дата(ЧисловоеЗначение,"ДФ=d")
Примеры:
- 📌
Дата(45345,"ДФ=d")→15.05.2026 00:00:00 - 📌
НачалоДня(Дата(45345,"ДФ=d"))→ обнуляет время
Если число приходит в виде строки (например, из внешнего источника), сначала преобразуйте его в числовой тип:
Дата(Число("45345"),"ДФ=d")
Что делать, если число дней отрицательное?
Отрицательные значения (например, -1) соответствуют датам до 01.01.1900. В большинстве случаев это ошибка данных, но если вам нужно обработать такой случай, используйте конструкцию:
Если ЧисловоеЗначение < 0 Тогда
Дата(1,1,1) // Возвращаем минимальную дату
Иначе
Дата(ЧисловоеЗначение,"ДФ=d")
КонецЕсли
Работа с нестандартными форматами дат
Иногда даты приходят в необычных форматах, например:
- 📅"
May 15, 2026" (английский формат) - 📅"
2026/05/15" (разделитель — слеш) - 📅"
15 мая 2026 г." (русский текстовый формат)
Для таких случаев комбинируйте функции СтрокаКакДата с заменой символов или регулярными выражениями. Примеры:
// Для формата"May 15, 2026"
СтрокаКакДата(
СтрЗаменить(ПолеСтроки,"May","05"),
"MM DD, YYYY"
)
// Для формата"15 мая 2026 г."
СтрокаКакДата(
СтрЗаменить(ПолеСтроки," г.",""),
"DD MMMM YYYY"
)
Важно: при работе с текстовыми месяцами (например,"мая") используйте локализованные названия, соответствующие языку вашей базы 1С. В английской версии"May" сработает, а в русской — нет.
Обработка пустых значений и ошибок
Если поле с датой может быть пустым (NULL), его прямое преобразование вызовет ошибку. Всегда проверяйте значения на заполненность:
Если ЗначениеЗаполнено(ПолеСтроки) Тогда
СтрокаКакДата(ПолеСтроки,"DD.MM.YYYY")
Иначе
Дата(1,1,1) // Возвращаем минимальную дату
КонецЕсли
Для более надёжной обработки используйте конструкцию Попытка...Исключение:
Попытка
Результат = СтрокаКакДата(ПолеСтроки,"DD.MM.YYYY");
Исключение
Результат = Дата(1,1,1); // Запасной вариант
КонецПопытки;
Значение не пустое (ЗначениеЗаполнено)
Формат строки соответствует ожидаемому
Числовое значение не отрицательное (для формата"дни с 1900")
Учтена локаль (русский/английский месяцы)
-->
Примеры использования в реальных отчётах
Рассмотрим практические случаи, где преобразование дат критично:
1. Отчёт по продажам с датами из внешней системы
Допустим, у вас есть таблица с полем ДатаПоставки в формате строки"20260515". Чтобы сгруппировать данные по месяцам, в выражении СКД используйте:
НачалоМесяца(
СтрокаКакДата(ДатаПоставки,"YYYYMMDD")
)
2. Сравнение дат в условиях отбора
Если нужно отфильтровать документы за текущий год, но дата хранится как число дней:
Год(Дата(ЧислоДней,"ДФ=d")) = Год(ТекущаяДата)
3. Вывод даты в пользовательском формате
Чтобы показать дату в отчёте как"15 мая 2026 г.", а не"15.05.2026", используйте:
Формат(
СтрокаКакДата(ПолеДата,"DD.MM.YYYY"),
"ДФ='d MMMM yyyy г.'"
)
Всегда проверяйте результат преобразования на тестовых данных, особенно если формат исходных дат может варьироваться. Одна ошибка в формате (например, перепутаны день и месяц) приведёт к некорректной интерпретации всех дат в отчёте.
Типичные ошибки и как их избежать
Ошибка №1: Несовпадение форматов
Если строка"15.05.2026" обрабатывается как СтрокаКакДата(...,"MM.DD.YYYY"), результат будет 05.15.2026 (15-й месяц не существует). Всегда сверяйте формат с реальными данными.
Ошибка №2: Игнорирование локали
Функция СтрокаКакДата зависит от языковых настроек. На английской версии 1С строка"15 мая 2026" не распознается — нужно использовать"May 15, 2026".
Ошибка №3: Прямое приведение типов
Конструкция Дата(ПолеСтроки) без указания формата сработает только для строк вида"YYYYMMDD". Для остальных форматов она вернёт 01.01.0001.
⚠️ Внимание: Если вы работаете с данными из Excel или SQL, помните, что в этих системах даты могут храниться в других форматах (например, YYYY-MM-DD в SQL или серийный номер в Excel). Всегда уточняйте исходный формат перед преобразованием.
FAQ: Частые вопросы по работе с датами в СКД
Как преобразовать дату из формата Unix timestamp (количество секунд с 1970 года)?
Используйте формулу:
Дата(1970,1,1) + ЧислоСекунд / 86400
Где 86400 — количество секунд в сутках. Например, для 1715720000 (15.05.2026):
Дата(1970,1,1) + 1715720000 / 86400 → 15.05.2026 00:00:00
Почему после преобразования дата сдвигается на 1-2 дня?
Эточная проблема при работе с временными зонами или неверном учёте начала отсчёта. Проверьте:
- Используется ли в исходных данных UTC или локальное время.
- Не добавлено ли лишнее смещение (например,
+ 2для часового пояса). - Для чисел в формате"дни с 1900" убедитесь, что не прибавляете лишние дни.
Можно ли в СКД использовать регулярные выражения для парсинга дат?
Нет, в выражениях СКД 1С регулярные выражения недоступны. Для сложного парсинга (например, извлечение даты из строки"Заказ от 15.05.2026 №123") предварительно обработайте данные в модуле отчёта или используйте функции СтрНайти и Сред:
СтрокаДата = Сред(ПолеСтроки, СтрНайти(ПолеСтроки,"от") + 3, 10);
СтрокаКакДата(СтрокаДата,"DD.MM.YYYY")
Как в СКД получить текущую дату без времени?
Используйте комбинацию ТекущаяДата и НачалоДня:
НачалоДня(ТекущаяДата)
Это вернёт дату с временем 00:00:00.
Что делать, если дата хранится в виде отдельных полей (день, месяц, год)?
Собирайте дату из компонентов с помощью функции Дата:
Дата(Год, Месяц, День)
Пример для полей ДеньРождения_День, ДеньРождения_Месяц, ДеньРождения_Год:
Дата(
ДеньРождения_Год,
ДеньРождения_Месяц,
ДеньРождения_День
)