Найти первое вхождение и заменить два фрагмента своего текста

Учебные задачи

СтрНайти языка запросов ищет без учёта регистра и возвращает позицию от 1 либо 0. СтрЗаменить применяем к двум заранее заданным совпадающим фрагментам.

Где и как запускать

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

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

  6. Этот запрос без ИЗ получает одну строку только из явно заданных своих параметров. Справочники, документы, регистры, временные таблицы и рабочие сведения не читаются.

  7. В модуле BSL запрос — многострочная строка: кавычки его текстовых констант удвоены, продолжения начинаются с |. Не добавляйте значение параметра склейкой в текст запроса.

  8. Речь о функциях внутри языка запросов, не о внешне похожих функциях BSL. Их правила и доступность сверены с shquery_ru.hbk установленной 8.5.1.1343, но запросы здесь в 1С не выполнялись.

Процедура ВыполнитьПример() Экспорт
    Исходная = "Код: ama-01; ama-02";
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    &Исходная КАК Исходная,
    |    СТРНАЙТИ(&Исходная, &Искомое) КАК ПерваяПозиция,
    |    СТРНАЙТИ(&Исходная, ""ZZZ"") КАК НетСовпадений,
    |    СТРЗАМЕНИТЬ(&Исходная, ""ama"", ""SKU"") КАК Заменённая";
    Запрос.УстановитьПараметр("Исходная", Исходная);
    Запрос.УстановитьПараметр("Искомое", "AMA");
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Если НЕ Выборка.Следующий() Тогда
        ВызватьИсключение "Запрос из собственных параметров должен вернуть одну строку";
    КонецЕсли;
    Сообщить(Выборка.ПерваяПозиция = 6);
    Сообщить(Выборка.НетСовпадений = 0);
    Сообщить(Выборка.Заменённая = "Код: SKU-01; SKU-02");
    Сообщить(Выборка.Исходная = Исходная);
    Сообщить("Исходная: " + Выборка.Исходная);
    Сообщить("Два вхождения заменены: " + Выборка.Заменённая);
    Если Выборка.Следующий() Тогда
        ВызватьИсключение "У запроса без источников ожидалась ровно одна строка";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Задать собственную строку Код: ama-01; ama-02 и отдельный параметр поиска AMA.

  2. Поиск AMA находит первое ama в позиции 6, несмотря на разный регистр. Это правило функции в запросе, не заимствованное правило BSL.

  3. Отдельно поиск ZZZ даёт 0: не найдено, а не первый символ.

  4. Замена точного фрагмента ama на SKU меняет оба заранее заданных вхождения; исходный параметр не записывается обратно.

  5. Вывести исходную и новую строки отдельно и сравнить четыре поля результата с ожидаемыми.

  6. Проверить единственность строки; не переносить произвольное правило чувствительности замены к регистру из поведения поиска.

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

  1. Четыре проверки Истина, затем исходная и Код: SKU-01; SKU-02.

  2. ПерваяПозиция=6, НетСовпадений=0; сравнение позиций с 0 обязательно до использования результата как индекса.

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

Ожидаемый результат

На одной собственной строке отделены первое найденное вхождение, отсутствие и замена всех совпадающих фрагментов.

На что обратить внимание

  1. 0 от СтрНайти нельзя выдавать за найденный первый символ.

  2. Две функции выполняют разные операции: поиск сам по себе ничего не заменяет.

  3. Свойство поиска без учёта регистра прямо описано в shquery_ru.hbk; не переносите его автоматически на функцию BSL с похожим именем.

  4. У этих функций справка предупреждает об отсутствии передачи в Дата акселератор. У длинных/переменных замен также меняется оценка длины результирующей строки.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.