Работа со строками — это одна из самых частотных задач в практике разработчика 1С. Часто возникают ситуации, когда необходимо модифицировать текстовые данные: вставить разделитель в серийный номер, отформатировать артикул или просто добавить пробел в длинную строку для удобства чтения. В этой статье мы подробно разберем, как вставить символ (например, пробел) в произвольную позицию строки, проанализируем различные методы и выберем наиболее эффективные.
Самый простой и интуитивно понятный способ — это разделение исходной строки на две части и их последующее склеивание с добавлением нужного символа посередине. Для этого в платформе 1С:Предприятие предусмотрены встроенные функции Лев() и Сред(). Рассмотрим ситуацию, когда нам нужно вставить пробел после 14-го символа, чтобы он стал 15-м.
Проанализируем логику этого подхода: мы берем первые 14 символов, добавляем к ним пробел и присоединяем остаток строки, начиная с 15-го символа. Посмотрим на программную реализацию:
// Исходная строка
ИсходнаяСтрока = "01234567890123456789";
// Вставляем пробел после 14-го символа
Результат = Лев(ИсходнаяСтрока, 14) + " " + Сред(ИсходнаяСтрока, 15);
// Вывод результата: "01234567890123 " + "456789"
Сообщить(Результат);
Важно помнить особенность индексации в 1С: индексация символов начинается с 1. Если мы используем функцию Сред(ИсходнаяСтрока, 15) без указания третьего параметра (длины), система автоматически возьмет все символы до конца строки, что очень удобно в нашей задаче.
Иногда разработчики создают промежуточные переменные для каждой части строки, что делает код избыточным. Проанализируем пример «длинного» кода и сравним его с лаконичным вариантом:
// Неоптимальный вариант (излишние переменные)
Часть1 = Лев(ЦелаяЧасть, 14);
Часть2 = Сред(ЦелаяЧасть, 15);
ЦелаяЧасть = Часть1 + " " + Часть2;
// Оптимальный вариант
ЦелаяЧасть = Лев(ЦелаяЧасть, 14) + " " + Сред(ЦелаяЧасть, 15);
Как мы видим, использование промежуточных переменных Часть1 и Часть2 не дает никаких преимуществ, кроме потенциального замедления работы из-за выделения памяти под новые объекты. Рекомендуем использовать запись в одну строку.
Если ваша конфигурация работает на платформе версии 8.3.6 или выше, мы можем использовать функцию СтрШаблон(). Этот метод делает код более читаемым, так как визуально отделяет структуру строки от данных.
ИсходнаяСтрока = "1111222233334444";
ПозицияВставки = 14;
// Формируем строку по шаблону
НоваяСтрока = СтрШаблон("%1 %2",
Лев(ИсходнаяСтрока, ПозицияВставки),
Сред(ИсходнаяСтрока, ПозицияВставки + 1));
Такой подход особенно удобен, если нужно вставить сразу несколько пробелов в разные позиции (например, для форматирования номера телефона или банковского счета).
В некоторых случаях задача стоит сложнее: нужно расставить пробелы в строке в соответствии с заранее заданным образцом. Например, превратить строку «0123456789» в «0123 45 67 89». Рассмотрим алгоритм, который использует функцию СтрРазделить() для работы с шаблоном:
Процедура УстановитьПробелыПоОбразцу(Значение, СтрокаОбразец)
Результат = "";
// Разделяем образец на части по существующим в нем пробелам
МассивОбразец = СтрРазделить(СтрокаОбразец, " ");
ПозицияНачала = 1;
Для Инд = 0 По МассивОбразец.Количество() - 1 Цикл
ТекЭлемент = МассивОбразец[Инд];
ДлинаЭлемента = СтрДлина(ТекЭлемент);
Если ДлинаЭлемента > 0 Тогда
Результат = Результат + Сред(Значение, ПозицияНачала, ДлинаЭлемента);
ПозицияНачала = ПозицияНачала + ДлинаЭлемента;
КонецЕсли;
// Добавляем пробел после каждой группы символов, кроме последней
Если Инд < МассивОбразец.Количество() - 1 Тогда
Результат = Результат + " ";
КонецЕсли;
КонецЦикла;
Значение = Результат;
КонецПроцедуры
Данный метод позволяет гибко управлять форматом вывода, не привязываясь к конкретным индексам в коде, а вынося их в настройки или параметры.
Для профессиональной обработки строк, особенно если вставка должна происходить по сложному условию, целесообразно использовать объект VBScript.RegExp. Выясним, как это работает на практике. Регулярные выражения позволяют найти позицию и произвести замену одной командой.
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Ложь;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
// Паттерн: берем первые 14 символов в одну группу, остальное во вторую
RegExp.Pattern = "^(.{14})(.*)$";
ИсходнаяСтрока = "ABCDEABCDEABCDEABCDE";
// Подстановка: содержание первой группы, пробел, содержание второй группы
Результат = RegExp.Replace(ИсходнаяСтрока, "$1 $2");
Преимущество: этот метод чрезвычайно быстр при массовой обработке и позволяет реализовывать логику, которую на обычных функциях Лев() и Прав() пришлось бы писать десятками строк.
При выборе метода вставки символов важно учитывать объем обрабатываемых данных. Разберем ключевые моменты:
СтрСоединить) работает в 5–10 раз медленнее, чем обычное сложение строк.+ может привести к росту потребления памяти. В таких случаях рекомендуется использовать объект ЗаписьТекста или записывать результат во временный файл, если объемы данных критичны.Формат() чаще применяется для чисел, помните, что для строковых данных она практически неприменима в контексте вставки произвольных пробелов, если только вы не преобразуете строку в число (что часто невозможно для артикулов или GUID).Мы рассмотрели несколько подходов к модификации строк в 1С. Подведем итог:
Лев() + " " + Сред().Надеемся, что эти примеры помогут вам писать более чистый и эффективный код в ваших проектах на платформе 1С!