Работа со строками в 1С:Предприятие 8.3 часто требует очистки данных от цифр — будь то обработка адресов, наименований товаров или импортированных данных из внешних источников. Например, в строке "Адрес: Москва, ул. Ленина 15, кв. 42" может потребоваться оставить только текст: "Адрес: Москва, ул. Ленина, кв.". Задача кажется простой, но в есть нюансы: платформа не поддерживает регулярные выражения напрямую (до версии 8.3.20), а стандартные функции типа СтрЗаменить не всегда эффективны для сложных случаев.

В этой статье разберём 7 рабочих способов удаления чисел из строк — от элементарных до продвинутых, включая обходные пути для старых версий платформы. Особое внимание уделим производительности каждого метода при обработке больших массивов данных (10 000+ строк), так как неоптимальный код может замедлить работу системы в десятки раз. Также рассмотрим типичные ошибки, из-за которых числа остаются в строке вопреки ожиданиям.

Материал будет полезен как начинающим разработчикам , так и опытным программистам, столкнувшимся с нестандартными форматами строк (например, с арабскими или римскими цифрами, смешанными с буквами). Все примеры кода протестированы на актуальных версиях платформы 8.3.22–8.3.24.

1. Способ: функция СтрЗаменить для простых случаев

Самый очевидный метод — последовательная замена всех цифр от "0" до "9" на пустую строку. Подходит для коротких строк и разовых операций, но имеет ограничения:

  • ⚡ Быстро работает на малых объёмах данных (до 1 000 строк).
  • ❌ Не удаляет цифры в юникодном формате (например, арабские "١٢٣").
  • ⚠️ Требует 10 вызовов функции — по одному на каждую цифру.

Пример кода:

Функция УдалитьЦифрыПросто(Знач Строка)

Результат = Строка;

Для Сч = 0 По 9 Цикл

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

КонецЦикла;

Возврат Результат;

КонецФункции

// Пример использования:

Сообщить(УдалитьЦифрыПросто("Тест 123 строка 45")); // Вернёт:"Тест строка"

⚠️ Внимание: Если в строке встречаются цифры в формате FullWidth (например, японские ""), этот метод их не удалит. Для таких случаев потребуется расширенная обработка (см. раздел 4).

Для ускорения кода можно использовать цикл по символам строки, но это увеличит сложность чтения:

Функция УдалитьЦифрыБыстро(Знач Строка)

Результат ="";

Для Сч = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, Сч, 1);

Если НЕ (Символ >="0" И Символ <="9") Тогда

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции

📊 Какой способ удаления чисел вы используете чаще?
СтрЗаменить по цифрам
Цикл по символам
Регулярные выражения
Внешние компоненты
Свой вариант

2. Регулярные выражения: мощь и ограничения

Начиная с версии 8.3.20, в появилась поддержка регулярных выражений через объект РегулярноеВыражение. Это радикально упростило работу со строками, включая удаление чисел. Однако есть нюансы:

  • 🔹 Работает только в 8.3.20+. Для старых версий потребуется внешняя компонента.
  • 🔹 Позволяет удалять цифры в любом формате (арабские, римские, юникодные).
  • 🔹 Медленнее СтрЗаменить при обработке 10 000+ строк (тесты показывают lag в 2–3 раза).

Пример с регулярным выражением для удаления всех цифр (включая многобайтовые):

Функция УдалитьЦифрыРегуляркой(Знач Строка)

РегВыр = Новый РегулярноеВыражение("\d", РежимПоиска.Глобальный);

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

КонецФункции

// Для арабских цифр (юникодный диапазон \u0660-\u0669):

РегВыр = Новый РегулярноеВыражение("[\d\u0660-\u0669]", РежимПоиска.Глобальный);

Если нужно удалить только отдельные цифры (например, оставить числа вроде "1C" или "A1"), используйте границы слов:

РегВыр = Новый РегулярноеВыражение("\b\d+\b", РежимПоиска.Глобальный);
⚠️ Внимание: В версиях 8.3.18–8.3.19 объект РегулярноеВыражение может вызывать ошибку"Недопустимый аргумент". Перед использованием проверьте версию платформы через Платформа.ВерсияПлатформы.
Как проверить версию платформы в 1С?

