Проблема с пробелами в числовых полях — одна из самых распространённых головных болей при работе в 1С:Предприятие. Пользователи случайно копируют данные из Excel или внешних источников, где числа форматируются с разделителями тысяч, а система воспринимает их как строки. Разработчики сталкиваются с ошибками при загрузке данных или обмене с другими системами, где пробелы ломают логику обработки. В результате — сбои в отчётах, некорректные расчёты и потеря времени на ручную правку.
В этой статье разберём, как программно и вручную очищать числа от пробелов в разных сценариях: от простых действий в пользовательском режиме до сложных обработок на встроенном языке. Особое внимание уделим нюансам, которые приводят к ошибкам типа"Недопустимое значение" или"Ошибка приведения типа" — их часто упускают даже опытные специалисты.
Проблема усложняется тем, что в 1С 8.3 пробелы могут появляться не только из-за человеческого фактора, но и при автоматической выгрузке данных из некоторых внешних систем (например, Банк-Клиент или ЕГАИС). При этом стандартные функции вроде Число или Значение не всегда справляются с очисткой — требуются дополнительные манипуляции со строкой.
1. Почему пробелы в числах — это проблема?
На первый взгляд, пробел в числе (например, "1 000 500" вместо "1000500") кажется безобидным форматированием. Однако в 1С это приводит к серьёзным последствиям:
Во-первых, система воспринимает такое значение как строку, а не как число. Это означает, что вы не сможете:
- 📊 Сложить или умножить значение в отчётах (получите ошибку
"Оператор не применим к операнду такого типа") - 🔍 Использовать его в запросах с условиями типа
"ГДЕ Сумма > 1000" - 📈 Применять математические функции встроенного языка (например,
ОкрилиЦел)
Во-вторых, пробелы могут неявно искажать данные. Например, при загрузке из Excel число "1 000" после удаления пробела станет "1000" — но если это была дата в формате "DD MM YYYY", результат будет катастрофическим.
В-третьих, некоторые типовые конфигурации (например, 1С:Бухгалтерия или 1С:ЗУП) автоматически блокируют сохранение документов, если в числовых полях обнаружены недопустимые символы. Пользователь увидит сообщение вроде:
⚠️ Внимание: Поле"Сумма" содержит недопустимые символы. Разрешены только цифры, точка или запятая в качестве разделителя.
2. Ручное удаление пробелов (для пользователей)
Если вы не программист и нужно срочно исправить несколько записей, воспользуйтесь этими методами без написания кода.
Способ 1: Замена через буфер обмена
- Скопируйте проблемное число (например,
1 234 567,89) в буфер обмена (Ctrl+C). - Вставьте его в Блокнот или любой текстовый редактор.
- Удалите пробелы вручную или используйте замену (
Ctrl+H): замените пробел ("") на ничего. - Скопируйте очищенное число обратно в 1С.
Способ 2: Использование калькулятора 1С
В некоторых конфигурациях (например, 1С:УТ 11) есть встроенный калькулятор, который автоматически игнорирует пробелы:
- 🖱️ Кликните правой кнопкой по полю с числом → выберите
"Калькулятор". - 📝 Вставьте значение с пробелами — система проигнорирует их при расчёте.
- 🔄 Скопируйте результат обратно в поле.
Если пробелы появляются при импорте из Excel, настройте формат ячеек как"Текстовый" перед копированием — это предотвратит автоматическое добавление разделителей.
Способ 3: Массовая замена в табличных частях
Для обработки нескольких строк одновременно:
- Выделите столбец с числами в табличной части документа.
- Нажмите
Ctrl+F→ перейдите на вкладку"Замена". - В поле
"Что"введите пробел, в поле"Чем"оставьте пусто. - Нажмите
"Заменить всё".
⚠️ Внимание: Этот метод работает только для строковых полей. Если поле имеет тип"Число", замена может не сработать — потребуется временно изменить тип данных или использовать обработку.
3. Программное удаление пробелов (для разработчиков)
Для автоматизации процесса используйте встроенный язык 1С 8.3. Ниже — универсальные функции, которые работают в большинстве конфигураций.
Метод 1: Функция СтрЗаменить
Самый простой способ — заменить все пробелы на пустую строку:
Функция ОчиститьЧислоОтПробелов(Знач СтроковоеЧисло) Экспорт
Возврат СтрЗаменить(СтроковоеЧисло,"","");
КонецФункции
Пример использования:
ЧислоБезПробелов = ОчиститьЧислоОтПробелов("1 234 567,89");
Сообщить(ЧислоБезПробелов); // Вернёт"1234567,89"
Метод 2: Регулярные выражения
Если пробелы комбинируются с другими недопустимыми символами (например, неразрывными пробелами или табуляциями), используйте регулярные выражения:
Функция ОчиститьЧислоРегуляркой(Знач СтроковоеЧисло) Экспорт
РегВыражение = Новый РегулярноеВыражение("\s");
Возврат РегВыражение.Заменить(СтроковоеЧисло,"");
КонецФункции
Здесь \s удаляет все пробельные символы, включая неразрывные пробелы ( ) и табуляции.
Метод 3: Преобразование с проверкой типа
Чтобы избежать ошибок приведения типа, комбинируйте очистку с проверкой:
Функция БезопасноеПреобразованиеВЧисло(Знач СтроковоеЧисло) Экспорт
СтроковоеЧисло = СтрЗаменить(СтроковоеЧисло,"","");
Попытка
Возврат Число(СтроковоеЧисло);
Исключение
Возврат Неопределено; // или 0, в зависимости от логики
КонецПопытки;
КонецФункции
Удалить все пробелы|Заменить запятую на точку (если нужно)|Проверить на пустую строку|Обработать исключение при ошибке-->
4. Обработка пробелов в запросах 1С
Если пробелы попадают в данные, которые используются в запросах, их нужно очищать в тексте запроса. Например, при выборке из регистра счисления, где суммы хранятся как строки:
Пример 1: Замена в секции ВЫБРАТЬ
ВЫБРАТЬ
СтрЗаменить(ДокументСумма.Сумма,"","") КАК СуммаБезПробелов
ИЗ
Документ.ПоступлениеТоваров КАК ДокументСумма
Пример 2: Очистка в условии ГДЕ
Если нужно отфильтровать записи, где сумма превышает значение (например, 1 000 000):
ВЫБРАТЬ
*
ИЗ
Документ.РеализацияТоваров
ГДЕ
Число(СтрЗаменить(СуммаДокумента,"","")) > 1000000
Важно: При таком подходе индексы не используются, что может замедлить выполнение запроса на больших базах. Для оптимизации лучше предварительно очищать данные в обработке.
⚠️ Внимание: В некоторых версиях 1С:Предприятие (до 8.3.10) функция СтрЗаменить в запросах работала нестабильно. Если получаете ошибку, перенесите очистку в постобработку результата.
5. Автоматическая очистка при загрузке данных
Чаще всего пробелы попадают в 1С при импорте из внешних источников: Excel, XML, JSON или других систем. Чтобы избежать ручной правки, настройте автоматическую обработку на этапе загрузки.
Сценарий 1: Обработка файла Excel
При чтении данных через ЧтениеXML или ЧтениеJSON добавьте очистку:
Для Каждого Строка Из ТаблицаExcel Цикл
Строка.Сумма = СтрЗаменить(Строка.Сумма,"","");
Если ЗначениеЗаполнено(Строка.Сумма) Тогда
Строка.Сумма = Число(Строка.Сумма);
КонецЕсли;
КонецЦикла;
Сценарий 2: Обмен данными через Универсальный Формат
Если пробелы приходят в УФ-сообщениях, добавьте обработчик в модуле обмена:
Процедура ОбработатьДанныеПередЗаписью(Данные)
Для Каждого Строка Из Данные Цикл
Если Строка.Свойство("СуммаДокумента") Тогда
Строка.СуммаДокумента = СтрЗаменить(Строка.СуммаДокумента,"","");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Сценарий 3: HTTP-сервисы и API
При получении данных через Данные = JSON.Прочитать(Ответ.ПолучитьТекст); Для Каждого Элемент Из Данные.Список Цикл Элемент.Цена = СтрЗаменить(Элемент.Цена,"",""); КонецЦикла;HTTPЗапрос очищайте ответ сразу после парсинга:
Ответ = HTTPЗапрос.Получить;
Что делать если пробелы не удаляются?
Иногда пробелы в данных — это не стандартные символы, а неразрывные пробелы (код 160). В этом случае используйте:
Строка = СтрЗаменить(Строка, Символ(160),"");
Или для универсальной очистки:
РегВыражение = Новый РегулярноеВыражение("[^\d.,-]");
Строка = РегВыражение.Заменить(Строка,"");
Этот шаблон удаляет всё, кроме цифр, точки, запятой и знака минуса.
6. Типовые ошибки и как их избежать
Даже опытные разработчики допускают ошибки при очистке чисел от пробелов. Вот самые распространённые ловушки:
| Ошибка | Причина | Решение |
|---|---|---|
"Ошибка приведения значения к типу Число" |
После удаления пробелов остались другие недопустимые символы (например, буквы или знаки валюты) | Используйте регулярные выражения для полной очистки: РегВыражение("\D") (удалит всё кроме цифр) |
| Неверный результат в отчётах | Пробелы удалены, но остался неразрывный пробел ( ) |
Заменяйте все пробельные символы: СтрЗаменить(Строка, Символ(160),"") |
| Зависание при массовой обработке | Цикл очистки работает без оптимизации для больших данных | Используйте пакетную обработку или временные таблицы |
| Потеря точности | Число с пробелами содержало разделитель дробной части (например, "1 000,50"), который тоже удалили |
Очищайте только пробелы, сохраняя "," или "." в зависимости от региональных настроек |
Ещё одна типичная проблема — неучтённые региональные настройки. В некоторых конфигурациях разделителем тысяч служит не пробел, а запятая или точка (например, в европейских локализациях). В этом случае нужно адаптировать код:
Строка = СтрЗаменить(Строка, Разделитель,"");Разделитель =?(НСтр("ru_RU") ="ru_RU","",","); // Для России пробел, для Европы запятая
7. Готовые обработки для массовой очистки
Если пробелы уже попали в базу и нужно исправить тысячи записей, используйте специализированные обработки. Вот несколько проверенных решений:
Обработка 1: Универсальный очиститель чисел
Скачайте обработку "Удаление пробелов из числовых полей"
- 🔍 Сканировать указанные справочники и документы
- 📊 Просматривать список полей с пробелами
- ✅ Массово очищать данные с предварительным бэкапом
Обработка 2: Проверка и исправление реквизитов
В 1С:Бухгалтерия 3.0"Проверка данных" (Администрирование → Обслуживание → Проверка данных), которая находит некорректные числовые значения.
Обработка 3: Скрипт для конфигуратора
Для разработчиков — готовый скрипт для выполнения в конфигураторе:
Процедура ОчиститьЧислаВоВсехДокументах
Метаданные = Метаданные;
Для Каждого Документ Из Метаданные.Документы Цикл
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ Ссылка ИЗ" + Документ.Имя +" ГДЕ НЕ ПУСТАЯ Ссылка";
Результат = Запрос.Выполнить;
Пока Результат.Следующий Цикл
Объект = Результат.Ссылка.ПолучитьОбъект;
Для Каждого Реквизит Из Объект.Метаданные.Реквизиты Цикл
Если Реквизит.Тип = Тип("Число") Тогда
Значение = Объект[Реквизит.Имя];
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Объект[Реквизит.Имя] = Число(СтрЗаменить(Значение,"",""));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Объект.Записать;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
⚠️ Внимание: Массовая обработка данных может заблокировать базу. Выполняйте её в нерабочее время или на тестовой копии.
8. Профилактика появления пробелов
Лучший способ борьбы с пробелами — предотвратить их появление. Вот ключевые меры профилактики:
Настройка полей в конфигураторе
- 🔧 Для числовых реквизитов устанавливайте свойство
"Только числа"(в свойствах реквизита на вкладке"Дополнительно") - 📏 Ограничивайте длину поля, если возможный диапазон значений известен
- 🛡️ Используйте события
"ПередЗаписью"для автоматической очистки:
Процедура ПередЗаписью(Отказ)
Для Каждого Реквизит Из Метаданные.Реквизиты Цикл
Если Реквизит.Тип = Тип("Число") Тогда
Если ТипЗнч(ЭтотОбъект[Реквизит.Имя]) = Тип("Строка") Тогда
ЭтотОбъект[Реквизит.Имя] = Число(СтрЗаменить(ЭтотОбъект[Реквизит.Имя],"",""));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Настройка обменов данными
Обучение пользователей
Наиболее надёжный способ избежать пробелов — комбинация технических ограничений (настройки полей) и организационных мер (обучение пользователей). В отчёте используйте выражение в колонке:
Тип: Число
"Преобразовывать числа"
Специальная вставка → Текст в Excel)"1000" — правильно,"1 000" — неправильноКак удалить пробелы из числа в отчёте 1С?
Выражение: Число(СтрЗаменить(ПолеСПробелами,"",""))
Если пробелы появляются в результате вычислений, добавьте обработку в модуль отчёта:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, Поле, Значение)
Если Поле.Имя ="Сумма" Тогда
Значение = Число(СтрЗаменить(Значение,"",""));
КонецЕсли;
КонецПроцедуры
Можно ли настроить 1С, чтобы пробелы автоматически удалялись при вводе?
Да, для этого:
- Откройте конфигуратор и найдите форму документа/справочника.
- Добавьте обработчик события
"ПриИзменении"для числового поля:
Процедура СуммаПриИзменении(Элемент)
Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
Элемент.Значение = СтрЗаменить(Элемент.Значение,"","");
КонецЕсли;
КонецПроцедуры
Для глобального применения используйте подсистему "Управляемые формы" и настройте шаблон поведения для всех числовых полей.
Почему после удаления пробелов число становится отрицательным?
Это происходит, если в строке был знак минус, отделенный пробелом (например, "100 -50"). В этом случае:
- Проверьте исходную строку на наличие математических операторов.
- Используйте регулярное выражение для корректного парсинга:
РегВыражение = Новый РегулярноеВыражение("(\d[\d\s]*)");СтрокаЧисла = РегВыражение.Найти(ИсходнаяСтрока).Значение;
Число = Число(СтрЗаменить(СтрокаЧисла,"",""));
Как очистить пробелы в числах при выгрузке в Excel?
При выгрузке через ЗаписьXML или ТабличныйДокумент используйте:
Для Каждого Строка Из ВыгружаемыеДанные Цикл
Строка.Сумма = СтрЗаменить(Строка.Сумма,"","");
КонецЦикла;
Для Универсального Формата Обмена настройте преобразование в правилах выгрузки:
&НаСервере
Процедура ПриВыгрузкеДанных(Данные)
Для Каждого Строка Из Данные Цикл
Если Строка.Свойство("Сумма") Тогда
Строка.Сумма = СтрЗаменить(Строка.Сумма,"","");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Работает ли СтрЗаменить с неразрывными пробелами?
Нет, СтрЗаменить не удаляет неразрывные пробелы (код 160). Для их обработки используйте:
Строка = СтрЗаменить(Строка, Символ(160),"");
// Или универсальный вариант:
РегВыражение = Новый РегулярноеВыражение("\s");
Строка = РегВыражение.Заменить(Строка,"");
Неразрывные пробелы часто встречаются в данных, скопированных из PDF или веб-страниц.