Разработка и Конфигурация · 13 мин
Преобразование значения к типу Число не может быть выполнено в 1С: причины и решение
Разбираем ошибку преобразования к типу Число в 1С: причины, типичные сценарии в коде и данных, способы исправления и профилактики с примерами.
Ошибка «Преобразование значения к типу Число не может быть выполнено» — одно из самых частых сообщений платформы 1С:Предприятие. Она возникает в момент, когда программа пытается автоматически или явно превратить строку, дату, значение NULL или другой тип данных в число, но содержимое не соответствует числовому формату. Платформа прерывает выполнение кода и показывает пользователю окно с текстом ошибки, а в технологическом журнале фиксируется место возникновения.
Проблема может проявиться у обычного пользователя при проведении документа, формировании отчёта или загрузке данных из Excel, а также у разработчика при отладке обработок и обменов. Источник почти всегда один: в переменной, реквизите или поле запроса оказалось значение, которое нельзя интерпретировать как число — пустая строка, текст, NULL из запроса или строка с неподходящими символами.
Хорошая новость в том, что ошибка диагностируется быстро: текст сообщения обычно указывает процедуру и строку модуля, где произошло преобразование. Дальше остаётся найти, откуда пришло «нечисловое» значение, и либо исправить данные, либо добавить проверку в код. Ниже разберём все типовые сценарии и способы устранения.
Что означает эта ошибка и когда она возникает
Встроенный язык 1С выполняет неявное преобразование типов во многих операциях: при сложении строки с числом, при вызове функции Число(), при сравнении значений разных типов, при присваивании значения реквизиту числового типа. Если исходное значение невозможно интерпретировать как число, платформа генерирует исключение с формулировкой «Преобразование значения к типу Число не может быть выполнено».
Типичные триггеры: функция Число("12а"), арифметическая операция с пустой строкой, попытка записать текст в числовой реквизит, вычисление в запросе над полем, содержащим NULL. В управляемых формах ошибка часто всплывает при вводе данных пользователем в поле, связанное с числовым реквизитом, если перед записью значение проходит через строковую обработку.
Важно понимать, что это не сбой платформы, а защитная реакция: 1С отказывается «угадывать», какое число имелось в виду, и останавливает выполнение, чтобы не записать в базу некорректные данные. Поэтому игнорировать или «заглушать» ошибку без разбора причины нельзя.
Как найти место возникновения ошибки
Первый шаг — прочитать полный текст сообщения. В большинстве случаев окно ошибки содержит имя модуля и номер строки, например: {ОбщийМодуль.Расчеты.Модуль(245)}: Преобразование значения к типу Число не может быть выполнено. Если ошибка возникла во внешней обработке, будет указано её имя.
Если текст ошибки урезан, включите технологический журнал или воспроизведите ситуацию под отладчиком. В конфигураторе установите точку останова на указанной строке и посмотрите значения переменных в момент падения — чаще всего там окажется пустая строка, NULL или текстовое представление с лишними символами.
Для ошибок, возникающих у пользователей при проведении документов, полезно открыть «Администрирование → Поддержка и обслуживание → Журнал регистрации» и найти событие с ошибкой — там фиксируется контекст: пользователь, документ, время. Это помогает понять, на каких данных падает код.
- 1Скопируйте полный текст ошибки и найдите в нём имя модуля и номер строки
- 2Откройте указанный модуль в конфигураторе и перейдите к строке
- 3Установите точку останова и воспроизведите ошибку под отладкой
- 4Проверьте значения переменных, участвующих в преобразовании
- 5Определите источник проблемного значения: реквизит, запрос, файл, ввод пользователя
- 6Исправьте данные или добавьте проверку перед преобразованием
Типичные причины и сценарии
Пустая строка или строка с нечисловыми символами
Функция Число() корректно обрабатывает только строки, содержащие цифры, один разделитель дробной части и, при необходимости, знак минус. Значения вроде "", " ", "1 200,50" (с пробелом-разделителем разрядов), "12,5%" или "н/д" вызовут ошибку. Такие строки часто приходят из Excel, CSV-файлов и веб-сервисов, где числа отформатированы для отображения, а не для обработки.
Значение NULL из запроса
Если в запросе используется левое соединение или обращение к реквизиту через точку («разыменование»), а связанной записи нет, поле возвращает NULL. Попытка сложить NULL с числом или передать его в Число() приводит к ошибке. Это одна из самых частых причин при формировании отчётов и расчётах по остаткам.
Неопределено и значения по умолчанию
Переменная, которой не присвоено значение, имеет тип Неопределено. Арифметические операции с ней также вызывают ошибку преобразования. Сюда же относится чтение реквизита объекта, который не был инициализирован, или получение значения из соответствия/структуры по несуществующему ключу.
Данные из обменов и загрузок
При загрузке из Excel, DBF, XML или при обмене между базами числовые поля нередко приходят как строки. Если в файле ячейка пуста, содержит прочерк или текст вроде «отсутствует», прямое преобразование падает. Особенно коварны неразрывные пробелы (код 160) вместо обычных — визуально строка выглядит как число, но преобразоваться не может.
Проверить СокрЛП() и длину строки перед преобразованием
Использовать ЕСТЬNULL() в тексте запроса
Заменить Символ(160) на пустую строку
Добавить проверку содержимого перед Число()
Как исправить ошибку в коде
Базовый приём — проверять значение до преобразования. Для строк удобно написать функцию-помощник, которая очищает строку от пробелов и неразрывных пробелов, заменяет запятую на точку при необходимости и проверяет результат.
Функция СтрокаВЧисло(СтрокаЗначение)
Стр = СтрЗаменить(СтрокаЗначение, Символ(160), "");
Стр = СокрЛП(СтрЗаменить(Стр, " ", ""));
Стр = СтрЗаменить(Стр, ",", ".");
Если Не ЗначениеЗаполнено(Стр) Тогда
Возврат 0;
КонецЕсли;
Попытка
Возврат Число(Стр);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Обратите внимание на нюанс: Число() принимает точку как разделитель дробной части независимо от региональных настроек кода, а вот данные из файлов часто содержат запятую. Поэтому замена разделителя — обязательный шаг при загрузках.
Для значений из запросов проблему решает функция языка запросов ЕСТЬNULL(Поле, 0) — она подставляет ноль вместо NULL ещё на уровне выборки, и дальше в коде преобразование не требуется. Если NULL может прийти в переменную, проверяйте: Если Значение = NULL Тогда ... или используйте ЗначениеЗаполнено() с учётом того, что для чисел ноль считается незаполненным.
// Безопасное преобразование с обработкой NULL
Значение = ЕСТЬNULL(Выборка.Сумма, 0);
// или в коде:
Если Выборка.Сумма = NULL Тогда
Сумма = 0;
Иначе
Сумма = Выборка.Сумма;
КонецЕсли;Исправление ошибки в запросах
В языке запросов 1С преобразование типов выполняется неявно — например, при арифметике над полями разных типов или при использовании ВЫРАЗИТЬ(Поле КАК Число(15,2)). Если поле хранит строку, содержащую нечисловые значения (в регистрах сведений с составным типом, в реквизитах составного типа), выражение падает с той же ошибкой.
Решение — отфильтровать проблемные значения до выражения или привести данные к однородному типу. Для составных реквизитов помогает проверка ВЫБОР КОГДА Поле ССЫЛКА ... ТОГДА ... ИНАЧЕ 0 КОНЕЦ либо отбор ГДЕ ТипЗначения(Поле) = Тип(Число) через таблицу значений-посредника. В типовых отчётах на СКД подобные ошибки чаще всего лечатся добавлением ЕСТЬNULL в вычисляемых полях и ресурсах.
Отдельный случай — виртуальные таблицы регистров: если в расчёте участвует измерение или реквизит, по которому нет данных, результат может содержать NULL. Всегда оборачивайте суммируемые поля в ЕСТЬNULL при соединениях.
Ошибка у пользователя: что делать без программирования
Если ошибка возникает при проведении конкретного документа, откройте его и проверьте все числовые поля: количество, цену, сумму, ставки. Частая ситуация — в табличную часть попала строка с незаполненным количеством, а в модуле проведения значение используется в арифметике без проверки. Заполните поле или удалите пустую строку и проведите документ снова.
При ошибке в отчёте проверьте настройки отбора и период: иногда отчёт падает только на данных конкретного периода, где есть «битые» записи — например, документ с незаполненным реквизитом, участвующим в расчёте. Найдите такой документ последовательным сужением периода и исправьте данные.
Если ошибка появилась после обновления конфигурации или установки внешней обработки и вы не разработчик — зафиксируйте полный текст ошибки (кнопка «Подробно» в окне сообщения) и передайте специалисту по сопровождению. Самостоятельно править модули типовой конфигурации не стоит: это усложнит последующие обновления.
Профилактика: как не допустить повторения
Основное правило для разработчика — никогда не преобразовывать в число данные, полученные извне (файлы, сервисы, ввод пользователя), без предварительной проверки. Все загрузки оформляйте через единую функцию безопасного преобразования, подобную приведённой выше, и логируйте строки, которые не удалось преобразовать, чтобы пользователь мог исправить источник.
В запросах систематически применяйте ЕСТЬNULL для всех полей из левых соединений и разыменований. Для реквизитов составного типа по возможности ограничивайте состав типов на этапе проектирования — чем уже тип, тем меньше неявных преобразований.
Полезно также включить проверку заполненности числовых реквизитов в обработчиках ОбработкаПроверкиЗаполнения документов — тогда пользователь получит понятное сообщение «не заполнено поле Количество» вместо критичной ошибки преобразования при проведении.
Проверка результата после исправления
После внесения изменений воспроизведите исходный сценарий на тех же данных: проведите документ, сформируйте отчёт за проблемный период, повторите загрузку файла. Ошибка должна исчезнуть, а расчётные значения — совпасть с ожидаемыми. Если вы добавили подстановку нуля вместо NULL, убедитесь, что это не исказило итоги: сравните суммы отчёта до и после на контрольном примере.
Для загрузок из файлов проверьте журнал или протокол загрузки: все ли строки обработаны, нет ли пропущенных из-за нечисловых значений. Хорошая практика — выводить пользователю список строк с ошибками преобразования, чтобы он мог исправить исходный файл, а не догадываться о потерянных данных.
Как проверить результат
Документ проводится, отчёт формируется без ошибок
Ошибка возникает снова на тех же данных
Суммы совпадают с ожидаемыми или с прошлым периодом
Итоги изменились без объективных причин — возможно, NULL заменён нулём там, где нужно было искать данные
Все строки файла обработаны, ошибки перечислены явно
Часть строк пропущена без уведомления
Частые вопросы
Почему Число("1 200") выдаёт ошибку, хотя это явно число?
Потому что строка содержит пробел (обычный или неразрывный) в качестве разделителя разрядов. Функция Число() принимает только цифры, один разделитель дробной части и знак. Перед преобразованием удалите пробелы и неразрывные пробелы (Символ(160)) из строки.
Ошибка возникает только у одного пользователя. В чём причина?
Скорее всего, дело в данных, с которыми работает именно он: конкретный документ, контрагент или период содержит незаполненный реквизит. Реже причина в региональных настройках рабочего места, влияющих на формат вводимых чисел. Воспроизведите ошибку под его сеансом и проверьте журнал регистрации.
Можно ли просто обернуть код в Попытка/Исключение и забыть?
Технически можно, но это скроет проблему, а не решит её: вместо реального значения в расчёт попадёт ноль или незаполненная переменная, и итоги отчётов станут недостоверными. Попытка уместна только вместе с логированием и понятным значением по умолчанию.
Чем ЕСТЬNULL отличается от проверки в коде?
ЕСТЬNULL работает на уровне запроса и подставляет значение ещё при выборке — это быстрее и надёжнее, чем проверять каждую строку в цикле. Проверка в коде нужна, когда значение приходит не из запроса: из файла, формы, сервиса.
Ошибка появилась после обновления типовой конфигурации. Что делать?
Вероятно, обновление изменило логику расчёта, а в базе есть старые данные с незаполненными реквизитами. Найдите документы проблемного периода с пустыми числовыми полями и заполните их. Если конфигурация доработана — проверьте, не конфликтует ли доработка с новым типовым кодом.
Что важно запомнить
Ошибка преобразования к типу Число всегда указывает на значение, которое числом не является: пустую строку, текст, NULL или строку с лишними символами. Находите место по тексту ошибки, проверяйте источник значения, используйте ЕСТЬNULL в запросах и безопасное преобразование с проверкой для внешних данных. Не скрывайте ошибку пустой Попыткой и не правьте типовой код без резервной копии.