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

В этой статье разберём, как программно и вручную очищать числа от пробелов в разных сценариях: от простых действий в пользовательском режиме до сложных обработок на встроенном языке. Особое внимание уделим нюансам, которые приводят к ошибкам типа"Недопустимое значение" или"Ошибка приведения типа" — их часто упускают даже опытные специалисты.

Проблема усложняется тем, что в 1С 8.3 пробелы могут появляться не только из-за человеческого фактора, но и при автоматической выгрузке данных из некоторых внешних систем (например, Банк-Клиент или ЕГАИС). При этом стандартные функции вроде Число или Значение не всегда справляются с очисткой — требуются дополнительные манипуляции со строкой.

📊 Как часто вы сталкиваетесь с пробелами в числовых данных 1С?
Ежедневно
Раз в неделю
Редико
Никогда

1. Почему пробелы в числах — это проблема?

На первый взгляд, пробел в числе (например, "1 000 500" вместо "1000500") кажется безобидным форматированием. Однако в это приводит к серьёзным последствиям:

Во-первых, система воспринимает такое значение как строку, а не как число. Это означает, что вы не сможете:

  • 📊 Сложить или умножить значение в отчётах (получите ошибку "Оператор не применим к операнду такого типа")
  • 🔍 Использовать его в запросах с условиями типа "ГДЕ Сумма > 1000"
  • 📈 Применять математические функции встроенного языка (например, Окр или Цел)

Во-вторых, пробелы могут неявно искажать данные. Например, при загрузке из Excel число "1 000" после удаления пробела станет "1000" — но если это была дата в формате "DD MM YYYY", результат будет катастрофическим.

В-третьих, некоторые типовые конфигурации (например, 1С:Бухгалтерия или 1С:ЗУП) автоматически блокируют сохранение документов, если в числовых полях обнаружены недопустимые символы. Пользователь увидит сообщение вроде:

⚠️ Внимание: Поле"Сумма" содержит недопустимые символы. Разрешены только цифры, точка или запятая в качестве разделителя.

2. Ручное удаление пробелов (для пользователей)

Если вы не программист и нужно срочно исправить несколько записей, воспользуйтесь этими методами без написания кода.

Способ 1: Замена через буфер обмена

  1. Скопируйте проблемное число (например, 1 234 567,89) в буфер обмена (Ctrl+C).
  2. Вставьте его в Блокнот или любой текстовый редактор.
  3. Удалите пробелы вручную или используйте замену (Ctrl+H): замените пробел ("") на ничего.
  4. Скопируйте очищенное число обратно в 1С.

Способ 2: Использование калькулятора 1С

В некоторых конфигурациях (например, 1С:УТ 11) есть встроенный калькулятор, который автоматически игнорирует пробелы:

  • 🖱️ Кликните правой кнопкой по полю с числом → выберите "Калькулятор".
  • 📝 Вставьте значение с пробелами — система проигнорирует их при расчёте.
  • 🔄 Скопируйте результат обратно в поле.
💡

Если пробелы появляются при импорте из Excel, настройте формат ячеек как"Текстовый" перед копированием — это предотвратит автоматическое добавление разделителей.

Способ 3: Массовая замена в табличных частях

Для обработки нескольких строк одновременно:

  1. Выделите столбец с числами в табличной части документа.
  2. Нажмите Ctrl+F → перейдите на вкладку "Замена".
  3. В поле "Что" введите пробел, в поле "Чем" оставьте пусто.
  4. Нажмите "Заменить всё".
⚠️ Внимание: Этот метод работает только для строковых полей. Если поле имеет тип"Число", замена может не сработать — потребуется временно изменить тип данных или использовать обработку.

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

При получении данных через HTTPЗапрос очищайте ответ сразу после парсинга:

Ответ = HTTPЗапрос.Получить;

Данные = JSON.Прочитать(Ответ.ПолучитьТекст);

Для Каждого Элемент Из Данные.Список Цикл

