Работа со строками в 1С:Предприятие 8.3 часто требует очистки данных от ненужных символов — особенно когда речь идет об удалении букв для дальнейшей обработки чисел, артикулов или идентификаторов. Например, в строке "А123Б45В6" может потребоваться оставить только цифры "123456" для корректной работы с штрихкодами или номерами документов. В этой статье разберем 5 практических методов, которые помогут удалить буквы из строки в , — от простых встроенных функций до гибких регулярных выражений.

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

1. Метод СтрЗаменить() — простой, но ограниченный

Самый очевидный способ — использовать встроенную функцию СтрЗаменить(). Она заменяет все вхождения одного символа на другой. Для удаления букв можно заменить их на пустую строку. Например:

Результат = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, "А", ""), "Б", "");

Однако у этого метода есть критические недостатки:

  • 🔹 Нужно вручную перечислять все возможные буквы (и заглавные, и строчные, и кириллицу, и латиницу).
  • 🔹 Код становится громоздким, если букв много: придется вкладывать СтрЗаменить() десятки раз.
  • 🔹 Не учитывает динамически меняющиеся символы (например, если в строке появится новая буква).

Такой подход подходит только для фиксированных коротких строк, где заранее известен набор символов. Например, если вы точно знаете, что в строке могут быть только "А", "Б" и "В".

💡

Если буквы в строке всегда идут в одном и том же порядке (например, префикс "ART-"), проще удалить их через Правый() или Левый(), указав смещение.

2. Цикл по символам строки — универсально, но медленно

Более гибкий способ — перебрать строку посимвольно и отфильтровать буквы. Этот метод работает с любыми символами, включая кириллицу, латиницу и спецсимволы. Пример кода:

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

Для Инд = 1 По СтрДлина(ИсходнаяСтрока) Цикл

Символ = Сред(ИсходнаяСтрока, Инд, 1);

Если НЕ (Символ >= "А" И Символ <= "Я") И НЕ (Символ >= "а" И Символ <= "я") И НЕ (Символ >= "A" И Символ <= "Z") И НЕ (Символ >= "a" И Символ <= "z") Тогда

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

КонецЕсли;

КонецЦикла;

Преимущества метода:

  • 🔹 Работает с любыми строками, независимо от набора букв.
  • 🔹 Можно легко модифицировать условие (например, оставить только цифры и точки).

Недостатки:

  • 🔸 Низкая производительность на больших объемах данных (например, при обработке 10 000 строк).
  • 🔸 Код выглядит громоздко, особенно если добавляются проверки на другие символы.
💡

Цикл по символам — единственный способ, который гарантированно сработает в любой версии 1С, включая устаревшие платформы (например, 8.1).

3. Регулярные выражения — мощно, но с оговорками

В 1С:Предприятие 8.3 (начиная с версии 8.3.10) появилась поддержка регулярных выражений через объект РегулярноеВыражение. Это самый гибкий способ удаления букв, так как позволяет задавать шаблоны поиска. Пример:

РегВыр = Новый РегулярноеВыражение("[а-яА-Яa-zA-Z]");

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

Разберем детали:

  • 🔹 Шаблон [а-яА-Я] удаляет все кириллические буквы (заглавные и строчные).
  • 🔹 Шаблон [a-zA-Z] отвечает за латиницу.
  • 🔹 Можно комбинировать шаблоны: [а-яА-Яa-zA-Z] удалит и кириллицу, и латиницу.

Предупреждения:

⚠️ Внимание: Регулярные выражения в 1С работают медленнее, чем встроенные строковые функции. Если вам нужно обработать миллионы строк (например, в фоновом задании), тестируйте производительность на реальных данных.
Шаблон регулярного выражения Что удаляет Пример результата для строки "А1б2B3"
[а-я] Только строчные кириллические буквы "А12B3"
[А-Я] Только заглавные кириллические буквы "1б2B3"
[a-zA-Z] Всю латиницу (заглавную и строчную) "А1б23"
[^0-9] Всё, кроме цифр (удалит буквы, знаки, пробелы) "123"
📊 Какой метод вы чаще используете для работы со строками в 1С?
Встроенные функции (СтрЗаменить, Левый и т.д.)
Циклы по символам
Регулярные выражения
Другие способы

4. Функция СокрЛП() — для удаления пробелов и букв

Если в строке помимо букв есть пробелы, можно комбинировать СокрЛП() (убирает пробелы) с другими методами. Например:

БезПробелов = СокрЛП(ИсходнаяСтрока);

Результат = РегулярноеВыражение("[а-яА-Я]").Заменить(БезПробелов, "");

Этот подход удобен, когда строка содержит лишние пробелы между символами, например: "А 1 Б 2""12".

Однако СокрЛП() сама по себе не удаляет буквы — она только убирает пробелы. Ее нужно использовать в связке с другими методами.

Что делать, если в строке есть неразрывные пробелы?

