Разработка и Конфигурация · 8 мин
Как перевернуть строку в 1С: готовые решения
Как перевернуть строку в 1С: функция на встроенном языке через цикл и Сред(), вариант через СтрПолучитьСтроку, работа с кириллицей, ошибки и проверка результата.
Во встроенном языке 1С нет готовой функции для разворота строки — аналога StrReverse, который есть в других языках. Поэтому разработчику приходится писать собственную процедуру. Задача встречается чаще, чем кажется: формирование номеров документов, разбор форматированных значений, обработка данных из внешних систем, алгоритмы контрольных сумм.
Решение занимает несколько строк кода, но есть нюансы: поведение функции Сред() при выходе за границы строки, работа с символами переноса, производительность на длинных текстах. Ниже — рабочие варианты кода, их сравнение и типичные ошибки.
Базовый способ: цикл с функцией Сред()
Классическое решение — пройти по строке от последнего символа к первому и собрать новую строку. Функция Сред(Строка, Позиция, 1) возвращает один символ в указанной позиции, а СтрДлина() даёт общее количество символов.
Функция ПеревернутьСтроку(ИсходнаяСтрока) Экспорт
Результат = "";
ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
Для Позиция = 1 По ДлинаСтроки Цикл
Результат = Сред(ИсходнаяСтрока, ДлинаСтроки - Позиция + 1, 1) + Результат;
КонецЦикла;
Возврат Результат;
КонецФункцииОбратите внимание на приём: новый символ добавляется в начало результата (Символ + Результат), а не в конец. Это и даёт разворот — первый обработанный символ (последний символ исходной строки) оказывается в самом начале результата.
Пример использования:
ИсходныйТекст = "Привет, 1С";
Результат = ПеревернутьСтроку(ИсходныйТекст);
// Результат: "С1 ,тевирП"Альтернативный вариант: цикл от конца к началу
Тот же результат даёт цикл с убывающим счётчиком. В языке 1С конструкция «Для ... Цикл» не поддерживает шаг -1 напрямую, поэтому используют цикл «Пока» или вычисляют позицию вручную.
Функция ПеревернутьСтроку2(ИсходнаяСтрока) Экспорт
Результат = "";
Позиция = СтрДлина(ИсходнаяСтрока);
Пока Позиция > 0 Цикл
Результат = Результат + Сред(ИсходнаяСтрока, Позиция, 1);
Позиция = Позиция - 1;
КонецЦикла;
Возврат Результат;
КонецФункцииЗдесь символы дописываются в конец результата, но обход идёт с последнего символа — эффект тот же. Какой вариант читабельнее — вопрос стиля команды; по скорости они практически эквивалентны.
Сравнение вариантов
Короткая запись, счётчик управляется платформой. Подходит для большинства задач, но конкатенация в начало строки чуть менее очевидна при чтении.
Логика разворота видна явно: идём с конца и дописываем в конец. Чуть больше кода, требуется вручную следить за счётчиком.
Символы складываются в массив и обходятся в обратном порядке. Удобно, если дальше нужна посимвольная обработка, но для простого разворота избыточно.
Разворот строки через массив
Если помимо разворота нужно анализировать символы (например, отбрасывать разделители или менять регистр), удобно сначала разложить строку в массив, а затем пройти его с конца.
Функция ПеревернутьСтроку3(ИсходнаяСтрока) Экспорт
Символы = Новый Массив;
ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
Для Позиция = 1 По ДлинаСтроки Цикл
Символы.Добавить(Сред(ИсходнаяСтрока, Позиция, 1));
КонецЦикла;
Результат = "";
Для Позиция = 1 По ДлинаСтроки Цикл
Результат = Результат + Символы[ДлинаСтроки - Позиция];
КонецЦикла;
Возврат Результат;
КонецФункцииИндексация массива в 1С начинается с нуля, поэтому обращение идёт по индексу ДлинаСтроки - Позиция. Это частое место ошибки: при попытке обратиться к элементу с индексом, равным длине, возникнет ошибка «Индекс находится за границами массива».
Особенности: кириллица, пробелы и многострочный текст
Строковые функции 1С (СтрДлина, Сред, Лев, Прав) работают с символами Unicode, поэтому кириллица, латиница, цифры и знаки препинания разворачиваются корректно без дополнительной обработки кодировок. Пробелы и знаки табуляции разворачиваются как обычные символы — они не теряются.
Многострочный текст с символами переноса строки (Символы.ПС) тоже разворачивается целиком: переносы окажутся в обратных позициях. Если задача — перевернуть порядок строк в многострочном тексте, а не символов, используйте другой подход: разбейте текст через СтрРазделить или обходите строки через СтрЧислоСтрок и СтрПолучитьСтроку, складывая их в обратном порядке.
// Разворот порядка строк в многострочном тексте
Функция ПеревернутьСтрокиТекста(Текст) Экспорт
Результат = "";
КоличествоСтрок = СтрЧислоСтрок(Текст);
Для Номер = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = СтрПолучитьСтроку(Текст, КоличествоСтрок - Номер + 1);
Результат = Результат + ТекущаяСтрока + Символы.ПС;
КонецЦикла;
Возврат Результат;
КонецФункцииПроизводительность на длинных строках
Конкатенация строк в цикле — операция, которая на каждом шаге создаёт новую строку в памяти. Для коротких значений (номера документов, коды, наименования) это незаметно. Но при развороте текстов в сотни тысяч символов время выполнения растёт нелинейно.
Если предполагается работа с большими текстами, собирайте результат порциями или пересмотрите саму задачу: часто вместо разворота всего текста достаточно найти нужную подстроку функциями СтрНайти с направлением поиска «СКонца» — это встроенный и быстрый механизм.
Проверка результата
Самый быстрый способ убедиться, что функция работает, — выполнить её во внешней обработке или через «Функциональность» → «Выполнить код» (в тонком клиенте при наличии соответствующих инструментов разработчика) и вывести результат через Сообщить().
Как проверить результат
Результат «ВБА» — все символы на месте, порядок обратный
Потерян первый или последний символ — ошибка в границах цикла
Результат «А» без ошибок
Ошибка выполнения — неверно рассчитана начальная позиция
Возвращается пустая строка, исключений нет
Ошибка или Неопределено в результате
Результат «3.8 С1» — пробелы сохранены
Пробелы исчезли — где-то применено СокрЛП или сокращение
Где разместить функцию в конфигурации
Если разворот строки нужен в нескольких местах, вынесите функцию в общий модуль с признаком «Сервер» (и «Вызов сервера», если обращение идёт с клиента). Для разовой задачи в обработке достаточно локальной функции в модуле объекта или формы.
- 1Создайте функцию ПеревернутьСтроку с параметром ИсходнаяСтрока в общем модуле или модуле обработки
- 2Скопируйте базовый вариант с циклом и функцией Сред()
- 3Проверьте работу на строках «АБВ», пустой строке и строке с пробелами
- 4Если функция вызывается с клиента, включите у общего модуля свойство «Вызов сервера»
- 5При передаче данных из запросов предварительно преобразуйте значение функцией Строка()
Частые вопросы
Есть ли в 1С встроенная функция разворота строки?
Нет. Во встроенном языке платформы функции типа StrReverse отсутствуют, разворот реализуется собственным кодом через цикл и функции Сред() и СтрДлина().
Корректно ли работает разворот с русскими буквами?
Да. Строковые функции 1С оперируют символами Unicode, поэтому кириллица, латиница, цифры и спецсимволы разворачиваются одинаково корректно, без проблем с кодировкой.
Как перевернуть не символы, а порядок слов в строке?
Разбейте строку на слова через СтрРазделить(Строка, " ") и пройдите полученный массив с конца, склеивая слова обратно через пробел. Учтите, что индексы массива начинаются с нуля.
Что вернёт функция при пустой входной строке?
При корректной реализации — пустую строку: СтрДлина() вернёт 0, цикл не выполнится ни разу. Ошибок это не вызывает, но передачу Неопределено или NULL следует исключить заранее.
Можно ли перевернуть строку запросом, без кода?
Нет, язык запросов 1С не содержит функций посимвольной обработки, достаточных для разворота строки. Разворот выполняется только средствами встроенного языка после получения данных.
Почему при развороте многострочного текста «ломается» структура?
Перенос строки — обычный символ, и при развороте он перемещается вместе с остальными. Чтобы перевернуть порядок строк, используйте СтрЧислоСтрок и СтрПолучитьСтроку с обратным обходом, а не посимвольный разворот.
Что важно запомнить
Готовой функции разворота строки в 1С нет — используйте цикл с Сред() и СтрДлина(). Помните: позиции в строке считаются с 1, индексы массивов — с 0. Для многострочного текста и разворота слов нужны отдельные подходы через СтрПолучитьСтроку или СтрРазделить.