Элемент.Цена = СтрЗаменить(Элемент.Цена,"","");

КонецЦикла;

Что делать если пробелы не удаляются?

Иногда пробелы в данных — это не стандартные символы, а неразрывные пробелы (код 160). В этом случае используйте:

Строка = СтрЗаменить(Строка, Символ(160),"");

Или для универсальной очистки:

РегВыражение = Новый РегулярноеВыражение("[^\d.,-]");

Строка = РегВыражение.Заменить(Строка,"");

Этот шаблон удаляет всё, кроме цифр, точки, запятой и знака минуса.

6. Типовые ошибки и как их избежать

Даже опытные разработчики допускают ошибки при очистке чисел от пробелов. Вот самые распространённые ловушки:

Ошибка Причина Решение
"Ошибка приведения значения к типу Число" После удаления пробелов остались другие недопустимые символы (например, буквы или знаки валюты) Используйте регулярные выражения для полной очистки: РегВыражение("\D") (удалит всё кроме цифр)
Неверный результат в отчётах Пробелы удалены, но остался неразрывный пробел ( ) Заменяйте все пробельные символы: СтрЗаменить(Строка, Символ(160),"")
Зависание при массовой обработке Цикл очистки работает без оптимизации для больших данных Используйте пакетную обработку или временные таблицы
Потеря точности Число с пробелами содержало разделитель дробной части (например, "1 000,50"), который тоже удалили Очищайте только пробелы, сохраняя "," или "." в зависимости от региональных настроек

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

Разделитель =?(НСтр("ru_RU") ="ru_RU","",","); // Для России пробел, для Европы запятая

Строка = СтрЗаменить(Строка, Разделитель,"");

7. Готовые обработки для массовой очистки

Если пробелы уже попали в базу и нужно исправить тысячи записей, используйте специализированные обработки. Вот несколько проверенных решений:

Обработка 1: Универсальный очиститель чисел

Скачайте обработку "Удаление пробелов из числовых полей" из каталога 1С:ИТС (раздел"Обработки для администрирования"). Она позволяет:

  • 🔍 Сканировать указанные справочники и документы
  • 📊 Просматривать список полей с пробелами
  • ✅ Массово очищать данные с предварительным бэкапом

Обработка 2: Проверка и исправление реквизитов

В 1С:Бухгалтерия 3.0 есть встроенная обработка "Проверка данных" (Администрирование → Обслуживание → Проверка данных), которая находит некорректные числовые значения.

Обработка 3: Скрипт для конфигуратора

Для разработчиков — готовый скрипт для выполнения в конфигураторе:

Процедура ОчиститьЧислаВоВсехДокументах

Метаданные = Метаданные;

Для Каждого Документ Из Метаданные.Документы Цикл

Запрос = Новый Запрос;

Запрос.Текст ="ВЫБРАТЬ Ссылка ИЗ" + Документ.Имя +" ГДЕ НЕ ПУСТАЯ Ссылка";

Результат = Запрос.Выполнить;

Пока Результат.Следующий Цикл

Объект = Результат.Ссылка.ПолучитьОбъект;

Для Каждого Реквизит Из Объект.Метаданные.Реквизиты Цикл

Если Реквизит.Тип = Тип("Число") Тогда

Значение = Объект[Реквизит.Имя];

Если ТипЗнч(Значение) = Тип("Строка") Тогда

Объект[Реквизит.Имя] = Число(СтрЗаменить(Значение,"",""));

КонецЕсли;

КонецЕсли;

КонецЦикла;

Объект.Записать;

КонецЦикла;

КонецЦикла;

КонецПроцедуры

⚠️ Внимание: Массовая обработка данных может заблокировать базу. Выполняйте её в нерабочее время или на тестовой копии.

8. Профилактика появления пробелов

Лучший способ борьбы с пробелами — предотвратить их появление. Вот ключевые меры профилактики:

