1с сравнить с типом строка

Обновлено: 07.07.2024

В текущей разработке есть несколько модулей (обработок), в работе которых выполняется много анализа строк на равенство. Код оптимизирован в достаточной степени, но выполнений сравнения все равно достаточно много.

Среди строковых функций Стр* - тоже есть функция сравнения:

Глобальный контекст (Global context)

В ней присутствует некоторое количество копипаста, прошу особо не придираться по этому поводу;)

Тестировать производительность будем штатным замером производительности. Анализ расхода памяти не проверял.

Эксперименты провожу на 1С:Предприятие 8.3 (8.3.16.1063), 64-бит, УФ.

И вот результаты тестирования

Сначала посмотрим на вызовы процедур сравнения по способу передачи параметров сравнения - по ссылке и по значению.

Вызовы с передачей параметров по значению:

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
122 СтрСравнитьНеравныеПоЗначению(Строка1, Строка2); 100 000 0,47021 3,34
57 СравнитьНеравныеПоЗначению(Строка1, Строка2); 100 000 0,465204 3,31
90 СтрСравнитьРавныеПоЗначению(Строка1, Строка1Копия); 100 000 0,449524 3,2
25 СравнитьРавныеПоЗначению(Строка1, Строка1Копия); 100 000 0,435197 3,09
Итого 1,820135 12,94

Вызовы с передачей параметров по ссылке:

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
138 СтрСравнитьРавныеПоСсылке(Строка1, Строка1Копия); 100 000 0,464388 3,3
41 СравнитьНеравныеПоСсылке(Строка1, Строка2); 100 000 0,457277 3,25
106 СтрСравнитьНеравныеПоСсылке(Строка1, Строка2); 100 000 0,451031 3,21
73 СравнитьРавныеПоСсылке(Строка1, Строка1Копия); 100 000 0,428993 3,05
Итого 1,801689 12,81

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

А что же насчет сравнения строк?

Статистика сравнений с помощью "=":

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
150 Результат = Строка1=Строка2; 100 000 0,147104 1,05
146 Результат = Строка1=Строка2; 100 000 0,140452 1
158 Результат = Строка1=Строка2; 100 000 0,131109 0,93
154 Результат = Строка1=Строка2; 100 000 &0,125878 0,9
Итого 0,544543 3,88

Статистика сравнений с помощью СтрСравнить():

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
163 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,192031 1,37
167 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,186851 1,33
175 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,185261 1,32
171 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,170094 1,21
Итого 0,734237 5,23

Если для анализа способа передачи параметров - не все так очевидно, то для анализа сравнения строк - сомнений нет. Выигрышнее пользоваться обычным сравнением с помощью оператора "=". СтрСравнить затратнее по времени на 35% (=(0,734237-0,544543) / 0,544543 *100).

Если дочитать до конца справку по СтрСравнить(), то видим: "См. также: СравнениеЗначений, метод Сравнить". Вероятно, СтрСравнить() внутри использует объект СравнениеЗначений. И это создает дополнительные накладные расходы.

Выводы

Передача параметров примитивных типов по значению имеет свои дополнительные затраты. Но такой оверхед доп.времени незначителен.

Для анализа строк на равенство не стоит. гм. выделываться и использовать СтрСравнить().

Часть 2. Но есть нюанс!

Вывод по анализу сравнения строк, сделанный выше, не совсем корректен. Я замылился на особенностях своей прикладной задачи и упустил важный нюанс.

Если перечитать встроенную справку СтрСравнить(), то видим: "Выполняет сравнение строк без учета регистра". Т.е., сравнивать напрямую "=" и СтрСравнить - не совсем корректно, т.к. сами результаты выполнения оператора и функции могут быть различными.

Приводить поведение СтрСравнить к поведению оператора "=" не имеет смысла, т.к. СтрСравнить() и так изначально проигрывает по производительности. Но вот привести поведение "=" к СтрСравнить - мы вполне можем попробовать.

С большой вероятностью можно предположить, что "=" + два ВРег'а будут затратнее по производительности. Но "все, что можно проверить - нужно проверить".

Результаты выполнения "Результат = ВРег(Строка1)=ВРег(Строка2)":

Номер строки Строка Кол. Врем. (чистое)
126 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,234419
114 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,242221
122 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,251323
118 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,25332
Итого 0,981283

ВРег(Строка1)=ВРег(Строка2) затратнее по времени выполнения, чем СтрСравнить() примерно на 30% - замеры немного плавают по времени.

Уточненные выводы

Если требуется сравнить строки с учетом регистра, то пользуемся "=".

Если требуется сравнить строки без учета регистра, то пользуемся СтрСравнить().

Строки сравниваются посимвольно по коду символа, для ясности несколько примеров "Строка12" < "Строка2", "8.3.9.2000" > "8.3.8", "8.3.9.2000" > "8.3.10"

С учетом регистра можно сравнить строки через знаки сравнения как в примерах

Сравнение без учета регистра можно произвести функций СтрСравнить. Поддерживается с платформы 8.3.6.

  • -1 - первая строка меньше второй
  • 1 - первая строка больше второй.
  • 0 - первая строка равна второй

