Разработка и Конфигурация · 12 мин
Как в 1С преобразовать число в дату
Как в 1С преобразовать число в дату: конструктор Дата(), функции Год, Месяц, День, работа со строкой ГГГГММДД, типичные ошибки и проверка результата.
Во встроенном языке 1С тип «Дата» — самостоятельный тип, и число автоматически в него не превращается. Если попытаться присвоить реквизиту с типом «Дата» значение 20260115, платформа либо выдаст ошибку несоответствия типов, либо сохранит число как есть — в зависимости от контекста. Поэтому преобразование всегда выполняется явно: через конструктор Дата(), разбор числа на составляющие или предварительный перевод в строку.
Чаще всего задача возникает в трёх ситуациях: число пришло из внешнего источника (файл Excel, обмен, веб-сервис) в формате ГГГГММДД; число является результатом вычислений, где год, месяц и день собраны арифметически; либо число хранится в реквизите неправильного типа по историческим причинам. Во всех случаях логика одна: из числа нужно получить три компонента — год, месяц, день — и собрать из них значение типа «Дата».
Ниже разобраны рабочие способы преобразования, проверка корректности результата и типичные ошибки, которые приводят к датам вроде 0001.01.01 или к падению кода с исключением.
Как устроен тип «Дата» в 1С и почему число не подходит напрямую
Тип «Дата» в 1С хранит календарную дату и время с точностью до секунды. Внутренне это не число в привычном смысле: платформа применяет к нему собственные правила сравнения, форматирования и арифметики. Сложение даты и числа даёт сдвиг в секундах, а не в днях — это частая причина ошибок у начинающих разработчиков.
Пустая дата — это значение 01.01.0001 00:00:00. Если преобразование выполнено неправильно (например, передан ноль или пустая строка), результатом часто становится именно эта дата. Поэтому признак «получилась дата 01.01.0001» почти всегда означает, что входное значение не прошло проверку.
Диапазон допустимых дат ограничен: год от 1 до 9999. Числа, выходящие за эти пределы, или несуществующие комбинации (30 февраля, месяц 13) приведут к ошибке либо к некорректному значению, поэтому валидация входных данных — обязательная часть любого преобразования.
Способ 1: конструктор Дата() из числа в формате ГГГГММДД
Если число представляет дату в формате ГГГГММДД (например, 20260315 — 15 марта 2026 года), самый короткий путь — передать его в конструктор Дата(). Платформа умеет интерпретировать числовой литерал как дату, если он соответствует этому шаблону.
ЧислоДата = 20260315;
ДатаРезультат = Дата(ЧислоДата);
// ДатаРезультат = 15.03.2026 0:00:00
Тот же конструктор принимает и строку из цифр в том же формате: Дата("20260315"). Многие разработчики предпочитают сначала преобразовать число в строку через Формат() или СокрЛП(), чтобы исключить проблемы с разрядностью и форматированием, а затем вызвать Дата() от строки.
Важное ограничение: число обязано быть полным восьмизначным значением. Если ведущий ноль потерян (например, дата января записана как 2026115 вместо 20260115), конструктор вернёт ошибку или неверный результат. Проверяйте длину: у числа в формате ГГГГММДД строковое представление должно содержать ровно 8 символов.
ЧислоДата = 20260315;
СтрокаДата = Формат(ЧислоДата, "ЧГ=0");
Если СтрДлина(СтрокаДата) = 8 Тогда
ДатаРезультат = Дата(СтрокаДата);
Иначе
Сообщить("Число не соответствует формату ГГГГММДД");
КонецЕсли;Способ 2: сборка даты из отдельных чисел — год, месяц, день
Когда компоненты даты хранятся раздельно (типично для выгрузок из Excel и сторонних систем), используется конструктор Дата() с тремя числовыми параметрами: Дата(Год; Месяц; День). Дополнительно можно передать часы, минуты и секунды.
ГодЧисло = 2026;
МесяцЧисло = 3;
ДеньЧисло = 15;
ДатаРезультат = Дата(ГодЧисло; МесяцЧисло; ДеньЧисло);
Если исходное значение — одно число ГГГГММДД, компоненты извлекаются арифметикой: год — целочисленное деление на 10000, месяц — остаток от деления на 10000, делённый нацело на 100, день — остаток от деления на 100. Этот приём полезен, когда нужно дополнительно проверить каждую часть перед сборкой.
ЧислоДата = 20260315;
ГодЧисло = Цел(ЧислоДата / 10000); // 2026
МесяцЧисло = Цел((ЧислоДата % 10000) / 100); // 3
ДеньЧисло = ЧислоДата % 100; // 15
ДатаРезультат = Дата(ГодЧисло; МесяцЧисло; ДеньЧисло);
Перед сборкой убедитесь, что месяц лежит в диапазоне 1–12, а день не превышает количество дней в конкретном месяце. Попытка создать Дата(2026; 2; 30) завершится исключением «Недопустимое значение», которое остановит выполнение кода, если оно не обработано.
- 1Определите формат исходного числа: ГГГГММДД или раздельные компоненты
- 2Проверьте, что число не ноль и не пустое значение
- 3Для формата ГГГГММДД проверьте длину строкового представления — ровно 8 цифр
- 4Выполните преобразование через Дата(Число) или Дата(Год; Месяц; День)
- 5Проверьте результат: дата не равна 01.01.0001 и попадает в ожидаемый период
Способ 3: получение числа из даты — обратная задача
Обратное преобразование требуется не реже: например, сформировать число ГГГГММДД для выгрузки или сравнения. Для этого используются функции Год(), Месяц() и День(), каждая из которых возвращает число.
ТекущаяДата = Дата(2026; 3; 15);
ГодЧисло = Год(ТекущаяДата); // 2026
МесяцЧисло = Месяц(ТекущаяДата); // 3
ДеньЧисло = День(ТекущаяДата); // 15
Собрать единое число ГГГГММДД можно арифметически: Год 10000 + Месяц 100 + День. Альтернатива — функция Формат() с шаблоном "ДФ=yyyyMMdd", которая возвращает строку, а затем при необходимости преобразуется в число через Число().
СтрокаДата = Формат(ТекущаяДата, "ДФ=yyyyMMdd"); // "20260315"
ЧислоДата = Число(СтрокаДата); // 20260315
Второй вариант надёжнее при работе с месяцами и днями меньше 10: форматная строка автоматически добавляет ведущие нули, тогда как при арифметической сборке легко ошибиться в порядке разрядов.
Проверка результата и обработка ошибок
Любое преобразование из внешних данных стоит оборачивать в попытку-исключение, потому что формат входных чисел не гарантирован. Файл Excel может отдать число с дробной частью, обмен — строку с разделителями, а ручной ввод — произвольное значение.
Попытка
ДатаРезультат = Дата(ЧислоДата);
Исключение
ДатаРезультат = Дата(1; 1; 1); // пустая дата как признак ошибки
Сообщить("Не удалось преобразовать: " + ЧислоДата);
КонецПопытки;
После преобразования полезно проверить результат на «пустую дату» и на попадание в разумный диапазон. Для учётных данных обычно проверяют, что дата не раньше даты начала ведения учёта и не позже текущей даты плюс допустимый горизонт планирования.
Как проверить результат преобразования
Дата соответствует исходному числу, время 00:00:00
Получено 01.01.0001 — входное значение не прошло разбор
Ровно 8 символов
7 или 9 символов — потерян ведущий ноль или лишний разряд
Месяц 1–12, день не больше числа дней в месяце
Исключение «Недопустимое значение» при вызове Дата()
Типичные ошибки при преобразовании числа в дату
Самая распространённая ошибка — ожидание, что число 15032026 (ДДММГГГГ) будет понято как 15 марта. Конструктор Дата() трактует числовой формат строго как ГГГГММДД, поэтому число в другом порядке даст ошибку или неверную дату. Если источник отдаёт ДДММГГГГ, компоненты нужно извлекать арифметикой вручную и собирать через Дата(Год; Месяц; День).
Вторая частая проблема — потеря ведущего нуля при хранении даты как числа. Дата 05.01.2026 в формате ГГГГММДД должна быть 20260105, но если месяц записан одной цифрой, получится 2026105, и разбор сломается. Лечится переводом в строку с форматированием Формат(Число, "ЧЦ=8; ЧВН=; ЧГ=0"), который дополнит значение нулями слева.
Третья группа ошибок связана с арифметикой дат: попытка «прибавить день» как Дата + 1 сдвигает дату на одну секунду, а не на сутки. Для сдвига по календарю используются ДобавитьМесяц() и сложение с количеством секунд в сутках (86400), либо функции работы с периодами, если установлено расширение для работы с датами.
Число как секунды или миллисекунды: особый случай
В интеграциях встречаются даты в формате Unix-времени — количество секунд с 01.01.1970. Встроенного преобразования для него в платформе нет, поэтому применяется арифметика: к дате 1970-01-01 прибавляется число секунд. Учитывайте часовой пояс: Unix-время обычно в UTC, и для корректного локального значения нужна поправка на смещение.
UnixСекунды = 1710460800;
ДатаРезультат = Дата(1970; 1; 1) + UnixСекунды;
// результат в UTC; для локального времени добавьте смещение в секундах
Если источник отдаёт миллисекунды (число на три порядка больше), сначала разделите его на 1000. Признак миллисекунд — 13-значное число вместо 10-значного. Перепутав форматы, вы получите дату далеко в будущем, что легко заметить при проверке диапазона.
Выбор способа под конкретную задачу
Единого «правильного» метода нет — выбор зависит от формата входных данных и требований к надёжности. Число ГГГГММДД из проверенного источника проще всего передать напрямую в Дата(). Данные из файлов и обменов лучше разбирать построчно с валидацией каждого компонента и обработкой исключений.
Для массовых загрузок (тысячи строк из файла) рекомендуется собирать статистику ошибок: сколько значений не преобразовалось и по какой причине. Это позволяет отличить единичный брак от системной проблемы с форматом источника.
Сравнение способов преобразования
Самый короткий код для формата ГГГГММДД. Не подходит, если порядок компонентов другой или возможны ошибки формата
Полный контроль над каждым компонентом, можно валидировать диапазоны. Код длиннее, но надёжнее для внешних данных
Решает проблему ведущих нулей и разрядности. Требует дополнительного шага преобразования
Единственный вариант для секунд с 1970 года. Требует учёта часового пояса
Что важно запомнить
Число в дату преобразуется конструктором Дата(): напрямую для формата ГГГГММДД или через три параметра Год, Месяц, День. Всегда проверяйте длину и диапазон входных значений, оборачивайте преобразование в попытку-исключение и контролируйте, что результат не равен пустой дате 01.01.0001. Арифметика дат в 1С идёт в секундах — для сдвига на сутки прибавляйте 86400.
Частые вопросы
Почему Дата(20260315) возвращает ошибку в моём коде?
Проверьте, что значение действительно передаётся как число или как строка из восьми цифр без пробелов и разделителей. Если число пришло из строки с пробелами или неразрывными пробелами, предварительно очистите его через СокрЛП() и СтрЗаменить(). Также убедитесь, что переменная не имеет тип «Неопределено» — в этом случае конструктор выдаст исключение.
Как преобразовать число 15032026 (день-месяц-год) в дату?
Конструктор Дата() такой порядок не понимает. Извлеките компоненты арифметически: день — целая часть деления на 1000000, месяц — остаток от деления на 1000000, поделённый нацело на 10000, год — остаток от деления на 10000. Затем соберите Дата(Год; Месяц; День) с проверкой диапазонов.
Можно ли преобразовать число в дату в запросе 1С?
В языке запросов нет прямого аналога конструктора Дата() для произвольного числа. Практичный путь — вычислить дату в коде и передать её в запрос параметром, либо использовать функцию ДАТАВРЕМЯ(Год; Месяц; День) в тексте запроса, если компоненты известны или извлекаются выражениями. Для разбора числа ГГГГММДД внутри запроса применяют арифметические выражения с ВЫРАЗИТЬ и делением, но такой запрос сложно читать и поддерживать.
Что делать, если после преобразования получается дата 01.01.0001?
Это признак того, что входное значение не было распознано: ноль, пустая строка, слишком короткое число или тип «Неопределено». Добавьте перед преобразованием проверку на пустое значение и минимальную длину, а после — сравнение результата с Дата(1;1;1). Найдите источник некорректных данных, а не маскируйте проблему подстановкой текущей даты.
Как прибавить к дате количество дней, заданное числом?
Умножьте число дней на 86400 (секунд в сутках) и прибавьте к дате: НоваяДата = ИсходнаяДата + ЧислоДней * 86400. Для сдвига на месяцы используйте ДобавитьМесяц(Дата; ЧислоМесяцев) — простое умножение на секунды здесь не подходит из-за разной длины месяцев.
Работает ли преобразование Дата(Число) на мобильной платформе и в веб-клиенте?
Конструктор Дата() и функции Год(), Месяц(), День() доступны во всех режимах исполнения, включая тонкий клиент, веб-клиент и мобильную платформу. Ограничений по этому синтаксису нет, но код с обращением к серверным данным потребует серверного вызова в клиент-серверном варианте работы.