1с как сравнить две строки
Особенности сравнения строк при работе с базой данных
Вся функциональность 1С:Предприятия делится на ту, которая выполняется в памяти компьютера (клиентского или серверного) и на ту, которая выполняется средствами базы данных (средствами СУБД). К последней относятся прежде всего, конечно, запросы. Но, кроме запросов, многие методы глобального контекста и прикладных объектов выполняются средствами СУБД.
Хотя в 1С:Предприятии 8 системы типов встроенного языка и базы данных максимально унифицированы, тем не менее, существуют отличия в работе конкретных операций.
Одним из существенных отличий является сравнение строк. Во встроенном языке все сравнения строк выполняются с учетом регистра символов (case sensitive). А во всех операциях с базой данных сравнения строк выполняются без учета регистра символов (case insensitive).
Разумеется, для проверки без учета регистра во встроенном языке можно использовать приведение к верхнему или нижнему регистру.
Например:
"Ф" = "ф" - ложь
ВРег("Ф") = ВРег("ф") – истина.
При работе с запросом или другими операциями с базой данных нужно учитывать тот факт, что сравнение выполняется без учета регистра.
Например, это влияет на механизм нумерации. Коды и номера прикладных объектов (справочников, документов и т.д.) поддерживаются без учета регистра, так как их поддержка осуществляется средствами базы данных. Например, если попытаться установить у нового объекта код, который будет отличаться от кода существующего объекта только регистром символов, то будет сформировано исключение «Код не уникален!». Префиксы нумерации также действуют без учета регистра символов. Таким образом, в кодах и номерах лучше использовать только большие символы – это облегает понимание работы системы пользователем.
Если реализуется некоторый алгоритм, выполняемый в памяти, но который должен по своей логике совпадать с логикой работы в базе данных (например, выполнять поиск строки), то может иметь смысл при сравнении строк выполнять приведение к верхнему регистру, чтобы обеспечить сравнение без учета регистра.
Строки сравниваются посимвольно по коду символа, для ясности несколько примеров "Строка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с встает вопрос разбора большого текста это уже зоопарк из СтрДлина, Сред, СтрНайти для повышения читаемости программ для подобных задач использую свои функции: РазборПрочитатьЦелоеЧисло, РазборПрочитатьШестнадцатеричноеЧисло, РазборПрочитатьНезначимые, РазборПрочитатьИдентификатор,
РазборПропуститьНаборСимволов, РазборПрочитатьСимвол, РазборПрочитатьДоСимвола, РазборНайтиТекст
В текущей разработке есть несколько модулей (обработок), в работе которых выполняется много анализа строк на равенство. Код оптимизирован в достаточной степени, но выполнений сравнения все равно достаточно много.
Среди строковых функций Стр* - тоже есть функция сравнения:
Глобальный контекст (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% - замеры немного плавают по времени.
Уточненные выводы
Если требуется сравнить строки с учетом регистра, то пользуемся "=".
Если требуется сравнить строки без учета регистра, то пользуемся СтрСравнить().
Функции работы со строками в 1С
Рассмотрим основные функции встроенного языка программирования 1С.
Строка
Функция Строка() позволяет получить текстовое представление переменных других типов.
СтрДлина
Функция позволяет получить количество символов в строке 1C, включая пробелы и незначащие символы.
СокрЛП, СокрЛ, СокрП
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Помимо пробелов, функция 1C удаляет такие символы, как перенос строки, неразрывный пробел и т.д.
Лев, Прав, Сред
С помощью данных функций очень просто получить первые (Лев) или последние (Прав) символы в строке, а также произвольное количество символов (Сред).
Найти
ВРег, НРег, ТРег
ПустаяСтрока
Функция, позволяющая сравнить исходную строку с пустой строкой. Проверяется наличие незначащих символов.
Аналогично можно проверить строку на пустое значение следующим образом:
СтрЗаменить
Функция СтрЗаменить позволяет массово заменить искомое значение на нужное нам. Синтаксис:
СтрЧислоСтрок
Позволяет получить количество строк в многострочном тексте. Функция считает количество переносов строк (Символы.ПС).
Например, построчная обработка текстового фрагмента:
СтрПолучитьСтроку
СтрЧислоВхождений
Функция для подсчета числа вхождений произвольного фрагмента в строку. Например, подсчитать количество вхождений определенных символов или слов в текст.
Символ и КодСимвола
Две обратные функции. С помощью КодСимвола можно получить код символа в кодировке Unicode. Функцией Символ можно получить символ, зная Unicode кодификатор.
Часто встречающиеся задачи по работе со строками в 1С
Рассмотрим классические примеры решения задач в работе с текстовыми переменными.
Конкатенация строк в 1С
Преобразовать число в строку
Однако может смущать наличие неразрывного пробела.
Его можно убрать с помощью замены неразрывного пробела на пустую строку:
или с помощью метода Формат:
Кавычки в строке 1С
Для новичков достаточно трудно установить кавычки внутри строки, хотя в этом нет ничего сложного. Достаточно внутри строки поставить вместо одних кавычек двое.
Символ переноса строки
Сравнение строк в 1С
Однако для получения корректного сравнения часто требуется возвести строки в один регистр и убрать незначащие символы:
Таким образом, мы получим более точное сравнение двух строк.
Убрать пробелы в строке 1С
Достаточно часто нужно убрать пробелы в строке 1С.
Если требуется убрать пробелы справа и слева:
Если требуется убрать абсолютно все пробелы, можно заменить их на пустую строку:
Если требуется убрать неразрывные пробелы из строки, которая получена из числового типа, сделать это можно так:
Другие статьи по 1С:
В этой статье я продолжу изучать функции строк. Если функции из предыдущей статьи были и в старых версиях 1С (1С 8.1, 1С 8.2), то в этой статье разберем функции, которые появились уже в платформе 8.3.
Сравнение строк в 1С
Начиная с режима совместимости 8.3.6, появилась возможность сравнивать строки по длине. Это выполняет метод СтрСравнить(<ПерваяСтрока>,<ВтораяСтрока>). В качестве параметров этого метода указываются сравниваемые строки. А возвращает этот метод следующие значения
0 – строки равные
1 – первая строка больше второй
-1 – первая строка меньше второй
Обе строки приравниваются к одинаковому регистру. Причем можно сравнивать, как сами строки, так и переменные с типом строка.
То есть вот так:
Результат сравнения этих строк будет следующий:
Причем не имеет значение, имеются в строке пробелы или нет.
В этом случае метод вернул -1, хоть и Строка2 отличается от Строка1 только пробелами.
Функции СтрНачинаетсяС и СтрЗаканчиваетсяНа в 1С
При помощи этих двух похожих функций можно определить начинается ли строка с какой-то подстроки, либо заканчивается ли строка какой-то подстрокой. Причем проверки выполняются с учетом регистра. Обе функции работают, начиная с режима совместимости 8.3.6.
Например, у нас имеется строка «Привет, Владимир Петрович, как дела?». Мы можем определить, начинается эта строка на слове «Привет», и заканчивается ли она словами «как дела?».
И посмотрим, какой результат будет у этих функций
Обе функции возвращают истину, если строка начинается указанной подстрокой или заканчивается. Причем регистр подстроки важен!
Разделить и соединить строку в 1С
Начиная с режима совместимости 8.3.6, в платформе 1С появилась возможность разъединять и соединять строки. Делается это при помощи функции СтрРазделить и СтрСоединить.
Функция СтрРазделить разделяет строки по определенному разделителю и возвращает массив со строками, которые получились в результате разделения.
Функция СтрСоединить принимает массив строки и соединят их в одную.
Разберем подробнее и с примерами.
Функция СтрРазделить имеете следующий синтаксис СтрРазделить(<Строка>,<Разделитель>, <ВключатьПустые>).
Строка – разделяемая строка
Разделитель – символ или символы, по которым строка будет разделена
В этом примере два массива, посмотрим в отладке на первый
А также на второй:
Точно также, как разложили строку, мы можем соединить её из строк в массиве, используя метод СтрСоединить. Этот метод является функцией, которая возвращает соединенную строку и имеет следующий синтаксис.
МассивСтрок – массив или фиксированный массив строк, которые нужно будет соединить.
Разделитель – символ или строка, которая будет вставлена между соединяемыми строками. Необязательный параметр. Если его не будет, то строки будут соединены слитно.
Доработаем предыдущий пример: объединим строки в массиве без пустого символа, поставив наклонную черту в качестве разделителя.
Получится следующий результат:
Другие статьи о примитивных типах:
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Читайте также:
- Как удалить яндекс строку с планшета
- Некоторые файлы могут содержать вирусы или другое опасное содержимое excel как убрать
- 1с какое предназначение имеет выделение галочками элементов списка реквизиты объекта основания
- Программы дефрагментации диска относятся к прикладному программному обеспечению
- Как обновить яндекс браузер на компьютере видео