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

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

Как поменять слова местами в 1С: практическое руководство

Как поменять слова местами в строке в 1С: разбор СтрРазделить, СтрСоединить, работа с ФИО, готовые процедуры перестановки слов и типичные ошибки разработчика.

Задача поменять слова местами в строке возникает в 1С чаще, чем кажется: привести ФИО из формата «Иванов Иван Иванович» к виду «Иван Иванович Иванов», переставить артикул и наименование в строке импорта, развернуть дату или обработать данные из CSV-файла. Во встроенном языке 1С нет одной готовой функции «перевернуть порядок слов», поэтому задача решается комбинацией строковых функций.

Основной инструмент — функции СтрРазделить() и СтрСоединить(), доступные начиная с платформы 8.3.6. Первая разбивает строку на массив по разделителю, вторая собирает массив обратно в строку. Между ними вы переставляете элементы массива в нужном порядке. Для старых платформ или нестандартных разделителей используются СтрНайти(), Лев(), Сред() и Прав().

Общий принцип: разбить, переставить, собрать

Любая перестановка слов в 1С сводится к трём шагам. Сначала строка разбивается на части по разделителю — чаще всего по пробелу. Затем элементы полученного массива меняются местами: напрямую через индексы, через промежуточную переменную или через цикл. Наконец, массив склеивается обратно в строку с тем же или другим разделителем.

Ошибка «Индекс находится за границами массива» при перестановке слов почти всегда означает, что разделитель в исходной строке отсутствует или слов оказалось меньше, чем ожидалось.

Порядок действий
  1. 1
    Определите разделитель слов: пробел, запятая, точка с запятой
  2. 2
    Разбейте строку: Массив = СтрРазделить(Строка, " ", Ложь)
  3. 3
    Переставьте элементы массива в нужном порядке
  4. 4
    Соберите строку: Результат = СтрСоединить(Массив, " ")
  5. 5
    Проверьте результат на строках с разным числом слов

Меняем местами два слова в строке

Простейший случай — строка из двух слов, которые нужно переставить. Например, «Иванов Иван» должно превратиться в «Иван Иванов». Код выглядит так:

Строка = "Иванов Иван";

Массив = СтрРазделить(Строка, " ", Ложь);

Результат = Массив[1] + " " + Массив[0];

// Результат: "Иван Иванов"

Третий параметр Ложь в СтрРазделить() отбрасывает пустые элементы — это защищает от двойных пробелов в исходных данных. Если его опустить, строка «Иванов  Иван» с двумя пробелами даст массив из трёх элементов, и перестановка сработает неверно.

Если разделитель не пробел, а, например, запятая с пробелом («Иванов, Иван»), укажите его целиком: СтрРазделить(Строка, ", ", Ложь). Разделитель может быть строкой любой длины.

Перестановка трёх и более слов: пример с ФИО

Классическая задача — преобразовать «Фамилия Имя Отчество» в «Имя Отчество Фамилия», например для печатных форм или выгрузки в банк. Здесь перестановку удобно делать через промежуточную переменную или сразу собирая результат из элементов массива:

ФИО = "Иванов Иван Иванович";

Части = СтрРазделить(ФИО, " ", Ложь);

Если Части.Количество() = 3 Тогда

Результат = Части[1] + " " + Части[2] + " " + Части[0];

Иначе

Результат = ФИО; // оставляем как есть

КонецЕсли;

Проверка Части.Количество() = 3 обязательна: в реальных базах встречаются ФИО без отчества, двойные фамилии через дефис и просто незаполненные поля. Без проверки код упадёт с ошибкой на первой же «неполной» строке.

Разворот всех слов строки в обратном порядке

Если нужно не обменять два конкретных слова, а развернуть всю строку («раз два три» → «три два раз»), используйте цикл с обходом массива с конца:

Функция РазвернутьСлова(Строка)

Части = СтрРазделить(Строка, " ", Ложь);

Результат = "";

Для Инд = 0 По Части.Количество() - 1 Цикл

Слово = Части[Части.Количество() - 1 - Инд];

Результат = Результат + ?(Результат = "", "", " ") + Слово;

КонецЦикла;

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

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

Альтернатива без ручной склейки — собрать новый массив в обратном порядке и передать его в СтрСоединить(). Такой вариант короче и меньше рискует оставить лишний пробел в начале или конце строки.

Способ для старых платформ: СтрНайти, Лев и Сред

