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

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

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

Функция СтрЗаменить() — самый очевидный инструмент для удаления символов, но он требует ручного перечисления всех букв, которые нужно убрать. Это неудобно, если алфавит большой (например, кириллица + латиница), но подходит для простых случаев.

Основной синтаксис:

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

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

// ... и так для всех букв

Чтобы автоматизировать процесс, можно сгенерировать список букв программно:

Алфавит = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz";

Для Каждого Символ Из Алфавит Цикл

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

КонецЦикла;

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

Если нужно удалить только кириллицу или только латиницу, сократите алфавит в коде — это ускорит выполнение в 2 раза.

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

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

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

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

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

Расширенный вариант с учётом дополнительных символов (например, дефисов в словах):

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

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

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

3. Цикл по символам: универсально, но медленно

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

Пример кода:

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

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

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

Если НЕ (Символ >= "а" И Символ <= "я") И

НЕ (Символ >= "А" И Символ <= "Я") И

НЕ (Символ >= "a" И Символ <= "z") И

НЕ (Символ >= "A" И Символ <= "Z") Тогда

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

КонецЕсли;

КонецЦикла;

Оптимизированная версия с использованием Найти() для проверки:

Алфавит = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz";

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

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

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

Если Найти(Алфавит, Символ) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

Сначала разбиваем строку на массив символов: МассивСимволов = СтрРазделить(ИсходнаяСтрока, "");, затем фильтруем его через ФильтроватьМассив() с условием проверки каждого символа. Этот подход может быть быстрее для очень длинных строк (10 000+ символов).

4. Внешние компоненты: для сложных задач

Если встроенные средства не справляются (например, нужно обработать Unicode-символы или применить сложные правила фильтрации), можно подключить внешние компоненты:

  • 📌 1Script: расширение языка с поддержкой регулярных выражений даже в старых версиях платформы.
  • 📌 AddIn: COM-объекты или .NET-компоненты (например, System.Text.RegularExpressions для .NET).
  • 📌 HTTP-сервисы: отправка строки на обработку внешнему API (актуально для облачных решений).

Пример использования .NET через CLRHost:

// Подключаем .NET

CLR = Новый CLRHost();

РегEx = CLR.DotNetFactory("System.Text.RegularExpressions.Regex", "System");

// Удаляем все буквы

Результат = РегEx.Replace(ИсходнаяСтрока, "[а-яА-Яa-zA-Z]", "");

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

5. Функция пользователя: готовое решение для повторного использования

Чтобы не писать один и тот же код многократно, создайте общую функцию в модуле приложения или общем модуле. Пример универсальной функции, удаляющей все буквы (кириллица + латиница) с учётом регистра:

Функция УдалитьБуквыИзСтроки(Знач Строка) Экспорт

Алфавит = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz" +

"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ";

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

Для Каждого Символ Из Алфавит Цикл

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

КонецЦикла;

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

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

Вызов функции:

ОчищеннаяСтрока = УдалитьБуквыИзСтроки("Пример123Строки456");

// Вернёт: "123456"

Для ускорения работы с большими объёмами данных можно кешировать результат функции или использовать ПараметрыВызова для передачи дополнительных опций (например, флага "удалить только кириллицу").

Убедитесь, что строка не пустая|Проверьте кодировку символов (UTF-8/ANSI)|Оцените длину строки (для >1000 символов лучше использовать регулярки)|Тестируйте на реальных данных, а не только на примерах-->

6. Особенности работы с разными кодировками и Unicode

При удалении букв из строк важно учитывать кодировку исходных данных. В чаще всего используется:

  • 📋 ANSI (Windows-1251): стандарт для русских версий . Кириллица занимает коды 192–255 и 168 (ё), 184 (Ё).
  • 📋 UTF-8: используется в веб-интеграциях или при работе с JSON/XML. Кириллические буквы занимают 2 байта (например, "а" = 0xD0 0xB0).

Если строка пришла из внешнего источника (например, HTTPЗапрос), сначала приведите её к нужной кодировке:

// Преобразование из UTF-8 в ANSI

СтрокаANSI = СтрЗаменить(СтрокаUTF8, Чр(208), ""); // Удаляем первый байт кириллических символов

СтрокаANSI = СтрЗаменить(СтрокаANSI, Чр(209), ""); // Удаляем второй байт

Для точной работы с Unicode-символами (например, эмодзи или редкие буквы) лучше использовать регулярные выражения с флагом RegexOptions.IgnoreCase (в .NET) или внешние библиотеки.

💡

Всегда проверяйте кодировку исходной строки перед обработкой. Неправильная кодировка может привести к потере данных или ошибкам типа "Неверный символ".

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

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

Используйте регулярное выражение с негативным классом: РегВыр = Новый РегулярноеВыражение("[^0-9\s.,;:!?]");. Здесь \s — пробелы, а остальные символы в квадратных скобках — разрешённые знаки препинания.

Почему СтрЗаменить() не удаляет букву "ё"?

Буква "ё" (и "Ё") имеет отдельные коды в Unicode и часто пропускается в алфавитных диапазонах. Добавьте её явно в список замен: ИсходнаяСтрока = СтрЗаменить(ИсходнаяСтрока, "ё", ""); и ИсходнаяСтрока = СтрЗаменить(ИсходнаяСтрока, "Ё", "");.

Как удалить буквы в строке, сохраняя регистр остальных символов?

Регистр небуквенных символов не меняется при удалении. Если нужно преобразовать строку в верхний/нижний регистр после очистки, используйте: Результат = ВРег(УдалитьБуквыИзСтроки(ИсходнаяСтрока));.

Можно ли удалить буквы в 1С 7.7?

Да, но только через цикл по символам или СтрЗаменить(). В 1С 7.7 нет регулярных выражений и ограниченная поддержка Unicode. Пример для 7.7:
Для i = 1 По ДлинаСтроки(Стр) Цикл

  Симв = Сред(Стр, i, 1);

  Если (КодСимв(Симв) < 192) Или (КодСимв(Симв) > 255) Тогда

    Рез = Рез + Симв;

  КонецЕсли;

КонецЦикла;

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

Используйте регулярное выражение [a-zA-Z] или в цикле проверяйте диапазоны: Если (Символ >= "a" И Символ <= "z") Или (Символ >= "A" И Символ <= "Z") Тогда.