При работе с текстовыми данными в 1С часто возникает необходимость выделить первое слово из строки, переместить его в другую позицию или вовсе пропустить, чтобы получить оставшуюся часть текста. Рассмотрим подробнее, как мы можем решить эти задачи, используя различные встроенные функции платформы 1С.
Мы выясним, какие стандартные функции помогут нам в этой работе, и как их правильно применять для достижения нужного результата. Разберем по шагам несколько методов, от простых до более продвинутых.
Найти и ЛевОдин из самых прямолинейных и часто используемых способов получить первое слово – это найти позицию первого пробела в строке, а затем с помощью функции Лев извлечь символы до этого пробела. Мы будем использовать функцию Найти для поиска разделителя (пробела) и функцию Лев для получения левой части строки.
Функция Найти(Строка, ПодстрокаПоиска) возвращает числовую позицию первого вхождения указанной подстроки в строку. Если подстрока не найдена, возвращается 0.
ПозицияПробела = Найти("Фамилия Имя Отчество", " "); // Вернет 9
Функция Лев(Строка, КоличествоСимволов) возвращает указанное количество символов с начала строки. Чтобы исключить сам пробел, мы укажем количество символов как ПозицияПробела - 1.
ПервоеСлово = Лев("Фамилия Имя Отчество", 9 - 1); // Вернет "Фамилия"
Если в строке нет пробелов (т.е. строка состоит из одного слова), функция Найти вернет 0. В этом случае первое слово будет вся строка. Для такого сценария мы можем написать универсальную функцию:
Функция ПолучитьПервоеСлово(ИсходнаяСтрока)
ПозицияПробела = Найти(ИсходнаяСтрока, " ");
Если ПозицияПробела > 0 Тогда
Результат = Лев(ИсходнаяСтрока, ПозицияПробела - 1);
Иначе
Результат = ИсходнаяСтрока; // Если пробела нет, вся строка - это первое слово
КонецЕсли;
Возврат Результат;
КонецФункции
// Пример использования:
СтрокаТекст = "Фамилия Имя Отчество";
Слово1 = ПолучитьПервоеСлово(СтрокаТекст); // Слово1 будет "Фамилия"
СтрокаОдноСлово = "ЕдинственноеСлово";
СловоЕдинственное = ПолучитьПервоеСлово(СтрокаОдноСлово); // СловоЕдинственное будет "ЕдинственноеСлово"
Для получения части строки после первого слова мы можем использовать функцию Сред. Она позволяет извлечь подстроку, начиная с определенной позиции и заданной длины. Если мы хотим получить все, что идет после первого пробела, мы начнем с позиции ПозицияПробела + 1.
Важно помнить, что функция Найти вернет 0, если пробел не найден. В таком случае, если мы попытаемся использовать ПозицияПробела + 1, это может привести к ошибке или неверному результату. Поэтому нам нужно сначала проверить, был ли пробел найден.
Функция ПолучитьОстатокСтрокиПослеПервогоСлова(ИсходнаяСтрока)
ПозицияПробела = Найти(ИсходнаяСтрока, " ");
Если ПозицияПробела > 0 Тогда
// Начинаем выборку с позиции, следующей за пробелом
Остаток = Сред(ИсходнаяСтрока, ПозицияПробела + 1);
Иначе
Остаток = ""; // Если пробела нет, остатка нет
КонецЕсли;
Возврат СокрЛП(Остаток); // Удаляем возможные начальные пробелы, если их было несколько
КонецФункции
// Пример использования:
СтрокаТекст = "Фамилия Имя Отчество";
ОстатокТекста = ПолучитьОстатокСтрокиПослеПервогоСлова(СтрокаТекст); // ОстатокТекста будет "Имя Отчество"
СтрокаОдноСлово = "ЕдинственноеСлово";
ОстатокЕдинственного = ПолучитьОстатокСтрокиПослеПервогоСлова(СтрокаОдноСлово); // ОстатокЕдинственного будет ""
Обратите внимание на использование функции СокрЛП(). Она удаляет начальные и конечные пробелы, что критически важно для чистоты данных, особенно когда после разделителя могут идти несколько пробелов или строка начинается с пробела после извлечения.
Современный и более гибкий подход к работе со строками, содержащими несколько слов или частей, разделённых общим символом, – это их разделение на массив подстрок. В 1С для этого существуют функции СтрРазделить (начиная с версии 8.3.6) и универсальные функции из Библиотеки Стандартных Подсистем (БСП), такие как РазложитьСтрокуВМассивПодстрок.
СтрРазделитьФункция СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>) возвращает массив строк, разделенных по указанному разделителю.
Мы указываем исходную строку и символ-разделитель (в нашем случае – пробел).
СтрокаТекст = "Фамилия Имя Отчество";
МассивСлов = СтрРазделить(СтрокаТекст, " ");
// МассивСлов будет содержать:
// МассивСлов[0] = "Фамилия"
// МассивСлов[1] = "Имя"
// МассивСлов[2] = "Отчество"
После разделения строки на массив, первое слово будет находиться по индексу 0.
Если МассивСлов.Количество() > 0 Тогда
ПервоеСлово = МассивСлов[0]; // ПервоеСлово будет "Фамилия"
Иначе
ПервоеСлово = "";
КонецЕсли;
Для получения оставшейся части строки мы можем собрать все элементы массива, начиная со второго (индекс 1), обратно в строку с помощью функции СтрСоединить.
Функция ПолучитьОстатокСтрокиИзМассива(МассивСлов, Разделитель)
Если МассивСлов.Количество() > 1 Тогда
// Создадим новый массив без первого элемента
МассивБезПервого = Новый Массив;
Для Индекс = 1 По МассивСлов.ВГраница() Цикл
МассивБезПервого.Добавить(МассивСлов[Индекс]);
КонецЦикла;
Возврат СтрСоединить(МассивБезПервого, Разделитель);
Иначе
Возврат "";
КонецЕсли;
КонецФункции
СтрокаТекст = "Фамилия Имя Отчество";
МассивСлов = СтрРазделить(СтрокаТекст, " ");
ОстатокТекста = ПолучитьОстатокСтрокиИзМассива(МассивСлов, " "); // ОстатокТекста будет "Имя Отчество"
РазложитьСтрокуВМассивПодстрок из БСПВо многих типовых конфигурациях 1С (например, Бухгалтерия Предприятия 3.0) есть общие модули, содержащие универсальные функции для работы со строками. Одной из таких функций является РазложитьСтрокуВМассивПодстрок, которая может быть удобна, если вы уже работаете с БСП. Эта функция более универсальна, чем СтрРазделить, так как позволяет использовать разделитель любой длины и более тонко настраивать поведение с пустыми строками.
Посмотрим на пример кода такой функции:
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт
Результат = Новый Массив;
// Для обеспечения обратной совместимости и обработки крайних случаев
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Подстрока));
Иначе
Результат.Добавить(Подстрока);
КонецЕсли;
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Строка));
Иначе
Результат.Добавить(Строка);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Используем эту функцию так же, как и СтрРазделить:
СтрокаТекст = "Фамилия Имя Отчество";
МассивСлов = РазложитьСтрокуВМассивПодстрок(СтрокаТекст, " ");
Если МассивСлов.Количество() > 0 Тогда
ПервоеСлово = МассивСлов[0]; // ПервоеСлово будет "Фамилия"
КонецЕсли;
Эта функция позволяет более гибко работать с разделителями, которые могут состоять из нескольких символов, и контролировать обработку пустых подстрок.
Задача перемещения первого слова может быть интерпретирована по-разному: например, переместить его в конец строки или вставить в определённую позицию внутри оставшейся части строки. Рассмотрим оба варианта.
Это достаточно распространенная задача, когда нам нужно изменить порядок слов, например, для формирования определенных отчетов или наименований.
Мы уже знаем, как это делать с помощью функций ПолучитьПервоеСлово и ПолучитьОстатокСтрокиПослеПервогоСлова, которые мы рассмотрели в Методе 1.
Новая строка будет состоять из остатка строки, за которым следует пробел, а затем первое слово.
Функция ПереместитьПервоеСловоВКонец(ИсходнаяСтрока)
ПервоеСлово = ПолучитьПервоеСлово(ИсходнаяСтрока);
ОстатокСтроки = ПолучитьОстатокСтрокиПослеПервогоСлова(ИсходнаяСтрока);
Если ПустаяСтрока(ОстатокСтроки) Тогда
// Если был только одно слово, оно и останется
Возврат ПервоеСлово;
Иначе
// Соединяем остаток и первое слово, добавляя пробел между ними
Возврат ОстатокСтроки + " " + ПервоеСлово;
КонецЕсли;
КонецФункции
// Пример использования:
СтрокаТекст = "Фамилия Имя Отчество";
НоваяСтрока = ПереместитьПервоеСловоВКонец(СтрокаТекст); // НоваяСтрока будет "Имя Отчество Фамилия"
В одном из сообщений форума была предложена функция ПереместитьПервоеСлово, которая принимает исходную строку и "позицию вставки". Давайте проанализируем её и посмотрим, как она работает.
Функция ПереместитьПервоеСлово(Слово, ПозицияВставки)
Слово = СокрЛП(Слово);
ПозПервСлово = Найти(Слово," ");
ПервоеСлово = СокрЛП(Лев(Слово,ПозПервСлово-1));
ОставщеесяСлово = СокрЛП(Сред(Слово,ПозПервСлово,СтрДлина(Слово)));
Возврат Сред(ОставщеесяСлово,1,ПозицияВставки)+ПервоеСлово+Сред(ОставщеесяСлово,ПозицияВставки+1,СтрДлина(ОставщеесяСлово));
КонецФункции
Сначала функция очищает входную строку с помощью СокрЛП. Затем она находит позицию первого пробела (ПозПервСлово), извлекает первое слово (ПервоеСлово) и оставшуюся часть строки (ОставщеесяСлово).
Пример: для строки "Фамилия Имя Отчество"
ПозПервСлово станет 9 (индекс первого пробела).ПервоеСлово станет "Фамилия".ОставщеесяСлово станет "Имя Отчество" (Сред(Слово, 9, СтрДлина(Слово)) сначала вернет " Имя Отчество", а СокрЛП удалит начальный пробел).Далее происходит основная логика вставки:
Возврат Сред(ОставщеесяСлово,1,ПозицияВставки)+ПервоеСлово+Сред(ОставщеесяСлово,ПозицияВставки+1,СтрДлина(ОставщеесяСлово));
Здесь происходит следующее:
Сред(ОставщеесяСлово,1,ПозицияВставки): Берется часть ОставшеесяСлово от начала до указанной ПозицияВставки.+ПервоеСлово+: Вставляется извлеченное ПервоеСлово.Сред(ОставщеесяСлово,ПозицияВставки+1,СтрДлина(ОставщеесяСлово)): Берется оставшаяся часть ОставшеесяСлово, начиная с символа, следующего за ПозицияВставки, и до конца.Давайте посмотрим, как это работает на примере:
СтрокаТекст = "Фамилия Имя Отчество";
Позиция = 2; // Вставляем первое слово после 2-го символа в "Имя Отчество"
Результат = ПереместитьПервоеСлово(СтрокаТекст, Позиция);
// Трассировка:
// ПервоеСлово = "Фамилия"
// ОставщеесяСлово = "Имя Отчество"
// Сред("Имя Отчество", 1, 2) -> "Им"
// ПервоеСлово -> "Фамилия"
// Сред("Имя Отчество", 2 + 1, СтрДлина("Имя Отчество")) -> Сред("Имя Отчество", 3, 13) -> "я Отчество"
// Итого: "Им" + "Фамилия" + "я Отчество" = "ИмФамилияя Отчество"
Таким образом, эта функция не перемещает первое слово в новую словесную позицию, а вставляет его в конкретную символьную позицию внутри оставшейся части строки. Это очень специфичное поведение. Если вам нужна более логичная перестановка слов (например, сделать первое слово вторым), то потребуется другая логика, возможно, с использованием массивов слов.
Например, чтобы сделать первое слово вторым, мы бы сначала разделили строку на массив, затем переставили элементы массива и снова соединили их:
Функция СделатьПервоеСловоВторым(ИсходнаяСтрока)
МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь); // Ложь - чтобы не включать пустые, если есть лишние пробелы
Если МассивСлов.Количество() >= 2 Тогда
Первое = МассивСлов[0];
Второе = МассивСлов[1];
МассивСлов[0] = Второе;
МассивСлов[1] = Первое;
Возврат СтрСоединить(МассивСлов, " ");
Иначе
Возврат ИсходнаяСтрока; // Если слов меньше двух, ничего не меняем
КонецЕсли;
КонецФункции
// Пример: "Фамилия Имя Отчество" -> "Имя Фамилия Отчество"
Часто возникает задача получить часть строки, которая начинается сразу после первого слова. Например, если у нас есть строка "Фамилия Имя Отчество", а нам нужно получить только "Имя Отчество".
Найти и Сред.
Это наиболее эффективный способ. Мы находим позицию первого пробела, а затем используем функцию Сред, чтобы извлечь все символы, начиная с позиции, следующей за этим пробелом.
СтрокаФИО = "Фамилия Имя Отчество";
ПозицияПробела = Найти(СтрокаФИО, " ");
Если ПозицияПробела > 0 Тогда
// Начинаем выборку с позиции, следующей за первым пробелом
СтрокаИО = Сред(СтрокаФИО, ПозицияПробела + 1);
Иначе
СтрокаИО = ""; // Если пробелов нет, значит, есть только одно слово (фамилия), и "ИО" отсутствует
КонецЕсли;
// Для чистоты результата, особенно если после первого слова может быть несколько пробелов:
СтрокаИО = СокрЛП(СтрокаИО); // СтрокаИО будет "Имя Отчество"
Именно такое решение предлагает Cooler на форуме, подчеркивая важность СокрЛП для очистки результата.
Как мы уже видели в Методе 2, можно разбить строку на массив, а затем собрать все элементы, кроме первого, обратно в строку.
СтрокаФИО = "Фамилия Имя Отчество";
МассивСлов = СтрРазделить(СтрокаФИО, " ", Ложь);
Если МассивСлов.Количество() > 1 Тогда
МассивБезФамилии = Новый Массив;
Для Индекс = 1 По МассивСлов.ВГраница() Цикл
МассивБезФамилии.Добавить(МассивСлов[Индекс]);
КонецЦикла;
СтрокаИО = СтрСоединить(МассивБезФамилии, " "); // СтрокаИО будет "Имя Отчество"
Иначе
СтрокаИО = "";
КонецЕсли;
Этот подход более гибок, если вам нужно работать не только с первым словом, но и, например, пропустить несколько первых слов или извлечь диапазон слов.
Платформа 1С предоставляет богатый арсенал средств для манипуляций со строками, помимо тех, что мы уже рассмотрели. Знакомство с ними расширит ваши возможности.
СтрСоединить:
Эта функция, парная к СтрРазделить, позволяет собрать элементы массива строк в одну строку, используя заданный разделитель. Мы уже использовали её для восстановления строки из массива слов.
МассивЧастей = Новый Массив;
МассивЧастей.Добавить("Первая");
МассивЧастей.Добавить("Вторая");
МассивЧастей.Добавить("Третья");
СоединеннаяСтрока = СтрСоединить(МассивЧастей, "-"); // "Первая-Вторая-Третья"
СтрНайти (вместо Найти):
Более новая и мощная функция СтрНайти предлагает расширенные возможности по сравнению с базовой Найти(). Она позволяет искать подстроку с указанной позиции, в разных направлениях (с начала, с конца) и находить вхождение с указанным номером (например, второе или третье вхождение пробела).
Текст = "Раз два три четыре";
// Найти второе вхождение пробела (после "два")
ПозицияВторогоПробела = СтрНайти(Текст, " ", 1, 2); // Вернет 8 (позиция пробела после "два")
Это может быть очень полезно, если ваша задача выходит за рамки поиска только первого слова.
СтрЧислоВхождений:
Эта функция возвращает количество вхождений подстроки в строку. Она может быть полезна для подсчета слов (по количеству пробелов), хотя и не учитывает множественные пробелы между словами как один.
Текст = "Раз два три";
КоличествоПробелов = СтрЧислоВхождений(Текст, " "); // Вернет 2 (два пробела)
ПустаяСтрока:
Критически важная функция для проверки того, является ли строка пустой. Она учитывает не только отсутствие символов, но и строки, состоящие только из пробелов, табуляций или символов переноса строки. Всегда используйте её для валидации, чтобы избежать ошибок при работе с пустыми или некорректными входными данными.
Если ПустаяСтрока(МояСтрока) Тогда
// Обработка случая, когда строка пуста
КонецЕсли;
СокрЛ, СокрП, СокрЛП:
Мы уже упоминали СокрЛП, которая обрезает пробельные символы (пробелы, табуляции, символы переноса строки) с обоих концов строки. СокрЛ делает это только слева, а СокрП – только справа. Регулярное использование этих функций помогает поддерживать чистоту данных и избегать ошибок из-за лишних пробелов.
СтрокаСПробелами = " Пример строки ";
СокрЛП(СтрокаСПробелами); // "Пример строки"
СокрЛ(СтрокаСПробелами); // "Пример строки "
СокрП(СтрокаСПробелами); // " Пример строки"
Если вам нужно удалить все пробелы из строки (например, для создания идентификаторов), можно использовать функцию СтрЗаменить.
СтрокаСПробелами = "Строка с пробелами";
СтрокаБезПробелов = СтрЗаменить(СтрокаСПробелами, " ", ""); // "Строкаспробелами"
Однако, если речь идет обо всех видах пробельных символов (табуляции, неразрывные пробелы и т.п.), на помощь приходят регулярные выражения.
Начиная с версии 8.3.23, в 1С появилась встроенная поддержка регулярных выражений, что открывает совершенно новые горизонты для работы со сложными текстовыми шаблонами. Функции СтрНайтиПоРегулярномуВыражению, СтрЗаменитьПоРегулярномуВыражению и СтрПодобнаПоРегулярномуВыражению позволяют находить, заменять и проверять строки по очень гибким шаблонам. Например, можно легко найти первое слово, игнорируя любое количество пробелов, или извлечь слова, соответствующие определенной структуре (только цифры, только буквы).
Это мощный инструмент для самых сложных задач парсинга строк, который мы рекомендуем изучить для продвинутой работы с текстом.
Как мы видим, для решения задачи извлечения и манипуляции первым словом, а также для других операций со строками в 1С, существует множество инструментов. Вы можете выбрать наиболее подходящий метод в зависимости от сложности вашей задачи, требований к производительности и используемой версии платформы 1С. От простых комбинаций Найти и Лев/Сред до использования массивов слов или мощных регулярных выражений — каждый подход имеет свои преимущества и оптимальную область применения.