Почему функция СтрНайти в 1С при поиске с конца возвращает позицию от начала строки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе со строковыми функциями в 1С разработчики часто сталкиваются с неверной трактовкой параметра НаправлениеПоиска.СКонца функции СтрНайти. Рассмотрим типичную ситуацию: требуется найти позицию символа подчеркивания в строке "СводнаяТаблицаОтметка_1", двигаясь справа налево. Ожидается, что результат будет равен 2 (второй символ с конца), однако функция возвращает 22.

Разберем подробно, почему так происходит, как правильно интерпретировать возвращаемое значение и какими способами можно получить нужный индекс или вырезать подстроку.

Принцип работы направления поиска в функции СтрНайти

Проанализируем ключевое отличие между направлением поиска и точкой отсчета индекса:

  1. Направление поиска определяет направление движения алгоритма по строке: слева направо (по умолчанию) или справа налево при указании НаправлениеПоиска.СКонца.
  2. Точка отсчета индекса в 1С всегда остается неизменной. Возвращаемая позиция — это всегда порядковый номер символа от начала строки (начиная с 1).

Таким образом, параметр НаправлениеПоиска.СКонца не меняет систему координат строки, а лишь указывает платформе начинать просмотр символов с последнего и двигаться влево до первого совпадения. Найдя символ, функция возвращает его абсолютную позицию от начала исходной строки.

Пересчет позиции символа с конца строки

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

Индекс с конца рассчитывается как разница между полной длиной строки и найденной позицией плюс 1.

Посмотрим на пример кода:


ИсходнаяСтрока = "СводнаяТаблицаОтметка_1";
ПозицияОтНачала = СтрНайти(ИсходнаяСтрока, "_", НаправлениеПоиска.СКонца);

Если ПозицияОтНачала > 0 Тогда
    ИндексСКонца = СтрДлина(ИсходнаяСтрока) - ПозицияОтНачала + 1;
    // ИндексСКонца будет равен 2
КонецЕсли;

Важно: Всегда проверяйте условие ПозицияОтНачала > 0. Если искомый символ не найден в строке, функция СтрНайти возвращает 0. Без предварительной проверки формула СтрДлина(Строка) - 0 + 1 вернет ложный результат, превышающий длину строки.

Разбор параметров функции СтрНайти

Рассмотрим полный синтаксис функции СтрНайти, доступный в платформе 1С:Предприятие:

СтрНайти(Строка, ПодстрокаПоиска, [НаправлениеПоиска], [НачальнаяПозиция], [НомерВхождения])

  1. Строка — исходная строка, в которой выполняется поиск.
  2. ПодстрокаПоиска — искомый фрагмент текста. Поиск выполняется с учетом регистра.
  3. НаправлениеПоиска — значение системного перечисления: НаправлениеПоиска.СНачала или НаправлениеПоиска.СКонца.
  4. НачальнаяПозиция — номер символа (от начала строки), с которого начинается поиск. При поиске с конца значение также задается от начала строки, а поиск идет от этого символа влево к первому.
  5. НомерВхождения — позволяет найти не только первое вхождение подстроки, но и 2-е, 3-е и так далее.

Альтернативные варианты решения практических задач

Во многих сценариях вычислять индекс с конца вовсе не требуется. Рассмотрим распространенные альтернативные подходы:

1. Получение подстроки после разделителя через Сред

Если цель — получить текст, находящийся после последнего разделителя, позиция от начала строки передается напрямую в функцию Сред:


ИсходнаяСтрока = "СводнаяТаблицаОтметка_1";
Поз = СтрНайти(ИсходнаяСтрока, "_", НаправлениеПоиска.СКонца);

Если Поз > 0 Тогда
    ЗначениеПослеЗнака = Сред(ИсходнаяСтрока, Поз + 1);
    // ЗначениеПослеЗнака = "1"
КонецЕсли;

2. Разбиение строки на массив с помощью СтрРазделить

Когда символ выступает в роли разделителя составной строки, удобно использовать функцию СтрРазделить и взять последний элемент полученного массива:


ИсходнаяСтрока = "СводнаяТаблицаОтметка_1";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, "_");

Если МассивЧастей.Количество() > 0 Тогда
    ПоследняяЧасть = МассивЧастей[МассивЧастей.Количество() - 1];
    // ПоследняяЧасть = "1"
КонецЕсли;

3. Проверка окончания строки

Если требуется лишь проверить, оканчивается ли текст на заданный суффикс, предпочтительнее применять встроенную функцию СтрЗаканчиваетсяНа(Строка, Подстрока), которая возвращает булево значение.

Ограничения использования в запросах

Обратим внимание на работу с подстроками в языке запросов 1С. Функция СтрНайти доступна в запросах, однако она принимает только 2 параметра: исходную строку и подстроку поиска. Направление поиска СКонца на уровне запросов не поддерживается платформой, поэтому поиск справа налево необходимо выполнять на стороне программного кода после выборки данных.

← На главную