Настройка полей в конфигураторе

  • 🔧 Для числовых реквизитов устанавливайте свойство "Только числа" (в свойствах реквизита на вкладке "Дополнительно")
  • 📏 Ограничивайте длину поля, если возможный диапазон значений известен
  • 🛡️ Используйте события "ПередЗаписью" для автоматической очистки:
Процедура ПередЗаписью(Отказ)

Для Каждого Реквизит Из Метаданные.Реквизиты Цикл

Если Реквизит.Тип = Тип("Число") Тогда

Если ТипЗнч(ЭтотОбъект[Реквизит.Имя]) = Тип("Строка") Тогда

ЭтотОбъект[Реквизит.Имя] = Число(СтрЗаменить(ЭтотОбъект[Реквизит.Имя],"",""));

КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Настройка обменов данными

  • 🔄 В правилах обмена (например, в Конвертации данных 2.0) добавьте преобразование для числовых полей
  • 📥 При импорте из Excel используйте обработку "Загрузка данных из табличного документа" с галочкой "Преобразовывать числа"

Обучение пользователей

  • 🎓 Проведите инструктаж по правильному копированию данных (например, через Специальная вставка → Текст в Excel)
  • 📋 Разместите памятку на рабочем столе с примером: "1000" — правильно,"1 000" — неправильно
💡

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

Как удалить пробелы из числа в отчёте 1С?

В отчёте используйте выражение в колонке:

Выражение: Число(СтрЗаменить(ПолеСПробелами,"",""))

Тип: Число

Если пробелы появляются в результате вычислений, добавьте обработку в модуль отчёта:

Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, Поле, Значение)

Если Поле.Имя ="Сумма" Тогда

Значение = Число(СтрЗаменить(Значение,"",""));

КонецЕсли;

КонецПроцедуры

Можно ли настроить 1С, чтобы пробелы автоматически удалялись при вводе?

Да, для этого:

  1. Откройте конфигуратор и найдите форму документа/справочника.
  2. Добавьте обработчик события "ПриИзменении" для числового поля:
Процедура СуммаПриИзменении(Элемент)

Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда

Элемент.Значение = СтрЗаменить(Элемент.Значение,"","");

КонецЕсли;

КонецПроцедуры

Для глобального применения используйте подсистему "Управляемые формы" и настройте шаблон поведения для всех числовых полей.

Почему после удаления пробелов число становится отрицательным?

Это происходит, если в строке был знак минус, отделенный пробелом (например, "100 -50"). В этом случае:

  1. Проверьте исходную строку на наличие математических операторов.
  2. Используйте регулярное выражение для корректного парсинга:
    РегВыражение = Новый РегулярноеВыражение("(\d[\d\s]*)");
    

    СтрокаЧисла = РегВыражение.Найти(ИсходнаяСтрока).Значение;

    Число = Число(СтрЗаменить(СтрокаЧисла,"",""));

Как очистить пробелы в числах при выгрузке в Excel?

При выгрузке через ЗаписьXML или ТабличныйДокумент используйте:

Для Каждого Строка Из ВыгружаемыеДанные Цикл

Строка.Сумма = СтрЗаменить(Строка.Сумма,"","");

КонецЦикла;

Для Универсального Формата Обмена настройте преобразование в правилах выгрузки:

&НаСервере

Процедура ПриВыгрузкеДанных(Данные)

Для Каждого Строка Из Данные Цикл

Если Строка.Свойство("Сумма") Тогда

Строка.Сумма = СтрЗаменить(Строка.Сумма,"","");

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Работает ли СтрЗаменить с неразрывными пробелами?

Нет, СтрЗаменить не удаляет неразрывные пробелы (код 160). Для их обработки используйте:

Строка = СтрЗаменить(Строка, Символ(160),"");

// Или универсальный вариант:

РегВыражение = Новый РегулярноеВыражение("\s");

Строка = РегВыражение.Заменить(Строка,"");

Неразрывные пробелы часто встречаются в данных, скопированных из PDF или веб-страниц.