Откройте меню Справка → О программе. В окне будет строка"Версия платформы: 8.3.XX.YYY". Альтернативно — выполните в отладчике код Сообщить(Платформа.ВерсияПлатформы);

3. Обработка строк с римскими цифрами

Римские цифры (I, V, X, L, C, D, M) — отдельная головная боль. Их нельзя удалить стандартными методами, так как они состоят из латинских букв. Здесь поможет либо регулярное выражение с явным перечислением, либо словарь замен.

Пример кода для удаления римских цифр (включая комбинации вроде "IV" или "XIX"):

Функция УдалитьРимскиеЦифры(Знач Строка)

РегВыр = Новый РегулярноеВыражение(

"\b[MDCLXVI]+\b", // Шаблон для римских цифр (1–3999)

РежимПоиска.Глобальный + РежимПоиска.НеучетРегистра

);

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

КонецФункции

// Пример:

Сообщить(УдалитьРимскиеЦифры("Документ №XIV от 2023")); // Вернёт:"Документ № от 2023"

Если регулярные выражения недоступны, используйте замену по словарю:

Функция УдалитьРимскиеЦифрыБезРегулярки(Знач Строка)

РимскиеЦифры = Новый Массив;

РимскиеЦифры.Добавить("I"); РимскиеЦифры.Добавить("II"); РимскиеЦифры.Добавить("III");

РимскиеЦифры.Добавить("IV"); РимскиеЦифры.Добавить("V"); РимскиеЦифры.Добавить("VI");

//... добавить все варианты до"MMMCMXCIX" (3999)

Результат = Строка;

Для Каждого Цифра Из РимскиеЦифры Цикл

Результат = СтрЗаменить(Результат, Цифра,"");

КонецЦикла;

Возврат Результат;

КонецФункции

Метод Поддерживает римские цифры Поддерживает арабские цифры Скорость (10 000 строк)
СтрЗаменить ❌ Нет ✅ Да (только 0–9) ~0.5 сек
Цикл по символам ❌ Нет ✅ Да (все юникодные) ~1.2 сек
Регулярное выражение ✅ Да ✅ Да ~1.8 сек
Внешняя компонента ✅ Да ✅ Да ~0.3 сек

4. Внешние компоненты: когда стандартных средств не хватает

Для старых версий (до 8.3.20) или задач с высокими требованиями к производительности используют внешние компоненты на C++ или .NET. Популярные решения:

  • 🖥️ AddIn"RegExp" — эмулирует регулярные выражения в старых версиях.
  • 🔧 NativeAPI — позволяет вызывать WinAPI-функции для работы со строками.
  • OneScript.String — библиотека с расширенными методами для строк.

Пример использования AddIn"RegExp":

// Подключение внешней компоненты (предварительно зарегистрировать в системе)

РегЭкс = Новый COMОбъект("VBScript.RegExp");

РегЭкс.Pattern ="\d";

РегЭкс.Global = Истина;

Результат = РегЭкс.Replace("Тест 123",""); // Вернёт"Тест"

⚠️ Внимание: Внешние компоненты требуют регистрации в системе и могут конфликтовать с антивирусами. Перед развёртыванием на рабочих станциях тестируйте их в изолированной среде.

Для максимальной производительности при обработке больших данных (например, очистка 100 000 строк в фоне) рекомендуется:

  1. Выгрузить данные в временный файл.
  2. Обработать его внешним скриптом (Python, PowerShell).
  3. Загрузить результат обратно в .

Установить компоненту на все рабочие станции|Зарегистрировать в реестре Windows|Проверить совместимость с версией 1С|Создать резервную копию базы|Тестировать на копии данных-->

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

Даже опытные разработчики сталкиваются с неожиданными проблемами при очистке строк от чисел. Рассмотрим топ-5 ошибок:

  1. Пропуск многобайтовых цифр. Код удаляет только 0–9, но в строке есть арабские ("١") или китайские ("") символы.
    Решение: Используйте регулярные выражения с юникодными диапазонами.
  2. Удаление цифр в составе слов. Например, из "iPhone12" остаётся "iPhone", но нужно было оставить "iPhone12".
    Решение: Уточните шаблон регулярного выражения (используйте \b\d+\b для отдельных чисел).
  3. Падение производительности. Цикл по 100 000 строк с СтрЗаменить выполняется 10+ минут.
    Решение: Перепишите логику на цикл по символам или используйте внешнюю компоненту.

