- СтрНайти, что ему не нравится?
- Функция СтрШаблон()
- Синтаксис
- Параметры
- Возвращаемое значение
- Описание
- Доступность
- Пример использования
- Совместное использование НСтр() и СтрШаблон() #365
- Comments
- qtLex commented Sep 13, 2019 •
- Из АПК:
- Описание
- Предлагаемая критичность:
- nixel2007 commented Sep 13, 2019
- qtLex commented Sep 13, 2019
- qtLex commented Sep 13, 2019
- nixel2007 commented Sep 13, 2019
- nixel2007 commented Sep 13, 2019
- zeegin commented Sep 13, 2019
- Заметки из Зазеркалья
- Функция форматирования СтрШаблон()
- Функция работы со строками СтрСравнить()
- Функции работы со строками СтрНачинаетсяС(), СтрЗаканчиваетсяНа()
- Функции работы со строками СтрРазделить(), СтрСоединить()
- Функция работы со строками СтрНайти()
- Функция СтрШаблон с именованными маркерами
СтрНайти, что ему не нравится?
Во внешней обработке
код
НомерВхождения=0;
СтрНайти(СокрЛП(СтрокаТЗОтчетПроизводстваЗаСмену.Комментрарий),»#». НомерВхождения);
Если НомерВхождения > 0 Тогда
ОтчетКоммент = СокрЛП(Сред(СтрокаТЗОтчетПроизводстваЗаСмену.Комментрарий,НомерВхождения));
Если ОтчетКоммент = РеализацияКомментарий Тогда
СтрРеалицации.СформированОтчет = «Сформирован»;
КонецЕсли;
КонецЕсли;
Ошибка
<ВнешняяОбработка.ФормированиеОтчетовЗаСменуНаОснованииРеализации.Форма.Форма.Форма(7565,5)>: Процедура или функция с указанным именем не определена (СтрНайти)
>СтрНайти(СокрЛП(СтрокаТЗОтчетПроизводстваЗаСмену.Комментрарий),»#». НомерВхождения); (Проверка: Толстый клиент (обычное приложение))
что ему не нравится?
(5) Режим совместимости = да
(6) ОФ — толстый клиент
вообще
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.
Может так сработает?
СтрНайти (StrFind)
Синтаксис:
Тип: Строка.
Указывает направление поиска подстроки в строке.
Указывает позицию в строке, с которой начинается поиск.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СНачала, то значение по умолчанию равно 1.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СКонца, то значение по умолчанию равно длине строки.
Допускаются значения от 1 до количества символов в строке, в которой выполняется поиск. Если указано значение, не входящее в диапазон, генерируется ошибка «Неверное значение параметра».
Тип: Число.
Указывает номер вхождения искомой подстроки в исходной строке.
Значение по умолчанию: 1.
Возвращаемое значение:
Тип: Число.
Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
Описание:
Находит первое вхождение искомой строки как подстроки в исходной строке.
Сравнение выполняется с учетом регистра.
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.
Примечание:
Если параметр пустая строка, то возвращает 1.
Если оба параметра пустые строки, то возвращает 1.
Пример:
Источник
Функция СтрШаблон()
Формирует строку по заданному шаблону
Синтаксис
Функция СтрШаблон() имеет следующий синтаксис:
А также альтернативный англоязычный синтаксис:
Параметры
Описание параметров функции СтрШаблон() :
| Имя параметра | Тип | Описание |
|---|---|---|
| Шаблон | Строка | Содержит шаблон конечной строки. Шаблон может состоять из обычного текста и параметров, которые начинаются с подстановочного знака % (процента) |
| Значение1. Значение10 | Строка | Подстановочные значения. Максимальное количество параметров = 10 |
| Жирным шрифтом выделены обязательные параметры | ||
Возвращаемое значение
Строка
Строка шаблона с подставленными параметрами.
Описание
Функция СтрШаблон() формирует конечную строку, путем подстановки строковых представлений фактических параметров в указанные места шаблона. Шаблон может состоять из текста и параметров. Каждый параметр начинается с подстановочного знака %(процент), за которым следует порядковый номер параметра. Нумерация параметров начинается с 1. Если количество параметров в шаблоне не совпадает с количеством фактически переданных параметров, будет сгенерировано исключение: «Недостаточно фактических параметров» или «Очень много параметров» .
Чтобы указать в шаблоне символ процента, необходимо указать его дважды: %%. При этом, если за ним стоит цифра, то она уже не будет воспринята, как параметр.
Чтобы в шаблоне указать сразу после параметра цифру, следует номер параметра заключить в круглые скобки. Например: %(1)1 сорт
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример использования
Пример кода с использованием функции СтрШаблон() :
Источник
Совместное использование НСтр() и СтрШаблон() #365
Comments
qtLex commented Sep 13, 2019 •
Из АПК:
Требование — Ограничение на использование метода «СтрШаблон()» в коде модулей
Правило — Поиск метода «СтрШаблон()»
Ошибка — Использование метода «СтрШаблон()» (456)
Описание
Например, имеем следущий код в модулях конфигурации:
Избавимся от прослойки вызовов и лишних методов с помощью метода СтрШаблон():
Конфигурация не всегда сразу полностью переводится на другой язык. И, если в системе будет работать пользователь, у которого будет установлен язык не RU, то первый код отработает корректно, а второй выдаст ошибку исполнения.
Во втором случае локализованной строки нет, следовательно, параметров в строке нет, следовательно, возникает ошибка исполнения.
В связи с этим, в модулях конфигураций принято решение не использовать СтрШаблон() до исправления ошибки платформы.
Предлагаемая критичность:
ERROR
MAJOR
1 min
The text was updated successfully, but these errors were encountered:
nixel2007 commented Sep 13, 2019
Я что-то смысла диагностики не понимаю. Не вызывать СтрШаблон поверх НСтр? Если да, то это не КодСмелл, это потенциальный баг и эксепшен в рантайме
qtLex commented Sep 13, 2019
Не вызывать СтрШаблон поверх НСтр? Если да, то это не КодСмелл, это потенциальный баг и эксепшен в рантайме
Согласен. Внес изменения в первоначальный текст.
Тут правда не понятно насколько жестким быть.
Ругаться только на явно вложенные вызовы или вообще на использование СтрШаблон().
Формирование строки шаблона и ее использование в СтрШаблон() может быть в разных местах. Из-за этого не всегда удастся отследить связь.
В АПК предлагают радикальное рещение — не использовать никогда функцию , а всегда использовать метод БСП. Ссылки на стандарт нет
qtLex commented Sep 13, 2019
Думаю, начну с мест где взаимосвязь очевидна. А там разовью мысль.
Можно за мной задачу закрепить?
nixel2007 commented Sep 13, 2019
не использовать никогда функцию , а всегда использовать метод БСП
Не, ну это перебор имхо О_о
nixel2007 commented Sep 13, 2019
@qtLex давай действительно начнем с НСтр вложенного в СтрШаблон. посмотрим на срабатывания
zeegin commented Sep 13, 2019
не использовать никогда функцию , а всегда использовать метод БСП
@nixel2007
Суть проблемы:
NStr в мультиязычной конфигурации имеет разные фрагменты для разных языков.
Если запустить сеанс под кодом языка, которого нет в строке передаваемой в NStr то она вернет пустую строку.
Обычно конфигурации переводят не сразу, а поэтапно. Потому получается, что могут возникнуть случаи, когда NStr возвращает пустую строку. При этом в общем случае это к проблемам не приводит — просто будет дерьмовый интерфейс без текста.
Но если в StrTemplate передать первым параметром пустую строку, то будет исключение. Потому в не полностью переведенных конфигурациях критично чтобы хотябы те NStr которые используются первым параметров в StrTemplate всегда имели перевод для каждого объявленного в конфигурации языка.
Такая проблема в общем то не только для StrTemplate свойственна, но еще и тут https://its.1c.ru/db/v8std/content/763/hdoc
Правильно правило проверки будет выглядеть так:
- Для каждой NStr должен быть задан перевод для каждого кода языка в информационной базе. ERROR MINOR
- Для NStr используемой в StrTemplate всегда должен быть задан перевод для каждого языка ИБ. ERROR MAJOR.
Особенность метода БСП в том, что оно не бросает исключения и просто не выводит строку, если шаблон ей передать пустой. Потому при использовании метода БСП это MINOR.
Источник
Заметки из Зазеркалья
Реализовано в версии 8.3.6.1977.
Мы расширили набор функций, предназначенных для работы со строками. Мы это сделали для того, чтобы дать вам более развитые инструменты для разбора строковых данных. Новые функции будут удобны и полезны в технологических задачах анализа текста. В задачах, связанных с разбором текста, который содержит данные в форматированном виде. Это может быть анализ каких-то файлов, полученных от оборудования, или, например, анализ технологического журнала.
Все действия, которые выполняют новые функции, вы могли выполнять и раньше. С помощью более или менее сложных алгоритмов, написанных на встроенном языке. Поэтому новые функции не дают вам каких-то принципиально новых возможностей. Однако они позволяют сократить количество кода, сделать код более простым и понятным. А кроме этого они позволяют ускорить выполнение действий. Потому что функции, реализованные в платформе, работают, конечно же, быстрее, чем аналогичный алгоритм, написанный на встроенном языке.
Функция форматирования СтрШаблон()
Эта функция подставляет параметры в строку. Потребность в таком преобразовании часто возникает, например, при выводе предупреждающих сообщений. Синтаксис этой функции выглядит следующим образом:
— это строка, в которую нужно подставить представления параметров.
, . — это параметры (максимально — десять), представления которых нужно подставить в строку.
Чтобы указать конкретное место в шаблоне, в которое нужно выполнить подстановку, нужно использовать маркеры вида %1, . %10. Количество маркеров, задействованных в шаблоне, и количество параметров, содержащих значения, должны совпадать.
Например, результатом выполнения такого оператора:
Ошибка в данных в строке 2 (требуется тип Дата)
Функция работы со строками СтрСравнить()
Эта функция сравнивает две строки без учёта регистра. Например, так:
Это же действие вы могли выполнить и раньше с помощью объекта СравнениеЗначений:
Однако использование новой функции выглядит более простым. А кроме этого функция, в отличие от объекта СравнениеЗначений, работает и в тонком клиенте, и в веб-клиенте.
Функции работы со строками СтрНачинаетсяС(), СтрЗаканчиваетсяНа()
Эти функции определяют, начинается ли строка с указанной подстроки, заканчивается ли строка указанной подстрокой. Алгоритм этих функций несложно реализовать на встроенном языке, но их наличие позволяет писать более чистый и понимаемый код. И работают они быстрее.
Например, их удобно использовать в операторе Если:
Функции работы со строками СтрРазделить(), СтрСоединить()
Эти функции разделяют строку на части по указанному разделителю. Или наоборот, соединяют несколько строк в одну, вставляя между ними выбранный разделитель. Они удобны для создания или анализа логов, технологического журнала. Например, запись технологического журнала вы можете легко разобрать на части, пригодные для дальнейшего анализа:
Функция работы со строками СтрНайти()
Вместо старой функции Найти() мы реализовали новую функцию, которая имеет дополнительные возможности:
- Поиск в разных направлениях (с начала, с конца);
- Поиск с указанной позиции;
- Поиск вхождения с указанным номером (второе, третье и т.д.).
Фактически она дублирует возможности старой функции. Так сделано для того, чтобы сохранить совместимость с модулями, скомпилированными в старых версиях. Старую функцию Найти() рекомендуется больше не использовать.
Ниже приведён пример, использующий новые возможности поиска. Поиск в обратном направлении удобен тогда, когда вам нужен последний фрагмент формализованной строки, например, полное имя файла в URL. А поиск с указанной позиции помогает в тех случаях, когда нужно искать в известном фрагменте, а не во всей строке.
Источник
Функция СтрШаблон с именованными маркерами
Функция позволяет задавать именованные маркеры формата [Имя], в отличии от типовых нумерованных формата %n
А чем она лучше БСПшной СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку?
(2) Читабельнее и не нужно создавать структуру.
Для сравнения:
(3) Насчет читабельности я бы поспорил.
А если мне надо 16 параметров?
Сложный вопрос. У меня нет на него ответа.
Для справки — платформенный СтрШаблон допускает не больше 10ти параметров.
А в индустрии разработки программирования шагнули намного дальше: https://python-scripts.com/string-formatting
Померил скорость велосипеда из (8). Работает в три раза быстрее и писанины в два раза меньше.
А если СуммаДолга лежит в Выборке то нужно будет сделать так?
СуммаДолга = Выборка.Сумма;
Имя = «Петр Петрович»;
ВВ = Вычислить(F(«Приветонище, <Имя>. Ваш долг <СуммаДолга>руб.»));
(16) F или не F какая разница. Назовите как хотите.
А если СуммаДолга лежит в Выборке то нужно будет сделать так?
Ну так и писать
ВВ = Вычислить(F(«Приветонище, <Имя>. Ваш долг <Выборка.Сумма>руб.»));
(19) ну тогда удачи вам с такой замечательной функцией F
Хотя вашу идею я запомню на всякий пожарный. Мысля у народа работает)
Мне кажется, что прерывать цикл при первой встрече пустого имени параметра неудачная идея. Это усложнит применение функции для различных шаблонов строк, зависящих от некоторого условия, но при этом с примерно одинаковым набором параметров. Во встроенной функции «СтрШаблон» это как раз порой и раздражает — строгое соответствие списка маркеров списку параметров функции.
Аналогично с удалением неиспользованных параметров. Разве не удобнее становится, когда забытый маркер бросается в глаза при выводе готовой строки?
(9) Приведите пример кода когда прерывание при встрече пустого параметра будет неудобно.
Не могу. 🙂 Пока получше думал над примерами, пришел к выводу, что во всех случаях для Вашей функции любая универсальность будет врагом читаемости.
Да, конечно. Я нахожу это неудобным, но это дело вкуса, безусловно.
Я ошибся и на счет встроенной СтрШаблон. Поспешил, извините. Она не требует строго соответствия параметров маркерам. Только чтобы маркеров было не меньше, чем параметров функции. Аналогично и у Вас: лишние имена маркеров приведут к исключительной ситуации. Пару раз сталкивался с подобной особенностью, когда хотел написать что-то вроде такого:
Эту реализация я в полной мере еще сам не оценил на практике и сделал так, чтобы у программиста не было потребности самому вычищать эти маркеры или составлять шаблон динамически, а также потому что в платформенной СтрШаблон сделано также. Есть несколько вариантов как сделать — пока остановился на этом.
Если ЗначениеЗаполнено(Выборка.Склад) Тогда
ТекстСообщения = НСтр(«ru = ‘Не хватает товара %1 в количестве %2 на складе %3′»);
Иначе
ТекстСообщения = НСтр(«ru = ‘Не хватает товара %1 в количестве %2′»);
КонецЕсли;
ТекстСообщения = СтрШаблон(ТекстСообщения,
Выборка.Номенклатура,
Выборка.Количество,
Выборка.Склад);
Показать
Источник