При работе со строковыми функциями в 1С разработчики часто сталкиваются с неверной трактовкой параметра НаправлениеПоиска.СКонца функции СтрНайти. Рассмотрим типичную ситуацию: требуется найти позицию символа подчеркивания в строке "СводнаяТаблицаОтметка_1", двигаясь справа налево. Ожидается, что результат будет равен 2 (второй символ с конца), однако функция возвращает 22.
Разберем подробно, почему так происходит, как правильно интерпретировать возвращаемое значение и какими способами можно получить нужный индекс или вырезать подстроку.
Проанализируем ключевое отличие между направлением поиска и точкой отсчета индекса:
НаправлениеПоиска.СКонца.Таким образом, параметр НаправлениеПоиска.СКонца не меняет систему координат строки, а лишь указывает платформе начинать просмотр символов с последнего и двигаться влево до первого совпадения. Найдя символ, функция возвращает его абсолютную позицию от начала исходной строки.
Если для решения алгоритмической задачи требуется получить индекс именно от конца строки (справа налево), применяют математический пересчет. Проанализируем формулу расчета:
Индекс с конца рассчитывается как разница между полной длиной строки и найденной позицией плюс 1.
Посмотрим на пример кода:
ИсходнаяСтрока = "СводнаяТаблицаОтметка_1";
ПозицияОтНачала = СтрНайти(ИсходнаяСтрока, "_", НаправлениеПоиска.СКонца);
Если ПозицияОтНачала > 0 Тогда
ИндексСКонца = СтрДлина(ИсходнаяСтрока) - ПозицияОтНачала + 1;
// ИндексСКонца будет равен 2
КонецЕсли;
Важно: Всегда проверяйте условие ПозицияОтНачала > 0. Если искомый символ не найден в строке, функция СтрНайти возвращает 0. Без предварительной проверки формула СтрДлина(Строка) - 0 + 1 вернет ложный результат, превышающий длину строки.
Рассмотрим полный синтаксис функции СтрНайти, доступный в платформе 1С:Предприятие:
СтрНайти(Строка, ПодстрокаПоиска, [НаправлениеПоиска], [НачальнаяПозиция], [НомерВхождения])
Строка — исходная строка, в которой выполняется поиск.ПодстрокаПоиска — искомый фрагмент текста. Поиск выполняется с учетом регистра.НаправлениеПоиска — значение системного перечисления: НаправлениеПоиска.СНачала или НаправлениеПоиска.СКонца.НачальнаяПозиция — номер символа (от начала строки), с которого начинается поиск. При поиске с конца значение также задается от начала строки, а поиск идет от этого символа влево к первому.НомерВхождения — позволяет найти не только первое вхождение подстроки, но и 2-е, 3-е и так далее.Во многих сценариях вычислять индекс с конца вовсе не требуется. Рассмотрим распространенные альтернативные подходы:
1. Получение подстроки после разделителя через Сред
Если цель — получить текст, находящийся после последнего разделителя, позиция от начала строки передается напрямую в функцию Сред:
ИсходнаяСтрока = "СводнаяТаблицаОтметка_1";
Поз = СтрНайти(ИсходнаяСтрока, "_", НаправлениеПоиска.СКонца);
Если Поз > 0 Тогда
ЗначениеПослеЗнака = Сред(ИсходнаяСтрока, Поз + 1);
// ЗначениеПослеЗнака = "1"
КонецЕсли;
2. Разбиение строки на массив с помощью СтрРазделить
Когда символ выступает в роли разделителя составной строки, удобно использовать функцию СтрРазделить и взять последний элемент полученного массива:
ИсходнаяСтрока = "СводнаяТаблицаОтметка_1";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, "_");
Если МассивЧастей.Количество() > 0 Тогда
ПоследняяЧасть = МассивЧастей[МассивЧастей.Количество() - 1];
// ПоследняяЧасть = "1"
КонецЕсли;
3. Проверка окончания строки
Если требуется лишь проверить, оканчивается ли текст на заданный суффикс, предпочтительнее применять встроенную функцию СтрЗаканчиваетсяНа(Строка, Подстрока), которая возвращает булево значение.
Обратим внимание на работу с подстроками в языке запросов 1С. Функция СтрНайти доступна в запросах, однако она принимает только 2 параметра: исходную строку и подстроку поиска. Направление поиска СКонца на уровне запросов не поддерживается платформой, поэтому поиск справа налево необходимо выполнять на стороне программного кода после выборки данных.