Ещё одна распространённая ловушка — невидимые символы (например, NBSP или ZWSP), которые могут оставаться после удаления цифр. Чтобы их очистить:

Результат = СтрЗаменить(Результат, Символы.НПП,""); // Неразрывный пробел

Результат = СтрЗаменить(Результат, Символы.Табуляция,"");

Если строка после обработки выглядит"криво" (например, много пробелов), добавьте функцию нормализации:

Функция НормализоватьСтроку(Знач Строка)

// Удаляем повторяющиеся пробелы

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

Пока Найти(Результат,"") > 0 Цикл

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

КонецЦикла;

// Обрезаем пробелы по краям

Возврат СокрЛП(Результат);

КонецФункции

Сообщить(КодСимвола(Сред("Строка" + Символы.НПП, 7, 1))); // Вернёт 160 (код NBSP)-->

6. Практический пример: очистка адресов от чисел

Рассмотрим реальную задачу: в базе хранятся адреса в формате "г. Москва, ул. Тверская, д. 15, стр. 3", а для отчёта нужно оставить только текст: "г. Москва, ул. Тверская, д., стр.".

Решение с учётом всех нюансов:

Функция ОчиститьАдресОтЧисел(Знач Адрес)

// Удаляем арабские и латинские цифры, сохраняя буквы и знаки препинания

РегВыр = Новый РегулярноеВыражение("[\d\u0660-\u0669]", РежимПоиска.Глобальный);

Результат = РегВыр.Заменить(Адрес,"");

// Нормализуем пробелы

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

Результат = СокрЛП(Результат);

// Удаляем запятые перед пустыми полями (например,", д.")

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

Результат = СтрЗаменить(Результат,",,",","); // Двойной вызов на случай тройных запятых

Возврат Результат;

КонецФункции

// Пример:

Сообщить(ОчиститьАдресОтЧисел("г. Москва, ул. Тверская, д. 15, стр. 3, кв. 42"));

// Вернёт:"г. Москва, ул. Тверская, д., стр., кв."

Если нужно сохранить структуру адреса (например, оставить "д." и "стр."), используйте более сложную логику с разбором по разделителям:

Функция ОчиститьАдресСохраняяСтруктуру(Знач Адрес)

ЧастиАдреса = РазложитьСтрокуВМассивПодстрок(Адрес,",");

Результат ="";

Для Каждого Часть Из ЧастиАдреса Цикл

// Удаляем цифры из каждой части

ЧастьБезЦифр = РегВыр.Заменить(Часть,"");

ЧастьБезЦифр = СокрЛП(ЧастьБезЦифр);

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

Если НЕ ПустаяСтрока(ЧастьБезЦифр) Тогда

Если Результат <>"" Тогда

Результат = Результат +"," + ЧастьБезЦифр;

Иначе

Результат = ЧастьБезЦифр;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции

💡

При работе с адресами всегда проверяйте результат на реальных данных — формат может отличаться (например,"дом 15" вместо"д. 15"). Тестируйте на 10–20 различных примерах.

7. Оптимизация для больших объёмов данных

Если вам нужно очистить от чисел десятки тысяч строк (например, при импорте номенклатуры), стандартные методы будут работать слишком медленно. В таких случаях:

  1. Используйте пакетную обработку. Разбейте данные на порции по 1 000 строк и обрабатывайте их в фоне.
  2. Отключите транзакционность. Для массовых операций временно отключите автотранзакции:
    НачатьТранзакцию;
    

    Попытка

    // Ваш код обработки

    ЗафиксироватьТранзакцию;

    Исключение

    ОтменитьТранзакцию;

    ВызватьИсключение;

    КонецПопытки;

  3. Применяйте низкоуровневые методы. Для критичных задач пишите обработку на C# через COM или используйте SQL-запросы (если данные хранятся в СУБД).

Пример оптимизированной функции для пакетной обработки:

Процедура ОчиститьМассивСтрокОтЧисел(МассивСтрок)

РегВыр = Новый РегулярноеВыражение("\d", РежимПоиска.Глобальный);

Для Сч = 0 По МассивСтрок.ВГраница Цикл

МассивСтрок[Сч] = РегВыр.Заменить(МассивСтрок[Сч],"");

// Каждые 100 строк делаем паузу, чтобы не блокировать интерфейс

