Что работает быстрее: СтрНайти или Подобно?

06.10.25

Разработка - Механизмы платформы 1С

Задача. Есть регистр на 200 000 строк, с хранилищем значений, в котором лежит xml файл. Нужно сделать поиск по содержанию в этих файлах.

Задача

Есть регистр на 200 000 строк, с хранилищем значений, в котором лежит xml файл. Нужно сделать поиск по содержанию в этих файлах.

 

Делаем пример

Так как у меня есть обработка по загрузке в регистр из файла и при нажатии на кнопку делается 1 запись с уникальной записью.

 

Пробуем кликером.

 

Ладно… Это долго…. Поэтому дописываем цикл в коде сохранения

 

 

Но так как мы «крутой» прогер и хотим получить результат максимально быстро  - пишем код в одну строчку (можно в транзакцию поместить и будет еще быстрее):


 
 Рубрика научпок

Транзакция позволяет множество мелких операций заменять одной крупной, важно понимать, что вызов самой транзакции тоже занимает время. Поэтому если данных немного, можно обойтись и без транзакции, при этом она не должна быть очень большой т.е не забываем делить на оптимальные порции.  

Пока читали научпок, у нас уже записи приготовились (а если не прочитали, то читает - загружается 😡)

 

 Делаем тесты в обработке:

 

 

  1. Если написать алгоритм в одну строку (123 523):

 

 

  1. Тот же алгоритм, но в несколько строчек (129 572)

 

 

  1. Если использовать запрос (152 812, из которых 151 563, это взятие данных из хранилища, т.е 1 249 это время работы в запросе)

 

 

Если смотреть на форме списка, то, конечно, тут работает быстрее (пишите в комментариях, почему на форме работает быстрее 😇):

 

 

1514 – в одну строку

1976 - в несколько строк

2098 – это заполнить строку таблицы значений

3322 – это заполнение и выполнение запроса (3322-2098=1224) т.е в целом подобно работает быстрее

 

И приходим к выводу:

1) Что в моей задаче лучше использовать СтрНайти

2) Что Подобно работает быстрее

3) Код в строчку работает быстрее. НО лучше прочитайте статью (ведь код выполняется одинаково) 

4) Финальный код, на котором остановился я 

 

 

Буду рад узнать новые методики оптимизации, и на любую активность в комментариях.

Вступайте в нашу телеграмм-группу Инфостарт

хранилище значений 1с СтрНайти Подобно Оптимизация

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    21976    TitanLuchs    106    

138

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    12466    bayselonarrend    127    

66

Механизмы платформы 1С WEB-интеграция Программист 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    21548    dsdred    77    

134

Механизмы платформы 1С Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    21448    bayselonarrend    22    

169

Механизмы платформы 1С Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    12049    dsdred    22    

84

Механизмы платформы 1С Программист Стажер 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    43784    YA_418728146    35    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. paulwist 06.10.25 08:20 Сейчас в теме
Транзакция позволяет множество мелких операций заменять одной крупной


Про какие мелкие операции идёт речь??

... важно понимать, что вызов самой транзакции тоже занимает время.


Это вы про какую транзакцию пишите про 1С или про СУБД??

...Поэтому если данных немного, можно обойтись и без транзакции, при этом она не должна быть очень большой т.е не забываем делить на оптимальные порции.


А что делать если одна из порций не записалась/вывалилась с ошибкой??
6. abolior 2 06.10.25 12:15 Сейчас в теме
(1) Про какие мелкие операции идёт речь??
операций с диском. Заменяем много мелких операций с диском, одной большой.

А что делать если одна из порций не записалась/вывалилась с ошибкой??
В моем бы случае, можно было бы использовать Вызвать исключение
8. paulwist 06.10.25 13:18 Сейчас в теме
(6)
операций с диском. Заменяем много мелких операций с диском, одной большой.


Эээ, вы из 1С умеете управлять контроллером диска?? Покажите, как это делаете, очень интересно!!!

(6)
В моем бы случае, можно было бы использовать Вызвать исключение


