Работа с датами в системе компоновки данных (СКД) 1С — одна из самых распространённых задач при формировании отчётов. Часто данные приходят в виде строк ("20260515"), чисел (45345 — количество дней с 1900 года) или нестандартных форматов, а вам нужно преобразовать их в полноценный тип Дата для корректной сортировки, фильтрации или вывода. Без правильного преобразования отчёт может показывать бессмыслицу: вместо"15 мая 2026" вы увидите"45345" или ошибку приведения типов.

В этой статье разберём все способы, как в 1С 8.3 (актуально и для 1С 8.2) выразить значение как дату прямо в выражениях СКД — от простых функций до сложных конструкций с условиями. Особое внимание уделим типичным ошибкам, которые приводят к падению отчётов или некорректным данным. Если вы когда-нибудь сталкивались с тем, что дата в отчёте отображается как"01.01.0001" или возникает исключение"Ошибка приведения значения к типу Дата", эта инструкция поможет разобраться в причинах и исправить их.

Почему в СКД нужно явно преобразовывать данные в дату

Система компоновки данных не всегда автоматически распознаёт формат входящих данных. Например:

  • 📅 Строки:"2026-05-15","15.05.24" или"15 мая 2026" для СКД — просто текст, пока вы не укажете, как его интерпретировать.
  • 🔢 Числа: значение 45345 может означать количество дней с 01.01.1900 (стандартный формат хранения дат в ), но СКД не знает об этом без явного указания.
  • 🗑️ 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 года")

В даты часто хранятся как числа — количество дней, прошедших с 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: Игнорирование локали

Функция СтрокаКакДата зависит от языковых настроек. На английской версии строка"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" убедитесь, что не прибавляете лишние дни.
Можно ли в СКД использовать регулярные выражения для парсинга дат?

Нет, в выражениях СКД регулярные выражения недоступны. Для сложного парсинга (например, извлечение даты из строки"Заказ от 15.05.2026 №123") предварительно обработайте данные в модуле отчёта или используйте функции СтрНайти и Сред:

СтрокаДата = Сред(ПолеСтроки, СтрНайти(ПолеСтроки,"от") + 3, 10);

СтрокаКакДата(СтрокаДата,"DD.MM.YYYY")

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

Используйте комбинацию ТекущаяДата и НачалоДня:

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

Это вернёт дату с временем 00:00:00.

Что делать, если дата хранится в виде отдельных полей (день, месяц, год)?

Собирайте дату из компонентов с помощью функции Дата:

Дата(Год, Месяц, День)

Пример для полей ДеньРождения_День, ДеньРождения_Месяц, ДеньРождения_Год:

Дата(

ДеньРождения_Год,

ДеньРождения_Месяц,

ДеньРождения_День

)