Стршаблон 1с не работает
Избавимся от прослойки вызовов и лишних методов с помощью метода СтрШаблон():
Конфигурация не всегда сразу полностью переводится на другой язык. И, если в системе будет работать пользователь, у которого будет установлен язык не RU, то первый код отработает корректно, а второй выдаст ошибку исполнения.
Во втором случае локализованной строки нет, следовательно, параметров в строке нет, следовательно, возникает ошибка исполнения.
В связи с этим, в модулях конфигураций принято решение не использовать СтрШаблон() до исправления ошибки платформы.
Предлагаемая критичность:
ERROR
MAJOR
1 min
The text was updated successfully, but these errors were encountered:
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 всегда имели перевод для каждого объявленного в конфигурации языка.
Правильно правило проверки будет выглядеть так:
- Для каждой NStr должен быть задан перевод для каждого кода языка в информационной базе. ERROR MINOR
- Для NStr используемой в StrTemplate всегда должен быть задан перевод для каждого языка ИБ. ERROR MAJOR.
Особенность метода БСП в том, что оно не бросает исключения и просто не выводит строку, если шаблон ей передать пустой. Потому при использовании метода БСП это MINOR.
что ему не нравится?
(5) Режим совместимости = да
(6) ОФ - толстый клиент
вообще
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.
(7) Выделение ctrl+f1 слызу вываливаемся в справку - куда надо(с проверял на латиницу, это первое что сделал)
(9) Версия 8.2.16
(3) И что?
Мне не надо проверять, есть вхождение или нет, мне нужен номер вхождения, если он есть то идем дальше, если нет, то нет
Может так сработает?
СтрНайти (StrFind)
Синтаксис:
Тип: Строка.
Указывает направление поиска подстроки в строке.
Указывает позицию в строке, с которой начинается поиск.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СНачала, то значение по умолчанию равно 1.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СКонца, то значение по умолчанию равно длине строки.
Допускаются значения от 1 до количества символов в строке, в которой выполняется поиск. Если указано значение, не входящее в диапазон, генерируется ошибка "Неверное значение параметра".
Тип: Число.
Указывает номер вхождения искомой подстроки в исходной строке.
Значение по умолчанию: 1.
Возвращаемое значение:
Тип: Число.
Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
Описание:
Находит первое вхождение искомой строки как подстроки в исходной строке.
Сравнение выполняется с учетом регистра.
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.
Примечание:
Если параметр пустая строка, то возвращает 1.
Если оба параметра пустые строки, то возвращает 1.
Пример:
Мы расширили набор функций, предназначенных для работы со строками. Мы это сделали для того, чтобы дать вам более развитые инструменты для разбора строковых данных. Новые функции будут удобны и полезны в технологических задачах анализа текста. В задачах, связанных с разбором текста, который содержит данные в форматированном виде. Это может быть анализ каких-то файлов, полученных от оборудования, или, например, анализ технологического журнала.
Все действия, которые выполняют новые функции, вы могли выполнять и раньше. С помощью более или менее сложных алгоритмов, написанных на встроенном языке. Поэтому новые функции не дают вам каких-то принципиально новых возможностей. Однако они позволяют сократить количество кода, сделать код более простым и понятным. А кроме этого они позволяют ускорить выполнение действий. Потому что функции, реализованные в платформе, работают, конечно же, быстрее, чем аналогичный алгоритм, написанный на встроенном языке.
Функция форматирования СтрШаблон()
- это строка, в которую нужно подставить представления параметров.
, . - это параметры (максимально - десять), представления которых нужно подставить в строку.
Чтобы указать конкретное место в шаблоне, в которое нужно выполнить подстановку, нужно использовать маркеры вида %1, . %10. Количество маркеров, задействованных в шаблоне, и количество параметров, содержащих значения, должны совпадать.
Например, результатом выполнения такого оператора:
Ошибка в данных в строке 2 (требуется тип Дата)
Функция работы со строками СтрСравнить()
Эта функция сравнивает две строки без учёта регистра. Например, так:
Это же действие вы могли выполнить и раньше с помощью объекта СравнениеЗначений:
Однако использование новой функции выглядит более простым. А кроме этого функция, в отличие от объекта СравнениеЗначений, работает и в тонком клиенте, и в веб-клиенте.
Функции работы со строками СтрНачинаетсяС(), СтрЗаканчиваетсяНа()
Эти функции определяют, начинается ли строка с указанной подстроки, заканчивается ли строка указанной подстрокой. Алгоритм этих функций несложно реализовать на встроенном языке, но их наличие позволяет писать более чистый и понимаемый код. И работают они быстрее.
Например, их удобно использовать в операторе Если:
Функции работы со строками СтрРазделить(), СтрСоединить()
Эти функции разделяют строку на части по указанному разделителю. Или наоборот, соединяют несколько строк в одну, вставляя между ними выбранный разделитель. Они удобны для создания или анализа логов, технологического журнала. Например, запись технологического журнала вы можете легко разобрать на части, пригодные для дальнейшего анализа:
Функция работы со строками СтрНайти()
Вместо старой функции Найти() мы реализовали новую функцию, которая имеет дополнительные возможности:
- Поиск в разных направлениях (с начала, с конца);
- Поиск с указанной позиции;
- Поиск вхождения с указанным номером (второе, третье и т.д.).
Фактически она дублирует возможности старой функции. Так сделано для того, чтобы сохранить совместимость с модулями, скомпилированными в старых версиях. Старую функцию Найти() рекомендуется больше не использовать.
Ниже приведён пример, использующий новые возможности поиска. Поиск в обратном направлении удобен тогда, когда вам нужен последний фрагмент формализованной строки, например, полное имя файла в URL. А поиск с указанной позиции помогает в тех случаях, когда нужно искать в известном фрагменте, а не во всей строке.
В релизе платформы 8.3.6.1977 были добавлены новые функции, но не стоит спешить их использовать, пока все не перейдут на новые платформы без режима совместимости с 8.3.5.
Новые функции удобны - бесспорно, но не у всех они будут работать. Ниже приведен список функций с возникающими ошибками и вариантами использования старых методов работы, которые будут действовать на всех платформах.
Использовать или нет новые функции, решать Вам, а мое субъективное мнение - пока не стоит.
Рассматриваемые функции: СтрНайти(), СтрШаблон(), СтрСравнить(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа(), СтрРазделить(),СтрСоединить()
Реализовано в версии 8.3.6.1977.
Функции на самом деле удобны и помогают разработчикам в решении повседневных задач, но их нельзя использовать в режиме совместимости. Поэтому придется еще немного подождать, когда уже все потихоньку перейдут на последнии версии платформы, и можно будет не задумываясь использовать нововведения и радоваться жизни.
Когда пишете на "своих" конфигурациях, тогда можно делать что душе угодно, но когда разработка идет в "чужую" конфигурацию - стоит задуматься каким путем пойти:
- Использовать новые функции и обязать заказчика перейти на свежую платформу
- Сделать проверку текущей версии платформы и использовать новые функции и старые механизмы работы
- Использовать только старые механизмы работы
По первому пункту - как повезет, не всегда заказчик будет гореть желанием перейти на новую платформу по своим причинам и отговоркам коих найдется не один десяток.
По второму - идеальный вариант, но не каждый разработчик будет перед каждым вызовом новой функции строить городульки чтобы узнать версию платформы. Хотя данный вариант имеет право на жизнь.
И по третьему - самый оптимальный (мое субъективное мнение) гораздо проще второго варианта, но уступает первому в том что не помогает продвижению новых платформ в массы
Функция работы со строками СтрНайти(, , , , )
Функция выполняет поиск подстроки в различных направлениях и не только с начала строки.
В режиме совместимости 8.3.5 и ниже возникает ошибка
: Процедура или функция с указанным именем не определена (СтрНайти)
Сообщить(>СтрНайти("1","2212"));
Остается довольствоваться тем, что имеем
меньше возможностей, но не вылетает с ошибкой
Функция Найти() осталась только для совместимости с 8.3.5 и в дальнейшем ожидаем, что ее не станет.
Функция работы со строками СтрШаблон(, )
Функция выполняет замену маркеров подстановки (вида %1) в шаблонной строке на реальные значения.
В режиме совместимости возникает ошибка
: Процедура или функция с указанным именем не определена (СтрШаблон)
Сообщить(>СтрШаблон("Ошибка в строке "" %1 ""","МояСтрока"));
Функция работы со строками СтрСравнить(, )
Функция выполняет лексикографическое сравнение строк без учета регистра.
Возникающая ошибка
: Процедура или функция с указанным именем не определена (СтрСравнить)
Сообщить(>СтрСравнить("Первая строка", "Вторая строка"));
Но можно сделать по-другому
Функция работы со строками СтрНачинаетсяС(,)
Функция проверяет, что строка начинается на подстроку.
Возникает ошибка
: Процедура или функция с указанным именем не определена (СтрНачинаетсяС)
Сообщить(>СтрНачинаетсяС("http://google.com", "http://"));
Но можно сделать по-старому
Функция работы со строками СтрЗаканчиваетсяНа(, )
Функция проверяет, что строка оканчивается подстрокой.
Возникает ошибка
: Процедура или функция с указанным именем не определена (СтрНачинаетсяС)
Сообщить(>СтрНачинаетсяС("http://google.com", "http://"));
Но можно сделать по-другому
Функция работы со строками СтрРазделить(,,)
Функция работы со строками СтрСоединить(, )
Функция СтрРазделить() разделяет строку на части по указанному разделителю.
Функция СтрСоединить() соединяет строки из массива подстрок.
Удобные функции, но возникает ошибка
: Процедура или функция с указанным именем не определена (СтрРазделить)
Массив = >СтрРазделить("1,2,3,4,5,6,7,8,9,,10",",",Ложь);//вернет массив
: Процедура или функция с указанным именем не определена (СтрСоединить)
Строка = >СтрСоединить(Массив,",")//вернет 1,2,3,4,5,6,7,8,9,10
Если вы уверены, что разработка будет использоваться на платформе выше 8.3.6.1977, то можете смело использовать все нововведения, иначе придется работать по старинке.
Специальные предложения
В статье не упомянуто, что для многих из функций есть прямые аналоги в БСП и сейчас любой адекватный человек использует именно их из модуля СтроковыеФункцииКлиентСервер, предполагаю, что все функции останутся для совместимости ещё какое-то время, просто вероятно они внутри себя со временем станут использовать новые платформенные функции, но интерфейс вызова останется старый.
На текущий момент весь модуль СтроковыеФункцииКлиентСервер в БСП 2.3 оставлен без изменений для совместимости.
slige; Gendelf; kar911; volokitinac; sstas007; paran; Happy User; marku; Lyolik; farraf; inanity; Anchoret; Mr Roudyk; Rusel; Aleskey_K; CyberCerber; ivashchenko_tatyanka; denis_aka_wolf; Bazil; + 19 – Ответить
(2) Xershi, Только не всегда в организациях следят за обновлением платформы.
Когда пишешь для "чужих" тогда нужно либо обязать их перейти на новую платформу, либо использовать старые механизмы работы.
(3) AlexanderKai,
Когда пишете на "своих" конфигурациях, тогда можно делать что душе угодно, но когда разработка идет в "чужую" конфигурацию - стоит задуматься каким путем пойти:
1) Использовать новые функции и обязать заказчика перейти на свежую платформу
2) Сделать проверку текущей версии платформы и использовать новые функции и старые механизмы работы
3) Использовать только старые механизмы работы
По первому пункту - как повезет, не всегда заказчик будет гореть желанием перейти на новую платформу по своим причинам и отговоркам коих найдется не один десяток.
По второму - идеальный вариант, но не каждый разработчик будет перед каждым вызовом новой функции строить городульки чтобы узнать версию платформы. Хотя данный вариант имеет право на жизнь.
И по третьему - самый оптимальный (мое субъективное мнение) гораздо проще второго варианта, но уступает первому в том что не помогает продвижению новых платформ в массы
Нам со стороны разрабатывали подсистему приема бюджетных обязательств по отыгранным тендерам и запросам котировок цен для БГУ 1.0 и нарукожопили с использованием новых функций.
(3) AlexanderKai, этот вариант не работает. Ругается на то что данной функции вообще нет.(7)
denis_aka_wolf, статью поправь, второй вариант не рабочий.
(10) mitya-paramonov,
Если добавишь строчку
СистемнаяИнформация = Новый СистемнаяИнформация;
то заработает.
Такой код все равно работать не будет!
(7) все очень просто - создаете глобальную функцию с такими же названиями и используете ее, если у человека новая платформа - то ему достаточно заккоментить эту функцию. Как бы проблем нет.
Системное перечисление НаправлениеПоиска в режиме совместимости отсутствует.
(36) Erne100, А может быть встречал кто функцию с такими же возможностями, как эта новая СтрНайти() ? Ведь порой надо искать именно с конца, и удобно было бы использовать в режимах совместимости аналогичную функцию, хотя бы с первыми тремя параметрами. Народ бы сказал за такую функцию Спасибо!
Я правильно понял смысл публикации - рассказать всему миру, что функции, появившиеся в новом релизе, не будут работать в старом релизе, потому что есть только в новом релизе?
Познавательная статья - теперь я знаю, что Капитана Очевидность зовут Денис.
aiPavlov; xMaksX86; 7OH; Gendelf; va582; TeMochkiN; Serega-artem; SvoyakMartin; Anchoret; h00k; HystriX; cypherpunks01; philya; sergio199; Rusel; DennyPhilord; JestN; BurningChrome; JIeHIH; sigmov; charushkin; herfis; Frogger1971; _also; SerSh_Perm; sh_max; starik-2005; delete; Bassgood; Natalii; gr0m; sergelemon; CyberCerber; madonov; dgolovanov; gubanoff; Black Romeo; Dach; slazzy; Gravemaggot; Bazil; webester; NeviD; nihfalck; EliasShy; zqzq; LuxVeritatis; karpik666; TMV; ojiojiowka; + 50 – Ответить
Используя метод СтрШаблон в 1С легко ошибиться, и последствия данных ошибок могут быть как незначительными, так и критическими.
Команда SilverBulleters
Функция СтрШаблон крайне полезная функция, которая появилась в платформе 1С: Предприятие начиная с версии 8.3.6. Она позволяет удобно сформировать строку подставляя переменное количество параметров.
В данном примере результирующей строкой будет Ошибка в данных в строке 2 (требуется тип Дата) .
Однако, при использовании данной функции легко ошибиться, и последствия данных ошибок могут быть как незначительными, так и критическими.
Одной из самых распространенных ошибок является некорректное использование функции НСтр внутри СтрШаблон :
В примере выше, разработчик "промахнулся" при указании параметров метода. Вместо того чтобы указать параметр ИмяПартнера как параметр СтрШаблон , он указал его как параметр НСтр . В результате данный вызов отработает и вернет пустую строку, что не то, что ожидает увидеть пользователь при выяснении причины ошибки. Однако данная ошибка является информационной, так как не нарушает работу программы.
Куда хуже, когда разработчик некорректно описывает сам шаблон, как например:
Что же тут произошло? Разработчик неправильно указал параметр шаблона, указав просто знак процента, тогда как корректно было бы %1 . В результате исполнения данного кода возникнет исключение времени выполнения Ошибка синтаксиса шаблона , что уже является блокирующей ошибкой, которая помешает полноценной работе пользователя.
Здесь разработчик либо забыл добавить необходимый параметр в шаблон, либо забыл убрать само значение параметра. В результате 1С отреагирует исключением времени выполнения "Слишком много фактических параметров", что также заблокирует нормальную работу пользователя.
Как этого можно было избежать:
- внимательно читать документацию к методу СтрШаблон , в которой подробно описаны ситуации при которых 1С будет генерировать исключения;
- тщательно тестировать свои доработки/исправления. Даже если у вас нет автотестов или QA, разработчик не должен лениться самостоятельно запустить и проверить свою доработку;
- использование статических анализаторов/линтеров, которые могут в автоматическом режиме проверить корректность шаблона и предупредить разработчика о возможных последствиях.
Sign up for more like this.
Уязвимость в библиотеке Log4j в экосистеме Java
Как обезопасить себя от уязвимости CVE-2021-44228, исходящей из библиотеки log4j 2
Знакомство с КафкаКоннектор версии 1.0
Новый взгляд на организацию обмена данными 1С с использованием Apache Kafka
Читайте также: