Пробелы в числовых полях 1С:Предприятие 8.3 — одна из самых распространённых проблем, с которой сталкиваются и бухгалтеры, и разработчики. На первый взгляд кажущаяся мелочью, она способна сломать отчёты, исказить расчёты или даже заблокировать проведение документов. Причины появления пробелов разнообразны: от некорректного импорта данных до особенностей форматирования ячеек. Но независимо от источника, решение требует системного подхода.
В этой статье мы разберём 5 проверенных способов удаления пробелов — от простых настроек интерфейса до написания программного кода. Особое внимание уделим типичным ошибкам, которые допускают пользователи при попытке "почистить" числа вручную. Вы узнаете, почему иногда пробелы возвращаются после сохранения документа, как избежать потери данных при массовой обработке, и в каких случаях без помощи разработчика не обойтись.
Если вы работаете с большими массивами данных (например, загружаете прайс-листы поставщиков или выгружаете отчёты в Excel), проблема пробелов может стать критичной. Например, при автоматическом сопоставлении номенклатуры система будет воспринимать 1000 и 1 000 как разные значения, что приведёт к дублям или ошибкам в заказах. Поэтому умение быстро и безопасно убирать пробелы —must-have навык для любого специалиста, работающего с 1С.
Важно понимать, что пробелы в числах могут быть не только видимыми, но и непечатаемыми (например, символы табуляции или переноса строки). Их обнаружение требует специальных приёмов, которые мы также рассмотрим. А для разработчиков приведём примеры кода на встроенном языке 1С, которые можно адаптировать под конкретные задачи.
1. Проверка формата ячейки: почему 1С добавляет пробелы автоматически
Чаще всего пробелы в числах появляются из-за неверных настроек формата отображения. Система 1С:Предприятие по умолчанию может применять разделители тысяч, что визуально добавляет пробелы (или запятые, в зависимости от региональных настроек). Это не ошибка, а feature — так числа легче воспринимать. Однако в некоторых случаях такой формат мешает.
Чтобы проверить и изменить настройки:
- Откройте документ или справочник, где наблюдается проблема.
- Кликните правой кнопкой мыши на ячейку с числом и выберите
Формат(илиСвойства, в зависимости от конфигурации). - В открывшемся окне найдите вкладку
Числои посмотрите, включён ли флажокРазделять тысячи. - Снимите галочку и сохраните изменения.
Если опция Разделять тысячи активна, но серым цветом (недоступна для редактирования), значит формат задаётся на уровне конфигурации. В этом случае потребуется помощь администратора или разработчика, чтобы изменить настройки глобально.
⚠️ Внимание: Изменение формата ячейки не удаляет пробелы из уже введённых данных — оно только меняет способ их отображения. Для очистки существующих записей потребуются дополнительные действия, описанные в следующих разделах.
Также пробелы могут появляться при экспорте данных в Excel или другие форматы. Например, если в 1С число отображается как 1000, а после выгрузки становится 1 000, виноваты настройки экспорта. В этом случае:
- 📌 Проверьте параметры выгрузки в
Файл → Экспорт(или аналогичном меню вашей конфигурации). - 📌 Убедитесь, что в настройках региональных стандартов (
Панель управления → Язык и региональные стандартына сервере 1С) указан корректный разделитель. - 📌 Для массовой выгрузки используйте обработки с явным указанием формата чисел (например,
ЧислоБезРазделителей()).
2. Ручное удаление пробелов: когда и как это безопасно
Если пробелов немного, их можно убрать вручную — прямо в форме документа или справочника. Однако этот метод подходит только для разовых исправлений. Никогда не используйте ручное редактирование для массовых изменений: высок риск ошибок, потери данных или нарушения ссылочной целостности.
Алгоритм ручного удаления:
- Откройте документ или элемент справочника с проблемным числом.
- Дважды кликните на ячейку, чтобы перейти в режим редактирования.
- Удалите пробелы вручную (можно использовать комбинацию
Ctrl + →для перемещения между символами). - Сохраните изменения (
Ctrl + Sили кнопкаЗаписать).
Обратите внимание на следующие нюансы:
- 🔍 Если после удаления пробела и сохранения документа пробел возвращается — проблема в обработчике события (например,
ПриЗаписи), который автоматически форматирует поле. В этом случае ручное исправление бесполезно. - 🔍 В некоторых конфигурациях (например, 1С:Бухгалтерия) числа в валюте могут иметь жёстко заданный формат. Попытка удалить пробел приведёт к ошибке валидации.
- 🔍 Пробелы в
Кодахноменклатуры или контрагентов часто являются частью логики (например, для группировки). Удаляйте их только если уверены, что это не нарушит работу системы.
Для ускорения ручного процесса можно использовать стандартные функции 1С:
// Пример кода для удаления пробелов в текущей ячейке (для формы)
Процедура УбратьПробелыИзЧисла(Элемент)
Если ТипЗнч(Элемент.Значение) = Тип("Число") Тогда
Элемент.Значение = Число(СтрЗаменить(Формат(Элемент.Значение, "ЧГ="), " ", ""));
КонецЕсли;
КонецПроцедуры
Этот код можно привязать к кнопке на форме или вызвать через Отладчик (Ctrl + Alt + F12).
⚠️ Внимание: Ручное редактирование чисел в проводках или регистрах накопления может привести к нарушению баланса. Всегда проверяйте итоги после изменений!
Сделать резервную копию базы|Проверить права доступа (полные права на редактирование)|Отключить регламентные задания на время изменений|Запустить тестовое исправление на копии данных-->
3. Массовое удаление пробелов с помощью обработок
Для очистки пробелов в больших объёмах данных (например, в справочнике Номенклатура или документах Поступление товаров) ручной метод не подходит. Здесь помогут внешние обработки или встроенные инструменты 1С.
Самый простой способ — использовать стандартную обработку Групповое изменение реквизитов:
- Откройте меню
Все функции(Ctrl + Shift + F). - Найдите обработку
Групповое изменение реквизитов(в некоторых конфигурациях она может называтьсяМассовое изменение). - Выберите объект (например, справочник
Номенклатура) и реквизит (например,Цена). - В поле
Новое значениеукажите формулу для замены пробелов. Например:Число(СтрЗаменить(Формат(Цена, "ЧГ="), " ", "")) - Запустите обработку и дождитесь завершения.
Если стандартная обработка не подходит (например, из-за ограничений конфигурации), можно создать собственную. Пример кода для обработки, которая удаляет пробелы из числовых полей документа ПоступлениеТоваровУслуг:
Процедура ОбработатьДокументы()
Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Тогда
Для Каждого Строка Из Выборка.Товары Цикл
Если ТипЗнч(Строка.Цена) = Тип("Число") Тогда
Строка.Цена = Число(СтрЗаменить(Формат(Строка.Цена, "ЧГ="), " ", ""));
КонецЕсли;
Если ТипЗнч(Строка.Количество) = Тип("Число") Тогда
Строка.Количество = Число(СтрЗаменить(Формат(Строка.Количество, "ЧГ="), " ", ""));
КонецЕсли;
КонецЦикла;
Выборка.Записать();
КонецЦикла;
КонецПроцедуры
Перед запуском массовой обработки:
- 🛡️ Сделайте резервную копию базы — даже проверенный код может дать сбой на больших объёмах данных.
- 🛡️ Ограничьте выборку (например, обработайте только документы за последний месяц), чтобы минимизировать риски.
- 🛡️ Проверьте логи обработки на наличие ошибок (в 1С это делается через
Журнал регистрации).
| Метод массовой обработки | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Стандартная обработка Групповое изменение |
Не требует программирования, безопасна | Ограниченный функционал, не везде доступна | Для простых замен в справочниках |
| Внешняя обработка с кодом | Гибкость, обработка сложных случаев | Требует знаний 1С, риск ошибок | Для массовых изменений с логикой |
| Запрос с обновлением | Высокая скорость, минимальная нагрузка | Сложно отладить, нет отката | Для опытных пользователей на больших базах |
| Обмен данными (выгрузка/загрузка) | Можно очистить данные во внешнем файле | Долго, требует пост-обработки | Если пробелы только в выгружаемых данных |
Перед массовой обработкой проверьте, не используются ли пробелы в числах как часть бизнес-логики. Например, в некоторых конфигурациях пробел может разделять артикул и модификацию товара (например, "1234 567").
4. Программные методы: функции и запросы для разработчиков
Если вы разработчик или имеете доступ к конфигуратору, самым надёжным способом будет написание специализированного кода. Ниже приведём универсальные функции, которые можно адаптировать под любую конфигурацию.
Функция для удаления всех пробелов из строки (включая непечатаемые символы):
Функция ОчиститьЧислоОтПробелов(Значение)
Если ТипЗнч(Значение) = Тип("Строка") Тогда
// Удаляем все пробелы, включая неразрывные и табуляции
Возврат СтрЗаменить(СтрЗаменить(СтрЗаменить(Значение, " ", ""), Chr(160), ""), Chr(9), "");
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
Возврат Значение; // Числа уже не содержат пробелов
КонецЕсли;
Возврат Значение;
КонецФункции
Запрос для массового обновления (пример для справочника Номенклатура):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И НЕ ПустаяСтрока(Формат(Номенклатура.Цена, ""ЧГ=""))";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Если ТипЗнч(Объект.Цена) = Тип("Число") Тогда
Объект.Цена = Число(СтрЗаменить(Формат(Объект.Цена, "ЧГ="), " ", ""));
Объект.Записать();
КонецЕсли;
КонецЦикла;
Для работы с непечатаемыми символами (которые не видны, но влияют на сравнение) используйте функцию КодСимвола():
Процедура ПроверитьНаНепечатаемыеСимволы(Строка)
Для Инд = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Инд, 1);
Если КодСимвола(Символ) < 32 Тогда // ASCII-коды управляющих символов
Сообщить("Обнаружен непечатаемый символ: " + КодСимвола(Символ));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
⚠️ Внимание: При работе с запросами на обновление всегда используйте транзакции, чтобы избежать частичного обновления данных при сбое:НачатьТранзакцию();Попытка
// Ваш код обновления
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Для управляемых форм можно добавить обработчик события ПриИзменении, который будет автоматически очищать пробелы:
Процедура ЦенаПриИзменении(Элемент)
Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
Элемент.Значение = СтрЗаменить(Элемент.Значение, " ", "");
КонецЕсли;
КонецПроцедуры
Как найти все поля с пробелами в базе?
Используйте универсальный запрос для поиска числовых полей с пробелами в строковом представлении:
ВЫБРАТЬ
Метаданные.Имя КАК ИмяОбъекта,
Метаданные.Представление КАК Представление,
Данные.Ссылка КАК Ссылка,
Данные.Реквизит КАК Реквизит
ИЗ
(ВЫБРАТЬ
""Справочник.Номенклатура"" КАК Тип,
Номенклатура.Ссылка КАК Ссылка,
""Цена"" КАК Реквизит,
Формат(Номенклатура.Цена, ""ЧГ="") КАК Значение
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И НЕ ПустаяСтрока(Формат(Номенклатура.Цена, ""ЧГ=""))
И Найти(Формат(Номенклатура.Цена, ""ЧГ=""), "" "") > 0) КАК Данные
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВЫБРАТЬ
Метаданные().Имя КАК Имя,
Метаданные().Представление КАК Представление,
Метаданные().Тип.ИмяТипа КАК ТипОбъекта
ИЗ
Метаданные().Реквизиты КАК Метаданные
ГДЕ
Метаданные().Тип.ИмяТипа = ""Число""
Этот запрос вернёт все числовые реквизиты, в строковом представлении которых есть пробелы. Адаптируйте его под свою конфигурацию, добавив нужные объекты (документы, регистры и т.д.).
5. Проблемы с обменом данными: почему пробелы появляются при импорте
Одна из самых распространённых причин появления пробелов в числах — некорректный обмен данными с внешними системами. Это может быть импорт из Excel, загрузка прайс-листов поставщиков или интеграция с сайтом. Рассмотрим типичные сценарии и способы их решения.
Проблема 1: Пробелы в Excel-файле
При импорте из Excel пробелы могут попадать в 1С по нескольким причинам:
- 📊 В ячейках Excel числа отформатированы с разделителем тысяч (пробел или запятая).
- 📊 Данные экспортированы из другой системы с пробелами (например, из 1С:УТ 10.3 в 1С:ERP).
- 📊 В файле используются непечатаемые символы (например,
CHAR(160)— неразрывный пробел).
Решение:
- Откройте файл в Excel и примените формат
Общийко всем числовым ячейкам. - Используйте функцию
=ПОДСТАВИТЬ(A1;"" "";"""")для удаления пробелов. - Для массовой обработки запишите макрос:
Sub RemoveSpaces()Dim cell As Range
For Each cell In Selection
If IsNumeric(cell.Value) Then
cell.Value = Replace(cell.Value, " ", "")
End If
Next cell
End Sub
- При загрузке в 1С используйте обработку с предварительной очисткой данных (пример кода см. в разделе 4).
Проблема 2: Пробелы в XML/JSON при обмене
Если пробелы появляются при обмене через XML или JSON, проверьте:
- 🔗 Формат числовых полей в XSD-схеме (должен быть
xs:decimalилиxs:double, а неxs:string). - 🔗 Настройки преобразования в правилах обмена (в 1С это настраивается в
Планы обмена). - 🔗 Кодировку файла — иногда пробелы возникают из-за неверной интерпретации символов (например, при конвертации из
UTF-8вWindows-1251).
Пример исправления правила обмена:
// В модуле правила обмена
Процедура ПриЧтенииДанных(Данные, ПараметрыОбмена)
Если ТипЗнч(Данные.Цена) = Тип("Строка") Тогда
Данные.Цена = Число(СтрЗаменить(Данные.Цена, " ", ""));
КонецЕсли;
КонецПроцедуры
Проблема 3: Пробелы в данных от поставщика
Если пробелы приходят в прайс-листах или накладных от контрагентов, договоритесь с ними о формате обмена. Альтернативные решения:
- 📦 Используйте промежуточную обработку, которая очищает данные перед загрузкой в 1С.
- 📦 Настройте автоматическую замену пробелов при загрузке (например, через
Правила регистрации измененийв 1С:УТ). - 📦 Если пробелы — часть артикулов (например,
"AB12 34CD"), оставьте их, но настройте сопоставление по шаблонам.
⚠️ Внимание: При обмене данными с 1С:Розница или 1С:УТ пробелы в штрихкодах или артикулах могут быть критичны для работы сканеров. Всегда тестируйте изменения на копии базы!
При импорте данных всегда проверяйте формат исходного файла. Числа должны передаваться как числа, а не как строки — это исключит автоматическое добавление разделителей.
6. Типичные ошибки и как их избежать
При попытке убрать пробелы в числах пользователи часто допускают ошибки, которые ведут к ещё большим проблемам. Разберём самые распространённые из них и способы их предотвращения.
Ошибка 1: Удаление пробелов в кодах или артикулах
Многие пользователи массово удаляют пробелы во всех полях, не учитывая, что в некоторых случаях они несут смысловую нагрузку. Например:
- 🏷️ В артикулах пробел может разделять категорию и модель (например,
"TV-SAM 55Q70"). - 🏷️ В кодах номенклатуры пробелы иногда используются для иерархии (например,
"01 001"— группа и подгруппа).
Как избежать: Перед массовой очисткой проанализируйте данные. Используйте запрос для поиска уникальных шаблонов:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Лев(Артикул, 3) КАК Префикс
ИЗ
Справочник.Номенклатура
ГДЕ
НЕ ПометкаУдаления
И Артикул СОДЕРЖИТ " "
Ошибка 2: Потеря точности при преобразовании строк в числа
При удалении пробелов из строки и преобразовании её в число можно потерять десятичные разряды. Например, строка "1 000.50" после замены пробела и преобразования в число может стать 1000.5 (если не указан формат с двумя знаками после запятой).
Как избежать: Всегда явно указывайте формат при преобразовании:
Цена = Число(СтрЗаменить(Формат(СтрокаЦена, "ЧГ=2"), " ", ""));
Ошибка 3: Игнорирование транзакций при массовых изменениях
Многие пользователи забывают оборачивать массовые обновления в транзакции. Если в процессе возникнет ошибка (например, блокировка записи), часть данных останется изменённой, а часть — нет, что приведёт к несогласованности.
Как избежать: Всегда используйте конструкцию:
НачатьТранзакцию();
Попытка
// Ваш код
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Ошибка 4: Непроверенные внешние обработки
Скачивание обработок для удаления пробелов с сомнительных источников может привести к:
- 🔴 Потере данных (например, если обработка удаляет не только пробелы, но и другие символы).
- 🔴 Заражению вирусами (вредоносный код может быть спрятан в модуле обработки).
- 🔴 Нарушению лицензионного соглашения (некоторые обработки содержат нелегальные модификации).
Как избежать:
- 🛡️ Используйте только обработки с официальных ресурсов (1С:ИТС, Инфостарт).
- 🛡️ Проверяйте код обработки перед запуском (откройте в конфигураторе и просмотрите модули).
- 🛡️ Тестируйте на копии базы.
Ошибка 5: Неучёт региональных настроек
В разных странах разные разделители тысяч и десятичных знаков. Например, в России используется пробел (1 000,50), а в США — запятая (1,000.50). Если не учесть это при обмене данными, пробелы будут появляться снова.
Как избежать: Настройте региональные параметры в 1С:
- Откройте
Администрирование → Настройки программы → Региональные настройки. - Укажите корректный
Формат чисел(например,Русский (Россия)). - Перезапустите 1С для применения изменений.
Перед любыми массовыми изменениями данных всегда делайте резервную копию базы. Даже проверенный код может вести себя непредсказуемо на больших объёмах данных или в специфических конфигурациях.
7. Альтернативные подходы: когда пробелы нужны
Иногда пробелы в числах — не ошибка, а часть бизнес-логики. В таких случаях вместо их удаления лучше адаптировать систему для работы с ними. Рассмотрим типичные сценарии.
Сценарий 1: Пробелы в артикулах или кодах
Если пробелы используются для структурирования кодов (например, "CAT-01 001" — категория и подкатегория), их удаление нарушит логику. Вместо этого:
- 📌 Настройте сопоставление номенклатуры по шаблонам (например, с помощью регулярных выражений).
- 📌 Используйте дополнительные реквизиты для хранения "очищенных" версий кодов.
- 📌 В отчётах применяйте функцию
СтрЗаменить()только для вывода, не изменяя исходные данные.
Сценарий 2: Пробелы как разделители в составных полях
В некоторых конфигурациях в одном поле хранятся несколько значений, разделённых пробелом (например, "1000 5" — цена и скидка). В этом случае:
- 🔧 Разбейте поле на отдельные реквизиты (например,
ЦенаиСкидка). - 🔧 Используйте функцию
РазложитьСтрокуВМассив()для парсинга:МассивЗначений = РазложитьСтрокуВМассив(СоставноеПоле, " ");Цена = Число(МассивЗначений