К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как перевернуть строку в 1С: готовые решения

Как перевернуть строку в 1С: функция на встроенном языке через цикл и Сред(), вариант через СтрПолучитьСтроку, работа с кириллицей, ошибки и проверка результата.

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

Решение занимает несколько строк кода, но есть нюансы: поведение функции Сред() при выходе за границы строки, работа с символами переноса, производительность на длинных текстах. Ниже — рабочие варианты кода, их сравнение и типичные ошибки.

Базовый способ: цикл с функцией Сред()

Классическое решение — пройти по строке от последнего символа к первому и собрать новую строку. Функция Сред(Строка, Позиция, 1) возвращает один символ в указанной позиции, а СтрДлина() даёт общее количество символов.

bsl
Функция ПеревернутьСтроку(ИсходнаяСтрока) Экспорт

	Результат = "";
	ДлинаСтроки = СтрДлина(ИсходнаяСтрока);

	Для Позиция = 1 По ДлинаСтроки Цикл
		Результат = Сред(ИсходнаяСтрока, ДлинаСтроки - Позиция + 1, 1) + Результат;
	КонецЦикла;

	Возврат Результат;

КонецФункции

Обратите внимание на приём: новый символ добавляется в начало результата (Символ + Результат), а не в конец. Это и даёт разворот — первый обработанный символ (последний символ исходной строки) оказывается в самом начале результата.

Пример использования:

bsl
ИсходныйТекст = "Привет, 1С";
Результат = ПеревернутьСтроку(ИсходныйТекст);
// Результат: "С1 ,тевирП"

Альтернативный вариант: цикл от конца к началу

Тот же результат даёт цикл с убывающим счётчиком. В языке 1С конструкция «Для ... Цикл» не поддерживает шаг -1 напрямую, поэтому используют цикл «Пока» или вычисляют позицию вручную.

bsl
Функция ПеревернутьСтроку2(ИсходнаяСтрока) Экспорт

	Результат = "";
	Позиция = СтрДлина(ИсходнаяСтрока);

	Пока Позиция > 0 Цикл
		Результат = Результат + Сред(ИсходнаяСтрока, Позиция, 1);
		Позиция = Позиция - 1;
	КонецЦикла;

	Возврат Результат;

КонецФункции

Здесь символы дописываются в конец результата, но обход идёт с последнего символа — эффект тот же. Какой вариант читабельнее — вопрос стиля команды; по скорости они практически эквивалентны.

Сравнение вариантов

Цикл со сдвигом позиции (Для)

Короткая запись, счётчик управляется платформой. Подходит для большинства задач, но конкатенация в начало строки чуть менее очевидна при чтении.

Цикл Пока с убывающей позицией

Логика разворота видна явно: идём с конца и дописываем в конец. Чуть больше кода, требуется вручную следить за счётчиком.

Разворот через массив

Символы складываются в массив и обходятся в обратном порядке. Удобно, если дальше нужна посимвольная обработка, но для простого разворота избыточно.

Разворот строки через массив

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

bsl
Функция ПеревернутьСтроку3(ИсходнаяСтрока) Экспорт

	Символы = Новый Массив;
	ДлинаСтроки = СтрДлина(ИсходнаяСтрока);

	Для Позиция = 1 По ДлинаСтроки Цикл
		Символы.Добавить(Сред(ИсходнаяСтрока, Позиция, 1));
	КонецЦикла;

	Результат = "";
	Для Позиция = 1 По ДлинаСтроки Цикл
		Результат = Результат + Символы[ДлинаСтроки - Позиция];
	КонецЦикла;

	Возврат Результат;

КонецФункции

Индексация массива в 1С начинается с нуля, поэтому обращение идёт по индексу ДлинаСтроки - Позиция. Это частое место ошибки: при попытке обратиться к элементу с индексом, равным длине, возникнет ошибка «Индекс находится за границами массива».

Особенности: кириллица, пробелы и многострочный текст

Строковые функции 1С (СтрДлина, Сред, Лев, Прав) работают с символами Unicode, поэтому кириллица, латиница, цифры и знаки препинания разворачиваются корректно без дополнительной обработки кодировок. Пробелы и знаки табуляции разворачиваются как обычные символы — они не теряются.

Многострочный текст с символами переноса строки (Символы.ПС) тоже разворачивается целиком: переносы окажутся в обратных позициях. Если задача — перевернуть порядок строк в многострочном тексте, а не символов, используйте другой подход: разбейте текст через СтрРазделить или обходите строки через СтрЧислоСтрок и СтрПолучитьСтроку, складывая их в обратном порядке.

bsl
// Разворот порядка строк в многострочном тексте
Функция ПеревернутьСтрокиТекста(Текст) Экспорт

	Результат = "";
	КоличествоСтрок = СтрЧислоСтрок(Текст);

	Для Номер = 1 По КоличествоСтрок Цикл
		ТекущаяСтрока = СтрПолучитьСтроку(Текст, КоличествоСтрок - Номер + 1);
		Результат = Результат + ТекущаяСтрока + Символы.ПС;
	КонецЦикла;

	Возврат Результат;

