При разработке и обработке текстовых данных в 1С нередко возникает задача: необходимо отсечь часть строки после определенного символа-разделителя (например, дефиса), когда длина левой части заранее неизвестна. Рассмотрим подробнее несколько способов решения этой задачи на языке встроенного языка 1С:Предприятие.
Проанализируем базовый подход с использованием функции поиска позиций символа. Функция СтрНайти возвращает номер символа, с которого начинается искомый разделитель, а функция Лев подрезает строку слева на указанное количество знаков.
Важная деталь: функция СтрНайти возвращает позицию самого дефиса. Чтобы не оставить дефис в конце итогового значения, необходимо уменьшить позицию на единицу (Поз - 1). Также обязательно следует предусмотреть случай, когда разделитель вовсе отсутствует в строке, чтобы избежать ошибки при передаче отрицательного или нулевого значения в Лев.
Разберем по шагам правильный алгоритм проверки и отсечения:
ИсходнаяСтрока = "99844-2";
ПозицияДефиса = СтрНайти(ИсходнаяСтрока, "-");
Если ПозицияДефиса > 0 Тогда
Результат = Лев(ИсходнаяСтрока, ПозицияДефиса - 1);
Иначе
Результат = ИсходнаяСтрока;
КонецЕсли;
Начиная с версии платформы 8.3.6, в 1С доступна функция СтрРазделить. Она позволяет выгрузить части строки, разделенные указанным символом, в массив. Первая часть текста будет находиться в нулевом элементе полученного массива.
Посмотрим на пример использования данного метода:
ИсходнаяСтрока = "99844-2";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, "-");
Результат = МассивЧастей[0];
Преимущество метода заключается в его устойчивости: если дефиса в тексте не окажется, функция вернет массив из одного элемента со всей исходной строкой, и обращение к МассивЧастей[0] не приведет к ошибке.
Интересный альтернативный трюк заключается в замене разделителя на символ переноса строки (Символы.ПС) с последующим считыванием только первой строки с помощью СтрПолучитьСтроку.
Рассмотрим пример реализации:
ИсходнаяСтрока = "555-985";
ТекстСПереносами = СтрЗаменить(ИсходнаяСтрока, "-", Символы.ПС);
Результат = СтрПолучитьСтроку(ТекстСПереносами, 1);
Обратите внимание: данный подход имеет ограничения. Если исходный текст изначально содержит собственные переносы строк, их структура может быть нарушена. Для обработки огромных массивов данных лучше использовать первый или второй способ для оптимизации нагрузки на память.
Выясним, какие инструменты можно применить в типовых конфигурациях или на свежих версиях платформы:
СтрРазделить делит строку по каждому из символов отдельно. В таком случае рекомендуется использовать функцию общего модуля БСП:
МассивЧастей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока, "-");
Результат = МассивЧастей[0];
СтрЗаменитьПоРегулярномуВыражению). В более ранних версиях платформы для этой цели также можно использовать COM-объект VBScript.RegExp.Таким образом, для большинства повседневных задач подрезки строк оптимальным решением является связка Лев + СтрНайти с проверкой позиции либо встроенная функция СтрРазделить.