Как получить букву из номера при загрузке данных в 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

При импорте данных из внешних источников, таких как Excel, программисты 1С часто сталкиваются с необходимостью парсинга (разбора) строк. Одной из типичных задач является извлечение буквенного префикса, суффикса или вставки из строкового номера, который содержит и цифры, и буквы. Например, из строки вида 29J1 нам нужно получить символ J.

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

Метод 1: Извлечение по фиксированной позиции

Если мы заранее знаем, что номер всегда имеет строго определенный формат (например, две цифры, одна буква и снова цифра), то самым производительным способом будет использование функции Сред. Рассмотрим этот вариант подробнее.

Функция Сред позволяет получить подстроку из исходной строки, начиная с указанного номера символа. Разберем на примере номера 29J1:


Номер = "29J1";
Буква = Сред(Номер, 3, 1); // Начинаем с 3-го символа, берем 1 символ

Преимущества: максимальная скорость выполнения. Это критично при загрузке сотен тысяч строк из Excel.

Недостатки: метод абсолютно не гибкий. Если в справочнике появится номер 9J1 (одна цифра в начале вместо двух), функция вернет цифру 1 вместо буквы, так как позиция символа сместится.

Метод 2: Циклическое удаление цифр

Более надежным и изящным способом, предложенным в сообществе, является последовательное удаление всех цифровых символов из строки. В результате в строке останутся только буквы и спецсимволы. Проанализируем, как это работает программно.

Мы запускаем цикл от 0 до 9 и на каждой итерации вызываем функцию СтрЗаменить. Посмотрим на код:


Номер = "29J1";
Для Сч = 0 По 9 Цикл
    Номер = СтрЗаменить(Номер, Формат(Сч, "ЧГ=0"), "");
КонецЦикла;
// В переменной Номер останется "J"

Важное примечание: при использовании СтрЗаменить внутри цикла, мы фактически "вычищаем" строку от всех известных цифр. По завершении цикла в переменной Номер останутся только нецифровые символы. Если в номере было несколько букв (например, 29ABC1), результатом будет строка ABC.

Метод 3: Использование регулярных выражений (RegExp)

Рассмотрим более профессиональный подход, который часто применяется в сложных задачах обработки текста. Регулярные выражения позволяют гибко управлять поиском и заменой. В среде Windows для этого используется COM-объект VBScript.RegExp.

Допустим, нам нужно оставить в строке только латинские буквы. Разберем по шагам создание такого механизма:


RegEx = Новый COMОбъект("VBScript.RegExp");
RegEx.IgnoreCase = Истина; // Игнорировать регистр
RegEx.Global = Истина;     // Искать все вхождения
RegEx.Pattern = "[^a-zA-Z]"; // Шаблон: всё, что НЕ является латинской буквой

ИсходныйНомер = "29J1";
ТолькоБуквы = RegEx.Replace(ИсходныйНомер, "");

Используя разные шаблоны (Pattern), мы можем решать разные задачи:

  1. \d — удалит все цифры (аналог метода с циклом, но быстрее).
  2. [^0-9] — наоборот, удалит все, кроме цифр.
  3. [0-9] — удалит только цифры.

Метод 4: Использование функций БСП

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), то в ней уже заложены мощные инструменты для работы со строками. Нам не нужно "изобретать велосипед", достаточно вызвать функцию из общего модуля СтроковыеФункцииКлиентСервер.

Функция ФильтроватьСтроку позволяет оставить в исходном тексте только те символы, которые входят в разрешенный набор. Посмотрим на пример:


ДопустимыеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
ИсходнаяСтрока = "29J1";
Результат = СтроковыеФункцииКлиентСервер.ФильтроватьСтроку(ИсходнаяСтрока, ДопустимыеСимволы);

Этот метод считается наиболее "чистым" с точки зрения архитектуры 1С, так как он использует штатные возможности платформы и библиотек.

Метод 5: Посимвольный перебор и анализ кодов

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

Для реализации мы используем функции Сред в цикле по длине строки и КодСимвола для проверки принадлежности к диапазонам (например, коды латиницы A-Z находятся в диапазоне 65–90).


Результат = "";
Для Поз = 1 По СтрДлина(ИсходныйНомер) Цикл
    ТекСимвол = Сред(ИсходныйНомер, Поз, 1);
    Код = КодСимвола(ТекСимвол);
    
    // Проверяем, является ли символ латинской буквой (A-Z)
    Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда
        Результат = Результат + ТекСимвол;
    КонецЕсли;
КонецЦикла;

Рекомендации по выбору метода

Подводя итог нашему анализу, дадим рекомендации по выбору инструмента в зависимости от ситуации:

  1. Если формат всегда одинаковый (например, 10 символов и буква на 5-м месте): используйте Сред. Это быстро и просто.
  2. Если нужно просто убрать цифры и конфигурация "самописная": используйте цикл со СтрЗаменить по цифрам 0-9.
  3. Если вы работаете в современной типовой конфигурации (ЕРП, УТ 11, БП 3.0): используйте функции модуля СтроковыеФункцииКлиентСервер.
  4. Если требуется сложная логика (извлечь только русские буквы, проигнорировать спецсимволы): используйте регулярные выражения RegExp.

При загрузке из Excel также не забывайте предварительно очищать строку от пробелов функцией СокрЛП, так как лишние невидимые символы могут нарушить работу любого из вышеперечисленных алгоритмов.

← На главную