КонецФункции

Производительность на длинных строках

Конкатенация строк в цикле — операция, которая на каждом шаге создаёт новую строку в памяти. Для коротких значений (номера документов, коды, наименования) это незаметно. Но при развороте текстов в сотни тысяч символов время выполнения растёт нелинейно.

Если предполагается работа с большими текстами, собирайте результат порциями или пересмотрите саму задачу: часто вместо разворота всего текста достаточно найти нужную подстроку функциями СтрНайти с направлением поиска «СКонца» — это встроенный и быстрый механизм.

Типичные ошибки
01
Смешение индексации: позиции в строке считаются с 1, индексы массива — с 0. Смешение даёт ошибку выхода за границы или потерю символа.
02
Пустая исходная строка не проверяется: цикл просто не выполнится и вернётся пустая строка — обычно это корректно, но стоит явно учесть в логике вызывающего кода.
03
Значение Неопределено вместо строки: передача NULL или Неопределено из запроса вызовет ошибку приведения типа — преобразуйте значение функцией Строка() или проверьте перед вызовом.
04
Ожидание, что разворот многострочного текста перевернёт порядок строк: разворачиваются символы, а не строки, переносы тоже становятся символами в новых позициях.

Проверка результата

Самый быстрый способ убедиться, что функция работает, — выполнить её во внешней обработке или через «Функциональность» → «Выполнить код» (в тонком клиенте при наличии соответствующих инструментов разработчика) и вывести результат через Сообщить().

Контрольные точки

Как проверить результат

Строка «АБВ»
Норма

Результат «ВБА» — все символы на месте, порядок обратный

Тревожный признак

Потерян первый или последний символ — ошибка в границах цикла

Строка из одного символа «А»
Норма

Результат «А» без ошибок

Тревожный признак

Ошибка выполнения — неверно рассчитана начальная позиция

Пустая строка
Норма

Возвращается пустая строка, исключений нет

Тревожный признак

Ошибка или Неопределено в результате

Строка с пробелами и цифрами «1С 8.3»
Норма

Результат «3.8 С1» — пробелы сохранены

Тревожный признак

Пробелы исчезли — где-то применено СокрЛП или сокращение

Где разместить функцию в конфигурации

Если разворот строки нужен в нескольких местах, вынесите функцию в общий модуль с признаком «Сервер» (и «Вызов сервера», если обращение идёт с клиента). Для разовой задачи в обработке достаточно локальной функции в модуле объекта или формы.

Порядок действий
  1. 1
    Создайте функцию ПеревернутьСтроку с параметром ИсходнаяСтрока в общем модуле или модуле обработки
  2. 2
    Скопируйте базовый вариант с циклом и функцией Сред()
  3. 3
    Проверьте работу на строках «АБВ», пустой строке и строке с пробелами
  4. 4
    Если функция вызывается с клиента, включите у общего модуля свойство «Вызов сервера»
  5. 5
    При передаче данных из запросов предварительно преобразуйте значение функцией Строка()

Частые вопросы

Есть ли в 1С встроенная функция разворота строки?

Нет. Во встроенном языке платформы функции типа StrReverse отсутствуют, разворот реализуется собственным кодом через цикл и функции Сред() и СтрДлина().

Корректно ли работает разворот с русскими буквами?

Да. Строковые функции 1С оперируют символами Unicode, поэтому кириллица, латиница, цифры и спецсимволы разворачиваются одинаково корректно, без проблем с кодировкой.

Как перевернуть не символы, а порядок слов в строке?

Разбейте строку на слова через СтрРазделить(Строка, " ") и пройдите полученный массив с конца, склеивая слова обратно через пробел. Учтите, что индексы массива начинаются с нуля.

Что вернёт функция при пустой входной строке?

При корректной реализации — пустую строку: СтрДлина() вернёт 0, цикл не выполнится ни разу. Ошибок это не вызывает, но передачу Неопределено или NULL следует исключить заранее.

Можно ли перевернуть строку запросом, без кода?

Нет, язык запросов 1С не содержит функций посимвольной обработки, достаточных для разворота строки. Разворот выполняется только средствами встроенного языка после получения данных.

Почему при развороте многострочного текста «ломается» структура?

Перенос строки — обычный символ, и при развороте он перемещается вместе с остальными. Чтобы перевернуть порядок строк, используйте СтрЧислоСтрок и СтрПолучитьСтроку с обратным обходом, а не посимвольный разворот.

Итог

Что важно запомнить

Готовой функции разворота строки в 1С нет — используйте цикл с Сред() и СтрДлина(). Помните: позиции в строке считаются с 1, индексы массивов — с 0. Для многострочного текста и разворота слов нужны отдельные подходы через СтрПолучитьСтроку или СтрРазделить.