В процессе разработки в среде 1С:Предприятие часто возникает задача парсинга (разбора) строк. Это может быть работа с артикулами, номерами телефонов, серийными номерами или любыми другими данными, которые хранятся в одном реквизите в формате, разделенном дефисами, точками или пробелами. Например, у нас есть строка вида 777-7777-77, и нам необходимо разбить ее на три отдельных составляющих, чтобы заполнить соответствующие поля в базе данных.
В этой статье мы подробно рассмотрим все возможные способы решения данной задачи, начиная от современных функций платформы 8.3 и заканчивая универсальными методами, работающими даже в версии 7.7. Мы проанализируем преимущества каждого подхода и выясним, какой из них будет наиболее оптимальным в вашей ситуации.
Начиная с версии платформы 8.3.6, разработчикам стал доступен наиболее элегантный и производительный метод — функция СтрРазделить. Рассмотрим, как она работает. Данная функция принимает исходную строку и разделитель, а возвращает массив подстрок.
Разберем конкретный пример кода:
ИсходнаяСтрока = "777-7777-77";
МассивРезультат = СтрРазделить(ИсходнаяСтрока, "-");
// Теперь мы можем обратиться к каждому элементу массива
Если МассивРезультат.Количество() >= 3 Тогда
Рек1 = МассивРезультат[0]; // Будет "777"
Рек2 = МассивРезультат[1]; // Будет "7777"
Рек3 = МассивРезультат[2]; // Будет "77"
КонецЕсли;
Важный нюанс: Обратите внимание, что индексация массивов в 1С начинается с нуля. Всегда проверяйте количество элементов в полученном массиве с помощью метода Количество(), прежде чем обращаться к конкретному индексу. Это позволит избежать критической ошибки «Индекс находится вне границ массива», если входная строка окажется некорректной.
Если ваша конфигурация построена на базе БСП (что является стандартом для современных типовых решений), мы рекомендуем использовать функции общего модуля СтроковыеФункцииКлиентСервер. Это обеспечит лучшую совместимость и читаемость кода.
Проанализируем пример использования:
СтрокаДляРазбора = "777-7777-77";
Разделитель = "-";
МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаДляРазбора, Разделитель);
Если МассивПодстрок.Количество() > 0 Тогда
Рек1 = МассивПодстрок[0];
// Продолжаем обработку остальных элементов
КонецЕсли;
Преимущество этого метода заключается в том, что функция БСП часто содержит дополнительные проверки (например, на пустые строки между разделителями) и работает стабильно на разных версиях платформы, даже если они ниже 8.3.6.
Этот способ можно назвать «классическим». Он отлично подходит для версий платформы 8.0, 8.1 и 8.2, где функция СтрРазделить еще не была реализована. Идея заключается в том, чтобы заменить символ-разделитель на символ перевода строки (Символы.ПС), превращая строку в многострочный текст. После этого мы можем работать со строками по их номерам.
Рассмотрим по шагам:
СокрЛП.СтрПолучитьСтроку для извлечения нужной части.
ТекстРазбора = СтрЗаменить(СокрЛП(ИсходнаяСтрока), "-", Символы.ПС);
// Теперь получаем каждую строку по номеру
Рек1 = СтрПолучитьСтроку(ТекстРазбора, 1);
Рек2 = СтрПолучитьСтроку(ТекстРазбора, 2);
Рек3 = СтрПолучитьСтроку(ТекстРазбора, 3);
Метод очень прост в реализации, однако стоит помнить, что он работает корректно только в том случае, если исходные данные сами не содержат символов переноса строки.
В старых версиях платформы (например, 7.7) или когда требуется очень тонкая настройка парсинга, мы используем базовые строковые функции. Этот метод основан на последовательном поиске позиции разделителя.
Проанализируем ситуацию:
Стр = "777-7777-77";
Разделитель = "-";
// Ищем первый разделитель
Поз1 = Найти(Стр, Разделитель);
Рек1 = Лев(Стр, Поз1 - 1);
// Остаток строки после первого дефиса
Остаток = Сред(Стр, Поз1 + 1);
// Ищем второй разделитель в остатке
Поз2 = Найти(Остаток, Разделитель);
Рек2 = Лев(Остаток, Поз2 - 1);
Рек3 = Сред(Остаток, Поз2 + 1);
Этот код выглядит более громоздким, но он дает полный контроль над процессом. Например, если разделители могут быть разными или их количество заранее неизвестно, такой алгоритм можно легко обернуть в цикл Пока.
Для профессиональной обработки строк, особенно когда формат может «плавать» (например, вместо дефиса может стоять точка или пробел), мы можем задействовать объект VBScript.RegExp через COM-соединение. Это мощный инструмент, позволяющий не только разбивать строку, но и проверять её валидность.
Выясним, как это реализовать:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "([0-9]+)-([0-9]+)-([0-9]+)"; // Шаблон для поиска трех групп цифр
RegExp.Global = Истина;
Matches = RegExp.Execute(ИсходнаяСтрока);
Если Matches.Count > 0 Тогда
Match = Matches.Item(0);
Рек1 = Match.SubMatches.Item(0); // Первая группа
Рек2 = Match.SubMatches.Item(1); // Вторая группа
Рек3 = Match.SubMatches.Item(2); // Третья группа
КонецЕсли;
Этот способ наиболее надежен, если вы хотите убедиться, что в реквизитах окажутся именно цифры, а не случайный текст.
При решении подобных задач мы рекомендуем придерживаться следующих правил:
Маска у поля ввода в конфигураторе (например, 999-9999-99). Это избавит вас от необходимости писать сложный код парсинга.СтрЗаменить(Строка, Символ(160), "").СтрРазделить, так как это нативная функция платформы, работающая максимально быстро.Попытка...Исключение, если работаете с внешними данными.Подводя итог, можно сказать, что выбор метода зависит от вашей версии платформы и сложности задачи. Для 8.3 используйте СтрРазделить, для универсальности — замену на перенос строки, а для сложных шаблонов — регулярные выражения. Сочетание этих подходов позволит вам эффективно решать любые задачи по манипуляции строковыми данными в 1С.