Разработка и Конфигурация · 10 мин
Как в строку вставить символ в 1С
Способы вставить символ в строку в 1С: Лев, Прав, Сред, СтрЗаменить и Символ. Примеры кода, типичные ошибки, проверка результата и ответы на частые вопросы.
Строки во встроенном языке 1С неизменяемы: нельзя присвоить новое значение отдельному символу по индексу, как в некоторых других языках. Поэтому вставка символа выполняется через сборку новой строки из частей исходной — с помощью функций Лев(), Прав(), Сред() и оператора конкатенации +. Для замены подстрок удобнее СтрЗаменить(), а для получения символа по коду — функция Символ().
Выбор способа зависит от задачи: известна ли позиция вставки, нужно ли вставить символ после определённой подстроки, требуется ли служебный символ (перевод строки, табуляция, неразрывный пробел). Ниже разобраны все основные сценарии с готовыми примерами кода, которые работают и в тонком клиенте, и на сервере.
Базовый способ: вставка по позиции через Лев, Сред и конкатенацию
Универсальный приём — разрезать исходную строку на две части и склеить их с вставляемым символом между ними. Функция Лев(Строка, N) возвращает первые N символов, Сред(Строка, N) — всё, начиная с позиции N, а оператор + объединяет части.
ИсходнаяСтрока = "ПриветМир";
Позиция = 7; // вставляем после 7-го символа
НоваяСтрока = Лев(ИсходнаяСтрока, Позиция) + " " + Сред(ИсходнаяСтрока, Позиция + 1);
// Результат: "Привет Мир"
Нумерация символов в 1С начинается с единицы, а не с нуля — это частая причина смещения на один символ. Если нужно вставить символ перед позицией N, левая часть берётся как Лев(Строка, N - 1), а правая — Сред(Строка, N).
Для вставки в начало строки достаточно конкатенации: НоваяСтрока = "0" + ИсходнаяСтрока;. Для вставки в конец — ИсходнаяСтрока + "0", либо Прав() в составе более сложных выражений не требуется.
// Вставка символа в позицию N строки
Функция ВставитьСимвол(Стр, Симв, Позиция)
Возврат Лев(Стр, Позиция - 1) + Симв + Сред(Стр, Позиция);
КонецФункцииВставка символа после найденной подстроки
Когда позиция заранее неизвестна, её находят функцией СтрНайти() (в старых версиях платформы — Найти()). Функция возвращает номер первого символа вхождения или 0, если подстрока не найдена.
Стр = "Иванов;Иван;Иванович";
Позиция = СтрНайти(Стр, ";");
Если Позиция > 0 Тогда
Стр = Лев(Стр, Позиция) + " " + Сред(Стр, Позиция + 1);
КонецЕсли;
// Результат: "Иванов; Иван;Иванович"
Обязательно проверяйте результат СтрНайти() на ноль: если подстрока не найдена, вычисления Лев(Стр, Позиция - 1) дадут пустую строку или ошибочный результат, и символ «вклеится» не туда. Проверка Если Позиция > 0 — минимальная защита.
Для поиска с конца строки (например, последний разделитель в пути к файлу) используйте СтрНайти() с параметром направления поиска НаправлениеПоиска.СКонца — так вы найдёте последнее вхождение без цикла.
Вставка служебных символов: перевод строки, табуляция, кавычки
Не все символы можно набрать в литерале. Для них платформа предоставляет два механизма: функцию Символ(Код), принимающую код Unicode, и объект Символы с готовыми константами.
| Что вставить | Способ | Пример |
|---|---|---|
| Перевод строки | Символы.ПС или Символ(10) | "Строка1" + Символы.ПС + "Строка2" |
| Табуляция | Символы.Таб или Символ(9) | Кол1 + Символы.Таб + Кол2 |
| Неразрывный пробел | Символ(160) | "1" + Символ(160) + "000" |
| Кавычка внутри строки | удвоенная кавычка | "ООО ""Ромашка""" |
| Возврат каретки | Символы.ВК или Символ(13) | обычно в паре с ПС для Windows-файлов |
Неразрывный пробел (код 160) заслуживает отдельного внимания: 1С часто форматирует числа именно с ним, и при обратном разборе строки обычный пробел в шаблоне поиска не совпадёт. Если СтрНайти() «не видит» пробел в числе, почти наверняка там символ 160 — ищите через Символ(160) или предварительно заменяйте его через СтрЗаменить(Стр, Символ(160), " ").
Замена и вставка через СтрЗаменить
Если задача — не столько вставка в позицию, сколько «добавить символ рядом с каждым вхождением подстроки», проще использовать замену: заменить искомую подстроку на неё же плюс нужный символ.
// Добавить пробел после каждой запятой
Стр = СтрЗаменить(Стр, ",", ", ");
СтрЗаменить() заменяет все вхождения сразу и возвращает новую строку — исходная переменная не меняется, пока вы не присвоите ей результат. Это удобно для массовой обработки: разбивки числа на разряды, расстановки разделителей, нормализации текста.
Ограничение метода — отсутствие условий: заменяются все вхождения без исключений. Если нужно обработать только первое вхождение или вставку по условию, возвращайтесь к связке СтрНайти() + Лев() + Сред().
Вставка символов циклом: разряды, маски, форматирование
Типовая прикладная задача — вставить разделитель через каждые N символов: разбить длинный номер на группы, отформатировать счёт, подготовить строку для печатной формы. Это делается циклом с накоплением результата.
Номер = "123456789012";
Результат = "";
Сч = 0;
Для Поз = 1 По СтрДлина(Номер) Цикл
Результат = Результат + Сред(Номер, Поз, 1);
Сч = Сч + 1;
Если Сч = 4 И Поз < СтрДлина(Номер) Тогда
Результат = Результат + "-";
Сч = 0;
КонецЕсли;
КонецЦикла;
// Результат: "1234-5678-9012"
Условие Поз < СтрДлина(Номер) не даёт добавить разделитель после последней группы — без него строка закончится висячим дефисом. Для группировки справа налево (как разряды тысяч в числах) удобнее идти циклом от конца строки или сначала развернуть строку.
Для чисел в пользовательском интерфейсе ручная разбивка обычно не нужна: функция Формат() и строка форматирования (например, Формат(Сумма, "ЧГ=3")) выводят группы разрядов штатно. Ручная сборка оправдана для номеров договоров, штрихкодов, масок ввода и обмена с внешними системами.
- 1Определите позицию вставки: фиксированная, по подстроке (СтрНайти) или периодическая (цикл)
- 2Соберите новую строку: Лев(Стр, N-1) + Символ + Сред(Стр, N)
- 3Проверьте граничные случаи: пустая строка, позиция 1, позиция за концом строки
- 4Проверьте результат выводом через Сообщить() или в отладчике
Типичные ошибки и как их избежать
Первая ошибка — попытка присвоить символ по индексу: конструкция вида Стр[3] = "а" в 1С не работает, квадратные скобки для строк недоступны. Только сборка новой строки.
Вторая — путаница с нумерацией: позиции начинаются с 1, поэтому «вставить после третьего символа» означает Лев(Стр, 3) + Симв + Сред(Стр, 4), а не смещение на 3/3 как в языках с нулевой индексацией.
Третья — игнорирование неразрывных пробелов и невидимых символов в данных, пришедших из форматирования или из Excel. Строка визуально выглядит одинаково, но сравнение и поиск не срабатывают. Перед обработкой нормализуйте строку: СтрЗаменить(Стр, Символ(160), " ") и СокрЛП().
Проверка результата и граничные случаи
Перед использованием функции в рабочем коде проверьте её на крайних значениях: пустая исходная строка, вставка в первую позицию, вставка после последнего символа, строка из одного символа. Лев("") и Сред("", 1) возвращают пустую строку без ошибки, поэтому на пустом входе результатом будет просто вставленный символ — решите заранее, допустимо ли это для вашей логики.
Если позиция вставки превышает длину строки, Сред(Стр, N) вернёт пустую строку, и символ окажется в конце. Это не ошибка платформы, но может скрыть дефект в расчёте позиции — при отладке сравнивайте позицию со СтрДлина(Стр).
Как проверить результат
СтрДлина увеличилась ровно на число вставленных символов
Длина не изменилась — результат функции не присвоен переменной
Символ стоит ровно там, где ожидалось, соседние символы на месте
Смещение на один — перепутана нумерация с 1
Переводы строк и табуляции отображаются в многострочном поле
Вместо разрыва виден один пробел — использован неверный код символа
Что важно запомнить
Вставка символа в 1С — это сборка новой строки: Лев() + символ + Сред(). Позицию ищут через СтрНайти(), спецсимволы берут из Символы или Символ(код), групповую вставку делают циклом. Нумерация символов — с единицы, а неразрывный пробел (код 160) — частая причина «неработающего» поиска.
Частые вопросы
Можно ли изменить символ строки по индексу, как Стр[3] = "а"?
Нет. Строки в 1С неизменяемы, обращение по индексу на запись не поддерживается. Соберите новую строку: Лев(Стр, 2) + "а" + Сред(Стр, 4) — это заменит третий символ.
Как вставить кавычку внутрь строкового литерала?
Удвоить её: Стр = "ООО ""Ромашка""";. В результате в строке окажется одна кавычка в каждом месте, где в литерале записано две.
Чем отличается Символы.ПС от Символ(10)?
По сути ничем: Символы.ПС — это именованная константа для символа с кодом 10. Константа читается нагляднее, а Символ(код) универсальнее, когда нужен символ, для которого нет готовой константы, например неразрывный пробел — Символ(160).
СтрНайти не находит пробел в числе, хотя он виден. Почему?
Скорее всего, это неразрывный пробел (код 160), которым 1С разделяет разряды при форматировании чисел. Ищите СтрНайти(Стр, Символ(160)) или предварительно замените его на обычный пробел через СтрЗаменить(Стр, Символ(160), " ").
Как вставить разделитель через каждые три цифры справа налево?
Идите циклом от конца строки, накапливая группы по три символа, либо разверните строку, разбейте слева направо и разверните обратно. Для вывода чисел пользователю проще использовать Формат(Число, "ЧГ=3") — платформа сама расставит группы разрядов.
СтрЗаменить не меняет строку, в чём дело?
Функция возвращает новую строку и не изменяет исходную переменную. Присвойте результат: Стр = СтрЗаменить(Стр, ",", ", ");. Без присваивания исходная строка останется прежней.