Преобразование в строку (Строка, Формат)

В языке 1С есть автоматическое преобразование типа когда все части выражения приводятся к типу первого выражения

Преобразование функцией Строка

при преобразовании появляется символ неразрывный пробел, а он обычно не нужен

"Правильнее" будет преобразовывать функцией формат, которая приводит к строке простые типы и можно воспользоватся конструктором


Строка на разных языках НСтр

Форматирование строки по шаблону СтрШаблон. Поддерживается с платформы 8.3.6.

Очень полезная функция которая позволяет избежать соединения строк и сделать текст более читабельным

Функции СтрСоединить, СтрРазделить. Поддерживается с платформы 8.3.6.

Очень полезные функции улучшают читаемость кода.

СтрРазделить удобна когда необходимо разобрать строку с разделителями, например CSV файл, разбор текста на слова, строки

Аналогично, только наоборот работает функция СтрСоединить, преобразуя массив к строке.

Другие функции работы со строками, которые могут быть полезны

СтрСократить (Текст, Количество, Многострочная = Ложь) - сокращает текст до заданной длины заменяя окончание на .

ЭтоКорректныйИдентификатор (Строка) - Проверяет является ли строка корректным идентификатором, строка вида СуммаКонтрагента, _Идентификатор

Когда в 1с встает вопрос разбора большого текста это уже зоопарк из СтрДлина, Сред, СтрНайти для повышения читаемости программ для подобных задач использую свои функции: РазборПрочитатьЦелоеЧисло, РазборПрочитатьШестнадцатеричноеЧисло, РазборПрочитатьНезначимые, РазборПрочитатьИдентификатор,

РазборПропуститьНаборСимволов, РазборПрочитатьСимвол, РазборПрочитатьДоСимвола, РазборНайтиТекст

работа со строками в 1С

Функции работы со строками в 1С

Рассмотрим основные функции встроенного языка программирования 1С.

Строка

Функция Строка() позволяет получить текстовое представление переменных других типов.

СтрДлина

Функция позволяет получить количество символов в строке 1C, включая пробелы и незначащие символы.

СокрЛП, СокрЛ, СокрП

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Помимо пробелов, функция 1C удаляет такие символы, как перенос строки, неразрывный пробел и т.д.

Лев, Прав, Сред

С помощью данных функций очень просто получить первые (Лев) или последние (Прав) символы в строке, а также произвольное количество символов (Сред).

Найти

ВРег, НРег, ТРег

ПустаяСтрока

Функция, позволяющая сравнить исходную строку с пустой строкой. Проверяется наличие незначащих символов.

Аналогично можно проверить строку на пустое значение следующим образом:

СтрЗаменить

Функция СтрЗаменить позволяет массово заменить искомое значение на нужное нам. Синтаксис:

СтрЧислоСтрок

Позволяет получить количество строк в многострочном тексте. Функция считает количество переносов строк (Символы.ПС).

Например, построчная обработка текстового фрагмента:

СтрПолучитьСтроку

СтрЧислоВхождений

Функция для подсчета числа вхождений произвольного фрагмента в строку. Например, подсчитать количество вхождений определенных символов или слов в текст.

Символ и КодСимвола

Две обратные функции. С помощью КодСимвола можно получить код символа в кодировке Unicode. Функцией Символ можно получить символ, зная Unicode кодификатор.

Часто встречающиеся задачи по работе со строками в 1С

Рассмотрим классические примеры решения задач в работе с текстовыми переменными.

Конкатенация строк в 1С

Преобразовать число в строку

Однако может смущать наличие неразрывного пробела.

Его можно убрать с помощью замены неразрывного пробела на пустую строку:

или с помощью метода Формат:

Кавычки в строке 1С

Для новичков достаточно трудно установить кавычки внутри строки, хотя в этом нет ничего сложного. Достаточно внутри строки поставить вместо одних кавычек двое.

Символ переноса строки

Сравнение строк в 1С

Однако для получения корректного сравнения часто требуется возвести строки в один регистр и убрать незначащие символы:

Таким образом, мы получим более точное сравнение двух строк.

Убрать пробелы в строке 1С

Достаточно часто нужно убрать пробелы в строке 1С.

Если требуется убрать пробелы справа и слева:

Если требуется убрать абсолютно все пробелы, можно заменить их на пустую строку:

Если требуется убрать неразрывные пробелы из строки, которая получена из числового типа, сделать это можно так:

Другие статьи по 1С:

Разберем методы, при помощи которых, в 1С 8.3 можно определить тип значения переменной (или реквизита какого-нибудь объекта). Причем, эти методы могут работать со всеми типами: примитивными, объектными и коллекциями значений.

Для работы с типами, в платформе 1С имеется специальный тип, который так и называется Тип. Этот тип необходим для идентификации типов значений различных данных. Значения типа Тип возвращают только две функции Тип и ТипЗнч.

Функция ТипЗнч в 1С