Хорошо, вызвали исключение на ошибочной порции данных, а что делать с теми порциями, которые уже записаны и те, которые ещё не успели записать??
2. aleksey2 90 06.10.25 08:50 Сейчас в теме
Здесь многопочочность ускорит.
Каждый поток читает свои строки
3. RocKeR_13 1457 06.10.25 11:13 Сейчас в теме
Как-то сумбурно написано. Плюс зачем нужно было сюда добавлять уже заезженное сравнение быстродействия выполнения кода в одну или несколько строк, если цель была в другом? К тому же с выключенной отладкой не надо было бы ничего мудрить с вычислением разницы между однострочной и многострочной записями. Плюс ну как-то совсем некорректный пример выбрали: с практической точки зрения вы получили противоречащие выводы - вроде "Подобно" быстрее, а лучше использовать "СтрНайти". И тогда непонятно, вы решали-то в итоге какую задачу: практическую, когда учитывали время на подготовку данных, или теоретическую, когда вы для сферического коня в вакууме сравнивали напрямую поиск в запросе по подстроке с циклом и поиском методом СтрНайти? А как будет изменяться разница при росте/уменьшении количества строк? А что с точки зрения использования вычислительных мощностей?
SerVer1C; abolior; +2 Ответить
5. abolior 2 06.10.25 12:05 Сейчас в теме
(3)
ю, когда вы для сферического коня в вак


Спасибо, за комментарий, в следующий раз напишу более структурировано


А как будет изменяться разница при росте/уменьшении количества строк?
на 20 строк СтрНайти отработало быстрее, в Подобно время выполнение запроса, было примерно столько же, но время обработки данных очень большое

А что с точки зрения использования вычислительных мощностей?
Тут не проверял, но думаю, что разница между методами не сильно большая будет

Плюс зачем нужно было сюда добавлять уже заезженное сравнение быстродействия выполнения кода в одну или несколько строк, если цель была в другом?
Потому что она заезженная, д и узнал про это относительно недавно
4. starik-2005 3198 06.10.25 11:37 Сейчас в теме
Если смотреть на форме списка, то, конечно, тут работает быстрее (пишите в комментариях, почему на форме работает быстрее 😇):
А что конкретно "работает быстрее"? Подобно или СтрНайти?
RocKeR_13; +1 Ответить
20. qwinter 685 07.10.25 15:29 Сейчас в теме
Есть регистр на 200 000 строк, с хранилищем значений, в котором лежит xml файл
какой треш...
7. Diversus 2337 06.10.25 12:49 Сейчас в теме
Транзакция позволяет множество мелких операций заменять одной крупной


Это утверждение не верное.
Транзакции нужны для консистентной записи данных в базе данных.

Если у вас простой поиск в регистре, то транзакции не нужны.
9. paulwist 06.10.25 13:19 Сейчас в теме
(7)
Если у вас простой поиск в регистре, то транзакции не нужны.


Ммм, вы про какие транзакции "говорите" 1С или СУБД??
10. Diversus 2337 06.10.25 13:22 Сейчас в теме
(9)

Ммм, вы про какие транзакции "говорите" 1С или СУБД??


А какая разница? Метод НачатьТранзакцию() в 1С приводит к созданию транзакции на уровне СУБД.
11. paulwist 06.10.25 14:40 Сейчас в теме
(10)
А какая разница? Метод НачатьТранзакцию() в 1С приводит к созданию транзакции на уровне СУБД.


А если метод НачатьТранзакцию() в 1С не используется, то команда "простой поиск в регистре" не приводит к созданию транзакции на уровне СУБД, я правильно понял??
12. Diversus 2337 06.10.25 16:37 Сейчас в теме
(11) Транзакции нужны, чтобы фиксировать несколько операций с данными, чтобы они не "разъехались". Классический пример - это операции с банковскими переводами.
Банковский перевод - это как минимум две операции:
1. Списать деньги с отправителя.
2. Зачислить деньги получателю.

Представьте, что в процессе выполнения этих двух операций будет ошибка, и выполнится только шаг 1, а на шаге 2 будет ошибка и она не запишется. В этом случае нужно, чтобы операции были выполнены либо обе одновременно, либо ни одной. Поэтому и придумали механизм транзакций, тогда последовательность действий вот такая:
НачатьТранзакцию()
Попытка
  // Списать деньги с отправителя
  // Зачислить деньги получателю
  ЗафиксироватьТранзакцию();
Исключение
  ОтменитьТранзакцию();
КонецПопытки;
Показать


В этом случае все будет ОК. Если будет ошибка, то транзакция откатится и ничего не будет сделано с данными.

