При импорте данных из внешних источников, таких как Excel, программисты 1С часто сталкиваются с необходимостью парсинга (разбора) строк. Одной из типичных задач является извлечение буквенного префикса, суффикса или вставки из строкового номера, который содержит и цифры, и буквы. Например, из строки вида 29J1 нам нужно получить символ J.
В этой статье мы подробно рассмотрим несколько способов решения данной задачи: от самых простых и быстрых до универсальных и отказоустойчивых. Мы проанализируем ситуацию, когда формат номера строго задан, и выясним, как действовать, если положение буквы в строке может меняться.
Если мы заранее знаем, что номер всегда имеет строго определенный формат (например, две цифры, одна буква и снова цифра), то самым производительным способом будет использование функции Сред. Рассмотрим этот вариант подробнее.
Функция Сред позволяет получить подстроку из исходной строки, начиная с указанного номера символа. Разберем на примере номера 29J1:
Номер = "29J1";
Буква = Сред(Номер, 3, 1); // Начинаем с 3-го символа, берем 1 символ
Преимущества: максимальная скорость выполнения. Это критично при загрузке сотен тысяч строк из Excel.
Недостатки: метод абсолютно не гибкий. Если в справочнике появится номер 9J1 (одна цифра в начале вместо двух), функция вернет цифру 1 вместо буквы, так как позиция символа сместится.
Более надежным и изящным способом, предложенным в сообществе, является последовательное удаление всех цифровых символов из строки. В результате в строке останутся только буквы и спецсимволы. Проанализируем, как это работает программно.
Мы запускаем цикл от 0 до 9 и на каждой итерации вызываем функцию СтрЗаменить. Посмотрим на код:
Номер = "29J1";
Для Сч = 0 По 9 Цикл
Номер = СтрЗаменить(Номер, Формат(Сч, "ЧГ=0"), "");
КонецЦикла;
// В переменной Номер останется "J"
Важное примечание: при использовании СтрЗаменить внутри цикла, мы фактически "вычищаем" строку от всех известных цифр. По завершении цикла в переменной Номер останутся только нецифровые символы. Если в номере было несколько букв (например, 29ABC1), результатом будет строка ABC.
Рассмотрим более профессиональный подход, который часто применяется в сложных задачах обработки текста. Регулярные выражения позволяют гибко управлять поиском и заменой. В среде Windows для этого используется COM-объект VBScript.RegExp.
Допустим, нам нужно оставить в строке только латинские буквы. Разберем по шагам создание такого механизма:
RegEx = Новый COMОбъект("VBScript.RegExp");
RegEx.IgnoreCase = Истина; // Игнорировать регистр
RegEx.Global = Истина; // Искать все вхождения
RegEx.Pattern = "[^a-zA-Z]"; // Шаблон: всё, что НЕ является латинской буквой
ИсходныйНомер = "29J1";
ТолькоБуквы = RegEx.Replace(ИсходныйНомер, "");
Используя разные шаблоны (Pattern), мы можем решать разные задачи:
\d — удалит все цифры (аналог метода с циклом, но быстрее).[^0-9] — наоборот, удалит все, кроме цифр.[0-9] — удалит только цифры.Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), то в ней уже заложены мощные инструменты для работы со строками. Нам не нужно "изобретать велосипед", достаточно вызвать функцию из общего модуля СтроковыеФункцииКлиентСервер.
Функция ФильтроватьСтроку позволяет оставить в исходном тексте только те символы, которые входят в разрешенный набор. Посмотрим на пример:
ДопустимыеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
ИсходнаяСтрока = "29J1";
Результат = СтроковыеФункцииКлиентСервер.ФильтроватьСтроку(ИсходнаяСтрока, ДопустимыеСимволы);
Этот метод считается наиболее "чистым" с точки зрения архитектуры 1С, так как он использует штатные возможности платформы и библиотек.
В некоторых случаях важно точно знать, является ли символ буквой, проверяя его код в таблице символов. Это помогает избежать ошибок, если в строке присутствуют невидимые символы или специфические знаки препинания. Выясним причину популярности этого метода: он дает полный контроль над процессом.
Для реализации мы используем функции Сред в цикле по длине строки и КодСимвола для проверки принадлежности к диапазонам (например, коды латиницы A-Z находятся в диапазоне 65–90).
Результат = "";
Для Поз = 1 По СтрДлина(ИсходныйНомер) Цикл
ТекСимвол = Сред(ИсходныйНомер, Поз, 1);
Код = КодСимвола(ТекСимвол);
// Проверяем, является ли символ латинской буквой (A-Z)
Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда
Результат = Результат + ТекСимвол;
КонецЕсли;
КонецЦикла;
Подводя итог нашему анализу, дадим рекомендации по выбору инструмента в зависимости от ситуации:
Сред. Это быстро и просто.СтрЗаменить по цифрам 0-9.СтроковыеФункцииКлиентСервер.RegExp.При загрузке из Excel также не забывайте предварительно очищать строку от пробелов функцией СокрЛП, так как лишние невидимые символы могут нарушить работу любого из вышеперечисленных алгоритмов.