К статье
Практический материал

Разработка и Конфигурация · 12 мин

Ошибка «Преобразование значения к типу Дата не может быть выполнено» в 1С: причины и решение

Ошибка «Преобразование значения к типу Дата не может быть выполнено» в 1С: причины, способы исправления в коде, запросах и отчётах. Пошаговая инструкция.

Ошибка «Преобразование значения к типу Дата не может быть выполнено» возникает в 1С, когда платформа пытается превратить значение в дату, но формат данных этого не позволяет. Чаще всего виновник — строка, которую система не может распознать как дату, пустое значение, число в неподходящем формате или данные, пришедшие из внешнего источника: файла Excel, веб-сервиса, обмена между базами.

Ошибка может проявляться в трёх местах: при выполнении кода на встроенном языке (например, при вызове функции Дата() с некорректным аргументом), в запросах при использовании функции ДАТАВРЕМЯ() или приведении типов, а также в СКД при настройке выражений и параметров отчёта. Текст сообщения при этом одинаковый, поэтому первый шаг — понять, где именно происходит преобразование.

Хорошая новость: это не сбой платформы и не повреждение базы, а логическая ошибка в данных или коде. Исправить её можно самостоятельно, если последовательно найти источник проблемного значения и обработать его корректно. Ниже разобраны типичные сценарии и способы устранения.

Где искать источник ошибки

Первое действие — получить точное место возникновения. Если ошибка появляется в диалоговом окне, нажмите «Подробно» — платформа покажет фрагмент кода или контекст, где произошло преобразование. Если сообщение приходит пользователю при работе с документом или отчётом, попросите воспроизвести действие и зафиксируйте точный момент.

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

Типичные места, которые стоит проверить в первую очередь: обработчики загрузки данных из файлов, обмены с другими системами, процедуры проведения документов, где дата формируется из строки, параметры отчётов на СКД и запросы с функцией ДАТАВРЕМЯ().

Ошибка в кодеВызов Дата() или присвоение строки реквизиту типа Дата

Откройте модуль из сообщения об ошибке и проверьте аргументы преобразования

Ошибка в запросеДАТАВРЕМЯ() или приведение типа в тексте запроса

Проверьте параметры запроса и значения полей, участвующих в приведении

Ошибка в СКДВыражение в ресурсе, параметре или отборе отчёта

Откройте схему компоновки и проверьте вычисляемые поля и параметры

Ошибка при обменеДанные приходят из файла или внешней системы

Проверьте формат дат в источнике: разделители, порядок дня и месяца, пустые значения

Исправление в коде на встроенном языке

Самая частая причина в коде — вызов конструктора даты из строки: Дата("31.12.2023"). Платформа ожидает строку в каноническом формате «ГГГГММДДччммсс» (или его часть): Дата("20231231"). Строка «31.12.2023» с точками и «русским» порядком дня и месяца не распознаётся — отсюда и ошибка.

Правильные варианты: использовать канонический формат Дата("20231231"), собирать дату из чисел Дата(2023, 12, 31) или парсить строку вручную, разбирая её по разделителям и переставляя части. Если строка приходит извне (из файла, сервиса), не полагайтесь на автоматическое преобразование — разберите её явно.

Вторая типичная ситуация — присвоение строкового значения реквизиту типа Дата. Платформа пытается выполнить неявное преобразование и завершается ошибкой, если строка не в каноническом формате. Решение то же: преобразуйте значение заранее контролируемым способом.

Для защиты кода от падения используйте попытку преобразования через конструкцию Попытка ... Исключение или предварительную проверку строки. Универсальный приём — функция безопасного преобразования, которая возвращает пустую дату Дата(1,1,1) при неудаче, а не прерывает выполнение.

bsl
Функция СтрокаВДату(СтрокаДаты)
    Попытка
        Возврат Дата(СтрокаДаты);
    Исключение
        Возврат Дата(1,1,1); // пустая дата вместо падения
    КонецПопытки;
КонецФункции

Исправление в запросах

В запросах ошибка возникает при использовании конструкции ДАТАВРЕМЯ(&Параметр), если параметр имеет неподходящий тип, или при передаче строки туда, где ожидается дата. Также проблему создаёт сравнение поля типа Дата со строковым литералом — платформа пытается привести строку к дате и терпит неудачу.

Проверьте параметры запроса: если параметр объявлен как строка или тип не задан явно, а в запросе он используется как дата, задайте тип через Запрос.УстановитьПараметр("Период", ДатаЗначение), передавая именно значение типа Дата, а не строку. Для литералов внутри текста запроса используйте конструктор ДАТАВРЕМЯ(2023, 12, 31) с числовыми аргументами.

Отдельный случай — поля составного типа. Если реквизит может хранить и строку, и дату, приведение ВЫРАЗИТЬ(Поле КАК Дата) выполняется корректно только для значений, реально являющихся датами; строки при этом преобразуются в пустую дату, а не вызывают ошибку, но логика отбора может сломаться. Проверяйте тип значения через ТИПЗНАЧЕНИЯ() перед приведением.

Исправление в отчётах на СКД

В схеме компоновки данных ошибка чаще всего сидит в параметрах типа Дата, в которые пользователь или код передаёт строку, а также в вычисляемых полях и выражениях ресурсов, где выполняется преобразование. Если отчёт падает сразу при формировании — смотрите параметры; если при выводе конкретных строк — вычисляемые поля.

Откройте схему компоновки отчёта в конфигураторе или через «Изменить вариант» → «Расширенные настройки» (если доступ разрешён). Проверьте: тип параметров даты, выражения вычисляемых полей, настройки отборов, где значение сравнивается с датой. Строковое значение в отборе по полю типа Дата — типовая причина.

Если отчёт формируется программно, проверьте код установки параметров: значения должны передаваться как ТекущаяДатаСеанса(), НачалоДня(Дата) и т. п., а не как строки вида «01.01.2023». После исправления сформируйте отчёт повторно и убедитесь, что данные выводятся без исключений.

Порядок действий
  1. 1
    Воспроизведите ошибку и зафиксируйте точный текст сообщения и место (код, запрос, отчёт)
  2. 2
    Найдите значение, которое преобразуется в дату: выведите его в сообщение или посмотрите в отладчике
  3. 3
    Определите фактический тип и формат значения: строка, число, пустое значение
  4. 4
    Исправьте источник данных или добавьте безопасное преобразование с обработкой исключения
  5. 5
    Проверьте результат на граничных случаях: пустая строка, дата с точками, дата в формате ДД.ММ.ГГГГ и ГГГГ-ММ-ДД

Проблемы при загрузке данных из внешних источников

Загрузка из Excel, CSV, DBF и веб-сервисов — самый массовый источник этой ошибки. Внешние системы хранят даты в произвольных форматах: «31.12.2023», «12/31/2023», «2023-12-31T00:00:00», а иногда как числовое представление (в Excel дата может храниться как число дней от базовой даты). Прямая передача такого значения в реквизит типа Дата вызывает ошибку преобразования.

Надёжный подход — нормализовать значение на этапе чтения: определить формат источника, разобрать строку по разделителям, собрать дату из числовых частей через Дата(Год, Месяц, День). Для форматов с разделителями удобно СтрРазделить(), для ISO-формата из веб-сервисов — обрезка строки до первых 8–14 символов с перестановкой частей.

Обратите внимание на пустые ячейки и значения вида «-» или «н/д»: их нужно отлавливать до преобразования и подставлять пустую дату или пропускать запись. Иначе обработка упадёт на первой же проблемной строке файла, и загрузка прервётся.

Типичные ошибки при устранении

Самая распространённая ошибка — лечить симптом, а не причину: обернуть вызов в Попытка...Исключение и забыть. Ошибка перестаёт появляться, но в базу попадают пустые даты, что позже ломает отчёты, проведение документов и обмены. Обработка исключения должна сопровождаться логированием проблемного значения.

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

Третья ошибка — игнорирование состава даты: тип Дата в 1С может содержать только дату, только время или дату и время. При сравнении дат с временем сравнение «на равенство» часто не срабатывает, и разработчик пытается «починить» это преобразованиями, порождая новые ошибки. Используйте НачалоДня() и КонецДня() для сравнений по дате.

Типичные ошибки
01
Проглатывание ошибки через Попытка/Исключение без логирования — пустые даты попадают в базу и ломают отчёты
02
Передача строки «ДД.ММ.ГГГГ» в конструктор Дата() — платформа понимает только канонический формат ГГГГММДД
03
Преобразование даты в строку и обратно через Формат() — результат зависит от региональных настроек сеанса
04
Отсутствие проверки пустых значений из файлов — загрузка падает на первой пустой ячейке
05
Сравнение дат с временем на равенство без НачалоДня()/КонецДня() — ложное «исправление» порождает новые преобразования

Как проверить, что проблема решена

После исправления прогоните сценарий, который вызывал ошибку, на исходных данных. Затем проверьте граничные случаи: пустое значение, строка с точками, строка в ISO-формате, дата без времени, дата с временем. Все варианты должны обрабатываться без исключений, а результат — попадать в базу корректно.

Полезно временно добавить вывод преобразуемого значения через Сообщить() или запись в журнал регистрации — так вы увидите, какие именно данные приходят на вход, и убедитесь, что нормализация работает. После проверки отладочный вывод уберите или переведите на уровень, не видимый пользователям.

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

Контрольные точки

Как проверить результат

Выполнение операции
Норма

Действие завершается без сообщения об ошибке

Тревожный признак

Ошибка преобразования появляется снова

Значения дат в базе
Норма

Даты заполнены и соответствуют источнику

Тревожный признак

Появились пустые даты 01.01.0001 там, где должны быть реальные

Граничные данные
Норма

Пустые строки и нестандартные форматы обрабатываются контролируемо

Тревожный признак

Обработка падает на пустом или нестандартном значении

Отчёты и обмены
Норма

Отчёт формируется, обмен завершается, даты совпадают

Тревожный признак

Исключения в СКД или расхождения дат после обмена

Если ошибка возникает только у одного пользователя, проверьте региональные настройки его сеанса и введённые вручную значения: ручной ввод даты в нестандартном виде в поле со строковым типом — частая причина, которая не воспроизводится у остальных.
ПЗ
Практическое замечание

Частые вопросы

Почему Дата("31.12.2023") вызывает ошибку, а Дата("20231231") работает?

Конструктор даты из строки принимает только канонический формат ГГГГММДДччммсс (время можно опустить). Строки с точками, слэшами и порядком «день-месяц-год» платформа не распознаёт. Разберите такую строку по разделителям и соберите дату через Дата(Год, Месяц, День).

Ошибка появляется в типовом отчёте, который раньше работал. Что изменилось?

Чаще всего изменились параметры: в параметр типа Дата попала строка или пустое значение, либо в базе появились записи с нестандартными данными, которые попадают в вычисляемое поле. Сравните настройки варианта отчёта с типовыми и проверьте данные за проблемный период.

Можно ли отключить эту ошибку настройкой платформы?

Нет, это не отключаемое исключение: платформа всегда прерывает выполнение при невозможном преобразовании. Единственный способ — исправить данные или код. Обработка через Попытка/Исключение допустима, но только с логированием проблемного значения.

Дата из Excel загружается как число. Как её преобразовать?

Excel хранит даты как количество дней от базовой даты. Если при чтении через COM-объект или табличный документ значение пришло числом, лучше считывать ячейку с учётом её формата (свойство Text у COM-ячейки) или явно пересчитывать число в дату с учётом базовой даты Excel. Проверьте результат на нескольких известных датах из файла.

Ошибка возникает только при обмене между базами. Где искать?

Проверьте правила конвертации: свойство типа Дата может выгружаться как строка в произвольном формате и не распознаваться при загрузке. Убедитесь, что в правилах для дат используется канонический формат, и протестируйте обмен на небольшом пакете данных с записью в журнал.

Чем пустая дата отличается от ошибки преобразования?

Пустая дата (01.01.0001) — корректное значение, которое не вызывает ошибки. Ошибка возникает только когда значение невозможно интерпретировать как дату. Поэтому в безопасных функциях преобразования при неудаче возвращают именно пустую дату, а не прерывают выполнение.

Итог

Что важно запомнить

Ошибка преобразования к типу Дата — следствие некорректного входного значения, а не сбой платформы. Найдите место преобразования, проверьте формат и тип значения, исправьте источник данных или добавьте контролируемое преобразование с логированием. Не маскируйте ошибку пустой обработкой исключений и не передавайте даты строками между системами.