В 1С неразрывный пробел кодируется как символ с кодом 160. Чтобы удалить его, используйте функцию СтрЗаменить(ИсходнаяСтрока, Символ(160), "").

5. Использование строковых функций СтрПолучитьСтроку() и Найти()

Для сложных случаев, когда нужно удалить буквы только в определенной части строки, можно комбинировать Найти() и СтрПолучитьСтроку(). Например, если буквы нужно убрать только после первого символа "-":

ПозицияРазделителя = Найти(ИсходнаяСтрока, "-");

Если ПозицияРазделителя > 0 Тогда

ЛеваяЧасть = Лев(ИсходнаяСтрока, ПозицияРазделителя);

ПраваяЧасть = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - ПозицияРазделителя);

ПраваяЧастьБезБукв = РегулярноеВыражение("[а-яА-Я]").Заменить(ПраваяЧасть, "");

Результат = ЛеваяЧасть + ПраваяЧастьБезБукв;

Иначе

Результат = ИсходнаяСтрока;

КонецЕсли;

Этот метод полезен для парсинга сложных строк, где буквы нужно удалить только в определенном сегменте. Например, в строке "Партия-A123Б45" можно оставить префикс "Партия-", а из "A123Б45" убрать буквы, получив "Партия-12345".

Сравнение методов: какой выбрать?

Выбор метода зависит от трех ключевых факторов:

  1. Объем данных. Для обработки тысяч строк лучше избегать циклов и регулярных выражений — они работают медленно. Оптимально использовать СтрЗаменить() (если буквы фиксированы) или предварительную очистку данных на стороне СУБД.
  2. Гибкость. Если формат строк может меняться (например, появляются новые буквы), регулярные выражения или циклы будут надежнее.
  3. Версия платформы. Регулярные выражения доступны только в 1С 8.3.10+. Для старых версий остаются циклы или СтрЗаменить().
Метод Производительность Гибкость Поддержка старых версий 1С
СтрЗаменить() ⭐⭐⭐⭐⭐ Да
Цикл по символам ⭐⭐ ⭐⭐⭐⭐⭐ Да
Регулярные выражения ⭐⭐⭐ ⭐⭐⭐⭐⭐ Нет (только 8.3.10+)
СокрЛП() + другие методы ⭐⭐⭐⭐ ⭐⭐⭐ Да

☑️ Проверка перед выбором метода

Выполнено: 0 / 4

Типичные ошибки и как их избежать

При удалении букв из строк в 1С разработчики часто сталкиваются с неочевидными проблемами:

⚠️ Внимание: Если в строке есть буквы других алфавитов (например, греческие или арабские), стандартные шаблоны регулярных выражений их не удалят. Используйте универсальный шаблон [\p{L}] (если он поддерживается вашей версией 1С) или дополните условие в цикле.

Другие распространенные ошибки:

  • 🔸 Игнорирование регистра. Если заменить только "А", но не "а", строчные буквы останутся. Всегда учитывайте оба регистра.
  • 🔸 Удаление цифр вместо букв. В шаблоне регулярного выражения легко перепутать [а-я] (буквы) и [0-9] (цифры). Двойная проверка спасет от ошибок.
  • 🔸 Неучтенные символы. Например, в строке может быть "№" или "-", которые тоже нужно удалить или оставить. Заранее согласуйте требования к очистке.

Чтобы избежать ошибок, тестируйте код на реальных данных, а не на искусственных примерах. Например, строка "Пример-123Тест" может вести себя иначе, чем "A1B2C3", из-за дефиса и кириллицы.

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

Можно ли удалить буквы из строки в 1С 8.2?

Да, но без регулярных выражений. Используйте СтрЗаменить() (если буквы фиксированы) или цикл по символам. Пример для цикла:

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

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

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

Если НЕ ((Символ >= "А" И Символ <= "Я") ИЛИ (Символ >= "а" И Символ <= "я")) Тогда

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

КонецЕсли;

КонецЦикла;

Как удалить только русские буквы, оставив латиницу?

Используйте регулярное выражение с шаблоном [а-яА-Я]:

РегВыр = Новый РегулярноеВыражение("[а-яА-Я]");

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

Это удалит только кириллицу, оставив латиницу и цифры.

Почему регулярное выражение не удаляет букву "ё"?

Буква "ё" (и "Ё") не входит в диапазон [а-яА-Я]. Чтобы удалить её, дополните шаблон:

РегВыр = Новый РегулярноеВыражение("[а-яА-ЯёЁ]");
Как ускорить обработку 10 000 строк?

Для больших объемов данных:

  1. Используйте СтрЗаменить() в цикле по фиксированному набору букв (если он известен).
  2. Перенесите логику очистки на сторону SQL (если строки хранятся в базе).
  3. Разбейте обработку на пакеты (например, по 1000 строк) с паузами, чтобы не блокировать интерфейс.
Можно ли удалить буквы, оставив только цифры и точки (для чисел с плавающей запятой)?

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

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

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

Шаблон [^0-9.] удаляет всё, кроме цифр и точек.