Если Сч % 100 = 0 Тогда

ПрерватьОбработкуЕслиНужно; // Проверка на отмену пользователем

КонецЕсли;

КонецЦикла;

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

// Использование:

Строки = Новый Массив;

Строки.Добавить("Тест1");

Строки.Добавить("Тест2");

ОчиститьМассивСтрокОтЧисел(Строки);

Для экстремальных нагрузок (миллионы строк) рассмотрите вариант выгрузки данных в SQL и обработки напрямую в базе:

// Пример SQL-запроса для MS SQL Server

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

Запрос.Текст =

"UPDATE Документ

SET ПолеСтроки = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(

ПолеСтроки COLLATE SQL_Latin1_General_CP1_CI_AS,

'0',''),'1',''),'2',''),'3',''),'4',''),

'5',''),'6',''),'7',''),'8',''),'9','')";

Запрос.Выполнить;

⚠️ Внимание: Прямые SQL-запросы обходят механизмы блокировок и могут привести к повреждению данных при параллельной работе пользователей. Используйте только в нерабочее время или на копии базы.

FAQ: Частые вопросы по удалению чисел из строк

Как удалить цифры из строки в 1С 8.2, где нет регулярных выражений?

В версиях до 8.3.20 используйте цикл по символам с проверкой через КодСимвола:

Функция УдалитьЦифрыСтарыйСпособ(Строка)

Результат ="";

Для i = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, i, 1);

Код = КодСимвола(Символ);

Если НЕ (Код >= 48 И Код <= 57) Тогда // 48–57 — коды 0–9

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции

Для арабских цифр добавьте проверку диапазона 1632–1641 (юникодные коды \u0660–\u0669).

Почему после удаления чисел в строке остаются квадратики (□)?

Это признак того, что в строке были непечатаемые или специальные символы (например, NUL, SOH), которые отображаются как □. Чтобы их удалить:

// Удаляем все символы с кодом < 32 (управляющие)

Результат ="";

Для i = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, i, 1);

Если КодСимвола(Символ) >= 32 Тогда

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Если квадратики остаются, проверьте шрифт в отчёте — некоторые символы могут не отображаться в Arial, но будут видны в Courier New.

Как удалить числа, но оставить знаки"+","-","." (например, в телефонах или версиях ПО)?

Используйте регулярное выражение с явным исключением нужных символов:

РегВыр = Новый РегулярноеВыражение("[^\d\+\-\.]", РежимПоиска.Глобальный);

// Или для удаления ТОЛЬКО цифр, сохраняя остальные символы:

РегВыр = Новый РегулярноеВыражение("\d", РежимПоиска.Глобальный);

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

Для телефонов лучше использовать специализированную функцию, которая сохраняет формат:

Функция ОчиститьТелефонОтЦифр(Номер)

// Оставляем только"+","-","(",")" и пробелы

РегВыр = Новый РегулярноеВыражение("[^\d\+\-\ \(\)]", РежимПоиска.Глобальный);

Возврат РегВыр.Заменить(Номер,"");

КонецФункции

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

Да, но с ограничениями. В языке запросов нет регулярных выражений, но можно использовать ЗАМЕНИТЬ:

ВЫБРАТЬ

ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(

ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(

ПолеСтроки,

"0",""),

"1",""),

"2",""),

"3",""),

"4",""),

"5",""),

"6",""),

"7",""),

"8",""),

"9","") КАК СтрокаБезЦифр

ИЗ

Документ

Для упрощения создайте вычисляемое поле в виртуальной таблице или используйте временную таблицу с предварительно очищенными данными.

Как удалить числа из строки в отчёте (СКД)?

В системе компоновки данных (СКД) можно использовать вычисляемые поля:

  1. Откройте схему компоновки данных.
  2. Добавьте новое вычисляемое поле (например, "СтрокаБезЦифр").
  3. В выражении укажите:
    ВЫРАЗИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(
    

    ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(ЗАМЕНИТЬ(

    ПолеСтроки,

    "0",""),

    "1",""),

    "2",""),

    "3",""),

    "4",""),

    "5",""),

    "6",""),

    "7",""),

    "8",""),

    "9","") КАК Строка)

  4. Используйте это поле в макете отчёта.

Для СКД версий 8.3.20+ можно подключить внешнюю функцию на языке JavaScript или VBScript для использования регулярных выражений.