1с стршаблон не работает

СтрНайти, что ему не нравится?

Во внешней обработке
код
НомерВхождения=0;
СтрНайти(СокрЛП(СтрокаТЗОтчетПроизводстваЗаСмену.Комментрарий),»#». НомерВхождения);
Если НомерВхождения > 0 Тогда
ОтчетКоммент = СокрЛП(Сред(СтрокаТЗОтчетПроизводстваЗаСмену.Комментрарий,НомерВхождения));
Если ОтчетКоммент = РеализацияКомментарий Тогда
СтрРеалицации.СформированОтчет = «Сформирован»;
КонецЕсли;
КонецЕсли;

Ошибка
<ВнешняяОбработка.ФормированиеОтчетовЗаСменуНаОснованииРеализации.Форма.Форма.Форма(7565,5)>: Процедура или функция с указанным именем не определена (СтрНайти)
>СтрНайти(СокрЛП(СтрокаТЗОтчетПроизводстваЗаСмену.Комментрарий),»#». НомерВхождения); (Проверка: Толстый клиент (обычное приложение))

что ему не нравится?

(5) Режим совместимости = да
(6) ОФ — толстый клиент
вообще
Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.

Может так сработает?

СтрНайти (StrFind)
Синтаксис:

Тип: Строка.
Указывает направление поиска подстроки в строке.
Указывает позицию в строке, с которой начинается поиск.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СНачала, то значение по умолчанию равно 1.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СКонца, то значение по умолчанию равно длине строки.
Допускаются значения от 1 до количества символов в строке, в которой выполняется поиск. Если указано значение, не входящее в диапазон, генерируется ошибка «Неверное значение параметра».
Тип: Число.
Указывает номер вхождения искомой подстроки в исходной строке.
Значение по умолчанию: 1.
Возвращаемое значение:

Тип: Число.
Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
Описание:

Находит первое вхождение искомой строки как подстроки в исходной строке.
Сравнение выполняется с учетом регистра.

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.
Примечание:

Если параметр пустая строка, то возвращает 1.
Если оба параметра пустые строки, то возвращает 1.
Пример:

Источник

Функция СтрШаблон()

Формирует строку по заданному шаблону

Синтаксис

Функция СтрШаблон() имеет следующий синтаксис:

А также альтернативный англоязычный синтаксис:

Параметры

Описание параметров функции СтрШаблон() :

Имя параметра Тип Описание
Шаблон Строка Содержит шаблон конечной строки. Шаблон может состоять из обычного текста и параметров, которые начинаются с подстановочного знака % (процента)
Значение1. Значение10 Строка Подстановочные значения. Максимальное количество параметров = 10
Жирным шрифтом выделены обязательные параметры

Возвращаемое значение

Строка
Строка шаблона с подставленными параметрами.

Описание

Функция СтрШаблон() формирует конечную строку, путем подстановки строковых представлений фактических параметров в указанные места шаблона. Шаблон может состоять из текста и параметров. Каждый параметр начинается с подстановочного знака %(процент), за которым следует порядковый номер параметра. Нумерация параметров начинается с 1. Если количество параметров в шаблоне не совпадает с количеством фактически переданных параметров, будет сгенерировано исключение: «Недостаточно фактических параметров» или «Очень много параметров» .

Чтобы указать в шаблоне символ процента, необходимо указать его дважды: %%. При этом, если за ним стоит цифра, то она уже не будет воспринята, как параметр.
Чтобы в шаблоне указать сразу после параметра цифру, следует номер параметра заключить в круглые скобки. Например: %(1)1 сорт

Читайте также:  Deviantart com не работает

Доступность

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

Пример использования

Пример кода с использованием функции СтрШаблон() :

Источник

Совместное использование НСтр() и СтрШаблон() #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 всегда имели перевод для каждого объявленного в конфигурации языка.

Читайте также:  Паджеро 4 не работает моторчик печки

Такая проблема в общем то не только для 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′»);
КонецЕсли;

ТекстСообщения = СтрШаблон(ТекстСообщения,
Выборка.Номенклатура,
Выборка.Количество,
Выборка.Склад);
Показать

Источник

Оцените статью