Когда же мы ищем данные ничего из этого не нужно.

Возможно нужна БЛОКИРОВКА данных регистра на время поиска, но это совсем другой механизм.
sergey82vladik; +1 Ответить
13. paulwist 06.10.25 16:51 Сейчас в теме
(12)
Когда же мы ищем данные ничего из этого не нужно.

Возможно нужна БЛОКИРОВКА данных регистра на время поиска, но это совсем другой механизм.


Из вашего ответа я не понял, команда "простой поиск в регистре" не приводит к созданию транзакции на уровне СУБД, ДА или НЕТ??
14. Diversus 2337 06.10.25 16:52 Сейчас в теме
15. paulwist 06.10.25 16:54 Сейчас в теме
(14) то есть, "простой поиск в регистре" приводит к созданию транзакции в СУБД, правильно??
16. Diversus 2337 06.10.25 16:57 Сейчас в теме
(15) Это троллинг? ))) НИКАКОЙ транзакции не создается. При поиске, выполняется запрос SELECT к СУБД и все. Для его работы не нужны никакие транзакции.

Транзакции используются КОГДА ДАННЫЕ ИЗМЕНЯЮТСЯ в базе данных.
При поиске данные изменяются?
17. paulwist 07.10.25 08:47 Сейчас в теме
(16)
Это троллинг? )))


Нет, конечно!

(16)
НИКАКОЙ транзакции не создается. При поиске, выполняется запрос SELECT к СУБД и все. Для его работы не нужны никакие транзакции.


Мдя.
Вендоры "взрослых" СУБД не согласны с вашим представлением о транзакциях :)

ORACLE
Introduction to Transactions
A transaction is a logical, atomic unit of work that contains one or more SQL statements.
...
After one transaction ends, the next executable SQL statement automatically starts the following transaction.


PostgreSQL
START TRANSACTION
...
Согласно стандарту, выполнять START TRANSACTION, чтобы начать блок транзакции, необязательно: блок неявно начинает любая команда SQL. Поведение PostgreSQL можно представить как неявное выполнение COMMIT после каждой команды


MySQL
By default, MySQL runs with autocommit mode enabled. This means that, when not otherwise inside a transaction, each statement is atomic, as if it were surrounded by START TRANSACTION and COMMIT.


MSSQL

... любая из следующих инструкций Transact-SQL начинает новую транзакцию. Это эквивалентно выполнению невидимой инструкции BEGIN TRANSACTION


Вот теперь вы узнали, что ЛЮБАЯ инструкция DML/DDL запускает транзакцию, в том числе команда SELECT (явно или не явно - это уже другой вопрос), иными словами СУБД не умеют выполнять команды, запросы без транзакции.

(16)
Транзакции используются КОГДА ДАННЫЕ ИЗМЕНЯЮТСЯ в базе данных.
При поиске данные изменяются?


При выполнении команды SELECT данные не изменяются, НО команда SELECT может препятствовать, не разрешать изменению данных из других транзакций. (подробности читайте в уровнях изоляции).

PS 2Diversus как видите тролинга с моей стороны не было :) :) :)
18. Diversus 2337 07.10.25 09:53 Сейчас в теме
(17) Просто вы спросили об одном и том же несколько раз :)

Что касается вашего замечания, то не знал - спасибо.
Получается мои слова применимы только к 1С про транзакции и изменения данных в 1С, но уже в самой СУБД любой запрос может начинаться с неявной транзакции уже на уровне СУБД. В принципе, оно и логично. Чтобы была согласованность данных на момент запроса, внутри СУБД оно должно как-то регулироваться, а это можно обеспечить только транзакциями.
19. paulwist 07.10.25 10:16 Сейчас в теме
(18)
Просто вы спросили об одном и том же несколько раз :)


ДА, первоначально "криво" сформулировал вопрос, так что ответ можно было трактовать в любую сторону, пришлось переформулировать!

(18)
уже в самой СУБД любой запрос может начинаться с неявной транзакции уже на уровне СУБД.


Не "может", а всегда начинает неявную транзакцию (при implicite mode), НО лучше ВСЕГДА при работе с данными СУБД начинать явную транзакцию, во всяком случае тогда можно говорить о гарантированном поведении данных.
Для отправки сообщения требуется регистрация/авторизация