На платформах ниже 8.3.6 функции СтрРазделить() нет, поэтому строку разбирают вручную. Для двух слов достаточно найти позицию пробела и взять левую и правую части:

Строка = "Иванов Иван";

Позиция = СтрНайти(Строка, " ");

Если Позиция > 0 Тогда

Слово1 = Лев(Строка, Позиция - 1);

Слово2 = Сред(Строка, Позиция + 1);

Результат = СокрЛП(Слово2) + " " + Слово1;

КонецЕсли;

Обратите внимание: СтрДлина() и Сред() в 1С работают с позициями, начиная с единицы, а не с нуля — это отличается от индексации массивов. Путаница между «массив с нуля» и «строка с единицы» — частый источник ошибок при ручном разборе.

Для строк с несколькими разделителями ручной разбор делают в цикле: ищут очередную позицию разделителя, вырезают слово, продолжают с остатка строки. Такой код длиннее, но позволяет обрабатывать любые форматы, включая смешанные разделители.

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

СтрРазделить + СтрСоединить

Самый короткий и читаемый способ. Требует платформу 8.3.6 или новее.

СтрНайти + Лев/Сред

Работает на любых платформах, но код длиннее и легче ошибиться с позициями.

Обмен через промежуточную переменную

Подходит, когда слова уже в отдельных переменных или колонках таблицы, без разбора строки.

Обмен значений между переменными и колонками

Иногда «поменять слова местами» означает не разбор строки, а обмен значений двух переменных или двух колонок таблицы значений. В 1С нет кортежного присваивания, поэтому используется классический обмен через третью переменную:

Врем = Значение1;

Значение1 = Значение2;

Значение2 = Врем;

Для таблицы значений обмен делается так же, построчно: в цикле по строкам таблицы значения двух колонок меняются местами через временную переменную. Не пытайтесь присвоить сразу обе колонки без буфера — второе присваивание уже получит перезаписанное значение первой.

Типичные ошибки
01
Не передан третий параметр Ложь в СтрРазделить — двойные пробелы создают пустые элементы и ломают перестановку
02
Нет проверки количества слов — код падает с ошибкой индекса на неполных данных
03
Обмен двух переменных без временной — одно значение теряется
04
Путаница индексации: массивы с нуля, строковые функции с единицы

Проверка результата и граничные случаи

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

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

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

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

Обычная строка из двух-трёх слов
Норма

Слова переставлены, пробелы одинарные

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

Лишние пробелы или потерянное слово

Строка с двойными пробелами
Норма

Результат корректный, пустышки отброшены

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

Слова сдвинуты, появились пустые места

Одно слово или пустая строка
Норма

Возвращается исходное значение без ошибки

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

Ошибка «Индекс за границами массива»

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

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

Передайте нужный разделитель вторым параметром в СтрРазделить(), например СтрРазделить(Строка, ",", Ложь). После перестановки соберите строку тем же разделителем через СтрСоединить(). При необходимости дополнительно обработайте каждый элемент функцией СокрЛП(), чтобы убрать пробелы вокруг запятых.

Можно ли поменять слова местами без программирования?

Штатных интерактивных средств перестановки слов в 1С нет. Если нужно разово исправить несколько записей, проще отредактировать их вручную. Для массовой обработки используют внешнюю обработку или групповое изменение реквизитов с алгоритмом на встроенном языке — это уже требует написания кода.

Что делать, если СтрРазделить недоступна в моей конфигурации?

Проверьте версию платформы и режим совместимости конфигурации. Если платформа ниже 8.3.6 или режим совместимости ограничивает функцию, используйте разбор строки через СтрНайти(), Лев() и Сред() в цикле — этот способ работает на любых версиях.

Как переставить фамилию в конец, если отчество может отсутствовать?

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

Почему после перестановки появляются лишние пробелы?

Чаще всего причина в пустых элементах массива из-за двойных пробелов в исходной строке. Передайте третий параметр Ложь в СтрРазделить(), чтобы пустые элементы отбрасывались, либо предварительно нормализуйте строку, заменив двойные пробелы на одинарные через СтрЗаменить() в цикле.

Итог

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

Перестановка слов в 1С — это разбор строки через СтрРазделить(), обмен элементов массива и сборка через СтрСоединить(). Всегда проверяйте количество слов, отбрасывайте пустые элементы и тестируйте массовые обработки на копии базы.