Разберем функцию ТипЗнч. Эта функция принимает в качестве параметра любое значение и возвращает тип этого значения.

Рассмотрим пример: будем использовать в качестве параметра этой функции число, таблицу значений и объект какого-нибудь справочника.

Посмотрим в отладке, что вернет этот метод.

Функция ТипЗнч в 1С

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

Функция Тип в 1С

Функция тип имеет один параметр имя получаемого типа в строковом представлении, возвращает тип Тип.

Переделаем предыдущий пример: будем получать типы значений, используя функцию Тип.

В переменных будут те же значения, что и в прошлый раз.

Функция Тип в 1С

Чтобы быстро получить название какого-то типа, достаточно «задержаться» в написании после первой кавычки, или нажать комбинацию клавиш Ctrl+Пробел.

Функция Тип в 1С

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

Функция Тип в 1С

Обе функции Тип и ТипЗНЧ возвращают значения одного типа – Тип. Но, если в случае функции ТипЗнч мы не можем точно знать, что вернет эта функция (поскольку, иногда, возникают ситуации, когда точно не известно какого тип та или иная переменная), то при работе с функцией Тип, мы точно знаем, какое значение вернет эта функция, поскольку сами указали строковое представление типа в параметре.

Как проверить тип значения

Для того, чтобы проверить какой тип значения у той или иной переменой, достаточно использовать обе этих функции (Тип и ТипЗнч) вместе: сравнивая, что возвращает функция ТипЗнч, в параметре которой указано какое-либо значение, с функцией Тип, в параметре которой мы указали конкретный тип.

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

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

Проверить тип значения в 1С

Статьи о примитивных типах в 1С:

Программировать в 1С за 11 шагов

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

В этой статье я продолжу изучать функции строк. Если функции из предыдущей статьи были и в старых версиях 1С (1С 8.1, 1С 8.2), то в этой статье разберем функции, которые появились уже в платформе 8.3.

Сравнение строк в 1С

Начиная с режима совместимости 8.3.6, появилась возможность сравнивать строки по длине. Это выполняет метод СтрСравнить(<ПерваяСтрока>,<ВтораяСтрока>). В качестве параметров этого метода указываются сравниваемые строки. А возвращает этот метод следующие значения

0 – строки равные

1 – первая строка больше второй

-1 – первая строка меньше второй

Обе строки приравниваются к одинаковому регистру. Причем можно сравнивать, как сами строки, так и переменные с типом строка.

То есть вот так:

Результат сравнения этих строк будет следующий:

Сравнение строк в 1С

Причем не имеет значение, имеются в строке пробелы или нет.

Сравнение строк в 1С c пробелами

В этом случае метод вернул -1, хоть и Строка2 отличается от Строка1 только пробелами.

Функции СтрНачинаетсяС и СтрЗаканчиваетсяНа в 1С

При помощи этих двух похожих функций можно определить начинается ли строка с какой-то подстроки, либо заканчивается ли строка какой-то подстрокой. Причем проверки выполняются с учетом регистра. Обе функции работают, начиная с режима совместимости 8.3.6.

Например, у нас имеется строка «Привет, Владимир Петрович, как дела?». Мы можем определить, начинается эта строка на слове «Привет», и заканчивается ли она словами «как дела?».

И посмотрим, какой результат будет у этих функций

Функции СтрНачинаетсяС СтрЗаканчиватесяНа

Обе функции возвращают истину, если строка начинается указанной подстрокой или заканчивается. Причем регистр подстроки важен!

Функции СтрНачинаетсяС СтрЗаканчиватесяНа

Разделить и соединить строку в 1С

Начиная с режима совместимости 8.3.6, в платформе 1С появилась возможность разъединять и соединять строки. Делается это при помощи функции СтрРазделить и СтрСоединить.

Функция СтрРазделить разделяет строки по определенному разделителю и возвращает массив со строками, которые получились в результате разделения.

Функция СтрСоединить принимает массив строки и соединят их в одную.

Разберем подробнее и с примерами.

Функция СтрРазделить имеете следующий синтаксис СтрРазделить(<Строка>,<Разделитель>, <ВключатьПустые>).

Строка – разделяемая строка

Разделитель – символ или символы, по которым строка будет разделена

В этом примере два массива, посмотрим в отладке на первый

Разделить строку в 1С с пустыми символами

А также на второй:

Разделить строку в 1С без пустых символов

Точно также, как разложили строку, мы можем соединить её из строк в массиве, используя метод СтрСоединить. Этот метод является функцией, которая возвращает соединенную строку и имеет следующий синтаксис.

МассивСтрок – массив или фиксированный массив строк, которые нужно будет соединить.

Разделитель – символ или строка, которая будет вставлена между соединяемыми строками. Необязательный параметр. Если его не будет, то строки будут соединены слитно.

Доработаем предыдущий пример: объединим строки в массиве без пустого символа, поставив наклонную черту в качестве разделителя.

Получится следующий результат:

Объединить строку в 1С

Другие статьи о примитивных типах:

Программировать в 1С за 11 шагов

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Читайте также: