Разработка и Конфигурация · 12 мин
Ошибка «Преобразование значения к типу Дата не может быть выполнено» в 1С: причины и решение
Ошибка «Преобразование значения к типу Дата не может быть выполнено» в 1С: причины, способы исправления в коде, запросах и отчётах. Пошаговая инструкция.
Ошибка «Преобразование значения к типу Дата не может быть выполнено» возникает в 1С, когда платформа пытается превратить значение в дату, но формат данных этого не позволяет. Чаще всего виновник — строка, которую система не может распознать как дату, пустое значение, число в неподходящем формате или данные, пришедшие из внешнего источника: файла Excel, веб-сервиса, обмена между базами.
Ошибка может проявляться в трёх местах: при выполнении кода на встроенном языке (например, при вызове функции Дата() с некорректным аргументом), в запросах при использовании функции ДАТАВРЕМЯ() или приведении типов, а также в СКД при настройке выражений и параметров отчёта. Текст сообщения при этом одинаковый, поэтому первый шаг — понять, где именно происходит преобразование.
Хорошая новость: это не сбой платформы и не повреждение базы, а логическая ошибка в данных или коде. Исправить её можно самостоятельно, если последовательно найти источник проблемного значения и обработать его корректно. Ниже разобраны типичные сценарии и способы устранения.
Где искать источник ошибки
Первое действие — получить точное место возникновения. Если ошибка появляется в диалоговом окне, нажмите «Подробно» — платформа покажет фрагмент кода или контекст, где произошло преобразование. Если сообщение приходит пользователю при работе с документом или отчётом, попросите воспроизвести действие и зафиксируйте точный момент.
Для файловых баз и серверных решений полезен технологический журнал или журнал регистрации: там фиксируется контекст ошибки с указанием модуля и строки. В конфигураторе можно открыть указанный модуль и найти место, где значение преобразуется в дату: явный вызов Дата("..."), присвоение реквизиту типа Дата строкового значения или выражение в запросе.
Типичные места, которые стоит проверить в первую очередь: обработчики загрузки данных из файлов, обмены с другими системами, процедуры проведения документов, где дата формируется из строки, параметры отчётов на СКД и запросы с функцией ДАТАВРЕМЯ().
Откройте модуль из сообщения об ошибке и проверьте аргументы преобразования
Проверьте параметры запроса и значения полей, участвующих в приведении
Откройте схему компоновки и проверьте вычисляемые поля и параметры
Проверьте формат дат в источнике: разделители, порядок дня и месяца, пустые значения
Исправление в коде на встроенном языке
Самая частая причина в коде — вызов конструктора даты из строки: Дата("31.12.2023"). Платформа ожидает строку в каноническом формате «ГГГГММДДччммсс» (или его часть): Дата("20231231"). Строка «31.12.2023» с точками и «русским» порядком дня и месяца не распознаётся — отсюда и ошибка.
Правильные варианты: использовать канонический формат Дата("20231231"), собирать дату из чисел Дата(2023, 12, 31) или парсить строку вручную, разбирая её по разделителям и переставляя части. Если строка приходит извне (из файла, сервиса), не полагайтесь на автоматическое преобразование — разберите её явно.
Вторая типичная ситуация — присвоение строкового значения реквизиту типа Дата. Платформа пытается выполнить неявное преобразование и завершается ошибкой, если строка не в каноническом формате. Решение то же: преобразуйте значение заранее контролируемым способом.
Для защиты кода от падения используйте попытку преобразования через конструкцию Попытка ... Исключение или предварительную проверку строки. Универсальный приём — функция безопасного преобразования, которая возвращает пустую дату Дата(1,1,1) при неудаче, а не прерывает выполнение.
Функция СтрокаВДату(СтрокаДаты)
Попытка
Возврат Дата(СтрокаДаты);
Исключение
Возврат Дата(1,1,1); // пустая дата вместо падения
КонецПопытки;
КонецФункцииИсправление в запросах
В запросах ошибка возникает при использовании конструкции ДАТАВРЕМЯ(&Параметр), если параметр имеет неподходящий тип, или при передаче строки туда, где ожидается дата. Также проблему создаёт сравнение поля типа Дата со строковым литералом — платформа пытается привести строку к дате и терпит неудачу.
Проверьте параметры запроса: если параметр объявлен как строка или тип не задан явно, а в запросе он используется как дата, задайте тип через Запрос.УстановитьПараметр("Период", ДатаЗначение), передавая именно значение типа Дата, а не строку. Для литералов внутри текста запроса используйте конструктор ДАТАВРЕМЯ(2023, 12, 31) с числовыми аргументами.
Отдельный случай — поля составного типа. Если реквизит может хранить и строку, и дату, приведение ВЫРАЗИТЬ(Поле КАК Дата) выполняется корректно только для значений, реально являющихся датами; строки при этом преобразуются в пустую дату, а не вызывают ошибку, но логика отбора может сломаться. Проверяйте тип значения через ТИПЗНАЧЕНИЯ() перед приведением.
Исправление в отчётах на СКД
В схеме компоновки данных ошибка чаще всего сидит в параметрах типа Дата, в которые пользователь или код передаёт строку, а также в вычисляемых полях и выражениях ресурсов, где выполняется преобразование. Если отчёт падает сразу при формировании — смотрите параметры; если при выводе конкретных строк — вычисляемые поля.
Откройте схему компоновки отчёта в конфигураторе или через «Изменить вариант» → «Расширенные настройки» (если доступ разрешён). Проверьте: тип параметров даты, выражения вычисляемых полей, настройки отборов, где значение сравнивается с датой. Строковое значение в отборе по полю типа Дата — типовая причина.
Если отчёт формируется программно, проверьте код установки параметров: значения должны передаваться как ТекущаяДатаСеанса(), НачалоДня(Дата) и т. п., а не как строки вида «01.01.2023». После исправления сформируйте отчёт повторно и убедитесь, что данные выводятся без исключений.
- 1Воспроизведите ошибку и зафиксируйте точный текст сообщения и место (код, запрос, отчёт)
- 2Найдите значение, которое преобразуется в дату: выведите его в сообщение или посмотрите в отладчике
- 3Определите фактический тип и формат значения: строка, число, пустое значение
- 4Исправьте источник данных или добавьте безопасное преобразование с обработкой исключения
- 5Проверьте результат на граничных случаях: пустая строка, дата с точками, дата в формате ДД.ММ.ГГГГ и ГГГГ-ММ-ДД
Проблемы при загрузке данных из внешних источников
Загрузка из Excel, CSV, DBF и веб-сервисов — самый массовый источник этой ошибки. Внешние системы хранят даты в произвольных форматах: «31.12.2023», «12/31/2023», «2023-12-31T00:00:00», а иногда как числовое представление (в Excel дата может храниться как число дней от базовой даты). Прямая передача такого значения в реквизит типа Дата вызывает ошибку преобразования.
Надёжный подход — нормализовать значение на этапе чтения: определить формат источника, разобрать строку по разделителям, собрать дату из числовых частей через Дата(Год, Месяц, День). Для форматов с разделителями удобно СтрРазделить(), для ISO-формата из веб-сервисов — обрезка строки до первых 8–14 символов с перестановкой частей.
Обратите внимание на пустые ячейки и значения вида «-» или «н/д»: их нужно отлавливать до преобразования и подставлять пустую дату или пропускать запись. Иначе обработка упадёт на первой же проблемной строке файла, и загрузка прервётся.
Типичные ошибки при устранении
Самая распространённая ошибка — лечить симптом, а не причину: обернуть вызов в Попытка...Исключение и забыть. Ошибка перестаёт появляться, но в базу попадают пустые даты, что позже ломает отчёты, проведение документов и обмены. Обработка исключения должна сопровождаться логированием проблемного значения.
Вторая ошибка — использование Формат() с последующим преобразованием обратно в дату. Функция Формат() возвращает строку в локальном представлении, которое зависит от региональных настроек сеанса. На другом компьютере или под другим пользователем та же строка может не преобразоваться обратно. Храните и передавайте даты как значения типа Дата, а не как строки.
Третья ошибка — игнорирование состава даты: тип Дата в 1С может содержать только дату, только время или дату и время. При сравнении дат с временем сравнение «на равенство» часто не срабатывает, и разработчик пытается «починить» это преобразованиями, порождая новые ошибки. Используйте НачалоДня() и КонецДня() для сравнений по дате.
Как проверить, что проблема решена
После исправления прогоните сценарий, который вызывал ошибку, на исходных данных. Затем проверьте граничные случаи: пустое значение, строка с точками, строка в ISO-формате, дата без времени, дата с временем. Все варианты должны обрабатываться без исключений, а результат — попадать в базу корректно.
Полезно временно добавить вывод преобразуемого значения через Сообщить() или запись в журнал регистрации — так вы увидите, какие именно данные приходят на вход, и убедитесь, что нормализация работает. После проверки отладочный вывод уберите или переведите на уровень, не видимый пользователям.
Если ошибка была в отчёте, сформируйте его с разными параметрами периода и убедитесь, что данные выводятся полностью. Если в обмене — выполните тестовую выгрузку и загрузку и сверьте даты в документах на обеих сторонах.
Как проверить результат
Действие завершается без сообщения об ошибке
Ошибка преобразования появляется снова
Даты заполнены и соответствуют источнику
Появились пустые даты 01.01.0001 там, где должны быть реальные
Пустые строки и нестандартные форматы обрабатываются контролируемо
Обработка падает на пустом или нестандартном значении
Отчёт формируется, обмен завершается, даты совпадают
Исключения в СКД или расхождения дат после обмена
Если ошибка возникает только у одного пользователя, проверьте региональные настройки его сеанса и введённые вручную значения: ручной ввод даты в нестандартном виде в поле со строковым типом — частая причина, которая не воспроизводится у остальных.
Частые вопросы
Почему Дата("31.12.2023") вызывает ошибку, а Дата("20231231") работает?
Конструктор даты из строки принимает только канонический формат ГГГГММДДччммсс (время можно опустить). Строки с точками, слэшами и порядком «день-месяц-год» платформа не распознаёт. Разберите такую строку по разделителям и соберите дату через Дата(Год, Месяц, День).
Ошибка появляется в типовом отчёте, который раньше работал. Что изменилось?
Чаще всего изменились параметры: в параметр типа Дата попала строка или пустое значение, либо в базе появились записи с нестандартными данными, которые попадают в вычисляемое поле. Сравните настройки варианта отчёта с типовыми и проверьте данные за проблемный период.
Можно ли отключить эту ошибку настройкой платформы?
Нет, это не отключаемое исключение: платформа всегда прерывает выполнение при невозможном преобразовании. Единственный способ — исправить данные или код. Обработка через Попытка/Исключение допустима, но только с логированием проблемного значения.
Дата из Excel загружается как число. Как её преобразовать?
Excel хранит даты как количество дней от базовой даты. Если при чтении через COM-объект или табличный документ значение пришло числом, лучше считывать ячейку с учётом её формата (свойство Text у COM-ячейки) или явно пересчитывать число в дату с учётом базовой даты Excel. Проверьте результат на нескольких известных датах из файла.
Ошибка возникает только при обмене между базами. Где искать?
Проверьте правила конвертации: свойство типа Дата может выгружаться как строка в произвольном формате и не распознаваться при загрузке. Убедитесь, что в правилах для дат используется канонический формат, и протестируйте обмен на небольшом пакете данных с записью в журнал.
Чем пустая дата отличается от ошибки преобразования?
Пустая дата (01.01.0001) — корректное значение, которое не вызывает ошибки. Ошибка возникает только когда значение невозможно интерпретировать как дату. Поэтому в безопасных функциях преобразования при неудаче возвращают именно пустую дату, а не прерывают выполнение.
Что важно запомнить
Ошибка преобразования к типу Дата — следствие некорректного входного значения, а не сбой платформы. Найдите место преобразования, проверьте формат и тип значения, исправьте источник данных или добавьте контролируемое преобразование с логированием. Не маскируйте ошибку пустой обработкой исключений и не передавайте даты строками между системами.