Работа со строками в 1С:Предприятие 8.3 часто требует очистки данных от ненужных символов — особенно когда речь идет об удалении букв для дальнейшей обработки чисел, артикулов или идентификаторов. Например, в строке "А123Б45В6" может потребоваться оставить только цифры "123456" для корректной работы с штрихкодами или номерами документов. В этой статье разберем 5 практических методов, которые помогут удалить буквы из строки в 1С, — от простых встроенных функций до гибких регулярных выражений.
Важно понимать, что выбор метода зависит от задачи: нужна ли максимальная производительность (например, для обработки тысяч строк в фоновом задании) или гибкость (когда формат строк может меняться). Мы рассмотрим плюсы и минусы каждого подхода, а также уникальные нюансы работы с кириллицей и латиницей в 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" |
4. Функция СокрЛП() — для удаления пробелов и букв
Если в строке помимо букв есть пробелы, можно комбинировать СокрЛП() (убирает пробелы) с другими методами. Например:
БезПробелов = СокрЛП(ИсходнаяСтрока);
Результат = РегулярноеВыражение("[а-яА-Я]").Заменить(БезПробелов, "");
Этот подход удобен, когда строка содержит лишние пробелы между символами, например: "А 1 Б 2" → "12".
Однако СокрЛП() сама по себе не удаляет буквы — она только убирает пробелы. Ее нужно использовать в связке с другими методами.
Что делать, если в строке есть неразрывные пробелы?
В 1С неразрывный пробел кодируется как символ с кодом 160. Чтобы удалить его, используйте функцию СтрЗаменить(ИсходнаяСтрока, Символ(160), "").
5. Использование строковых функций СтрПолучитьСтроку() и Найти()
Для сложных случаев, когда нужно удалить буквы только в определенной части строки, можно комбинировать Найти() и СтрПолучитьСтроку(). Например, если буквы нужно убрать только после первого символа "-":
ПозицияРазделителя = Найти(ИсходнаяСтрока, "-");
Если ПозицияРазделителя > 0 Тогда
ЛеваяЧасть = Лев(ИсходнаяСтрока, ПозицияРазделителя);
ПраваяЧасть = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - ПозицияРазделителя);
ПраваяЧастьБезБукв = РегулярноеВыражение("[а-яА-Я]").Заменить(ПраваяЧасть, "");
Результат = ЛеваяЧасть + ПраваяЧастьБезБукв;
Иначе
Результат = ИсходнаяСтрока;
КонецЕсли;
Этот метод полезен для парсинга сложных строк, где буквы нужно удалить только в определенном сегменте. Например, в строке "Партия-A123Б45" можно оставить префикс "Партия-", а из "A123Б45" убрать буквы, получив "Партия-12345".
Сравнение методов: какой выбрать?
Выбор метода зависит от трех ключевых факторов:
- Объем данных. Для обработки тысяч строк лучше избегать циклов и регулярных выражений — они работают медленно. Оптимально использовать
СтрЗаменить()(если буквы фиксированы) или предварительную очистку данных на стороне СУБД. - Гибкость. Если формат строк может меняться (например, появляются новые буквы), регулярные выражения или циклы будут надежнее.
- Версия платформы. Регулярные выражения доступны только в 1С 8.3.10+. Для старых версий остаются циклы или
СтрЗаменить().
| Метод | Производительность | Гибкость | Поддержка старых версий 1С |
|---|---|---|---|
СтрЗаменить() |
⭐⭐⭐⭐⭐ | ⭐ | Да |
| Цикл по символам | ⭐⭐ | ⭐⭐⭐⭐⭐ | Да |
| Регулярные выражения | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Нет (только 8.3.10+) |
СокрЛП() + другие методы |
⭐⭐⭐⭐ | ⭐⭐⭐ | Да |
☑️ Проверка перед выбором метода
Типичные ошибки и как их избежать
При удалении букв из строк в 1С разработчики часто сталкиваются с неочевидными проблемами:
⚠️ Внимание: Если в строке есть буквы других алфавитов (например, греческие или арабские), стандартные шаблоны регулярных выражений их не удалят. Используйте универсальный шаблон [\p{L}] (если он поддерживается вашей версией 1С) или дополните условие в цикле.
Другие распространенные ошибки:
- 🔸 Игнорирование регистра. Если заменить только
"А", но не"а", строчные буквы останутся. Всегда учитывайте оба регистра. - 🔸 Удаление цифр вместо букв. В шаблоне регулярного выражения легко перепутать
[а-я](буквы) и[0-9](цифры). Двойная проверка спасет от ошибок. - 🔸 Неучтенные символы. Например, в строке может быть
"№"или"-", которые тоже нужно удалить или оставить. Заранее согласуйте требования к очистке.
Чтобы избежать ошибок, тестируйте код на реальных данных, а не на искусственных примерах. Например, строка "Пример-123Тест" может вести себя иначе, чем "A1B2C3", из-за дефиса и кириллицы.
FAQ: Частые вопросы по удалению букв из строк в 1С
Можно ли удалить буквы из строки в 1С 8.2?
Да, но без регулярных выражений. Используйте СтрЗаменить() (если буквы фиксированы) или цикл по символам. Пример для цикла:
Результат = "";
Для Инд = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Инд, 1);
Если НЕ ((Символ >= "А" И Символ <= "Я") ИЛИ (Символ >= "а" И Символ <= "я")) Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Как удалить только русские буквы, оставив латиницу?
Используйте регулярное выражение с шаблоном [а-яА-Я]:
РегВыр = Новый РегулярноеВыражение("[а-яА-Я]");
Результат = РегВыр.Заменить(ИсходнаяСтрока, "");
Это удалит только кириллицу, оставив латиницу и цифры.
Почему регулярное выражение не удаляет букву "ё"?
Буква "ё" (и "Ё") не входит в диапазон [а-яА-Я]. Чтобы удалить её, дополните шаблон:
РегВыр = Новый РегулярноеВыражение("[а-яА-ЯёЁ]");
Как ускорить обработку 10 000 строк?
Для больших объемов данных:
- Используйте
СтрЗаменить()в цикле по фиксированному набору букв (если он известен). - Перенесите логику очистки на сторону SQL (если строки хранятся в базе).
- Разбейте обработку на пакеты (например, по 1000 строк) с паузами, чтобы не блокировать интерфейс.
Можно ли удалить буквы, оставив только цифры и точки (для чисел с плавающей запятой)?
Да, используйте регулярное выражение:
РегВыр = Новый РегулярноеВыражение("[^0-9.]");
Результат = РегВыр.Заменить(ИсходнаяСтрока, "");
Шаблон [^0-9.] удаляет всё, кроме цифр и точек.