Оптимизация типовых функций из кода 1с в 1С:Предприятие 8.Х

28.01.10

Разработка - Универсальные функции

Оптимизация типовых функций/кода 1с в 8-ке - оптимизация типовых функций 1С типа ВыделитьСлово, РазложитьСтрокуВМассивПодстрок и т.д.

Скачать файлы

Наименование Файл Версия Размер
Тест_РазложитьСтрокуВМассивПодстрок.epf
.epf 10,37Kb
55
.epf 10,37Kb 55 Скачать

Оптимизация типовых функций/кода 1с в 8-ке - оптимизация типовых функций 1С типа ВыделитьСлово, РазложитьСтрокуВМассивПодстрок и т.д.

В продолжение обсуждения //infostart.ru/public/64222

Все алгоритмы предлагаю выкладывать в виде:

Название типовой/штатной функции 1С - например, ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок

Можно приложить типовую реализацию функции

Далее выкладываем свой оптимизированный вариант, который должен 100% выполнять ту же самую функцию.

Возможно описать некоторые ограничения, связанные с использованием оптимизированной функции - например, нужна ли первоначальная инициализация (может быть медленной)

  1. Функция ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок

Описание

Функция "расщепляет" строку на подстроки, используя заданный разделитель. Разделитель может иметь любую длину.
Если в качестве разделителя задан пробел, рядом стоящие пробелы считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр игнорируются.
Например,
РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов, три из которых - пустые строки, а РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов

Параметры:
  Стр - строка, которую необходимо разложить на подстроки.
  Параметр передается по значению.
  Разделитель - строка-разделитель, по умолчанию - запятая.

Возвращаемое значение:
  массив значений, элементы которого - подстроки

Самая быстрая реализация этого метода ( по состоянию на 28.01.2010)

 

Перем Script2;

Функция РазложитьСтрокуВМассив(Строка, Разделитель = ",") Экспорт
    Возврат Script2.eval("Split(""" + Строка + """, """ + Разделитель + """)").Выгрузить();
КонецФункции

Процедура Инит() Экспорт
    Script2 = Новый COMОбъект("MSScriptControl.ScriptControl");
    Script2.Language = "vbscript";
КонецПроцедуры


[u]Ограничения реализации - требуется предварительная инициализация[/u]

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4608    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8822    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16144    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Душелов 4013 28.01.10 14:14 Сейчас в теме
Предлагаю в тело публикации добавлять полученные алгоритмы и сделать общий тест на это дело.
2. Evg-Lylyk 4559 28.01.10 14:18 Сейчас в теме
Давайте только опишем какие функции нужно оптимизировать
3. alexk-is 6533 28.01.10 14:23 Сейчас в теме
Нужно было заводить не статью, а группу
5. Душелов 4013 28.01.10 14:28 Сейчас в теме
(3) Публикацию можно расширить.
6. artbear 1448 28.01.10 14:34 Сейчас в теме
(5) Расширил публикацию.
Выложил Тест_РазложитьСтрокуВМассивПодстрок.epf
4 сравнения -
Выполнений: 1 000 Функции из Бух 1.6 и КОРП 2.0 время: 797 мс
Выполнений: 1 000 функций на RegExp время: 1 016 мс
Выполнений: 1 000 функций на VBScript время: 390 мс
Выполнений: 1 000 Функции ЗначениеИзСтрокиВнутр время: 641 мс
7. alexk-is 6533 28.01.10 15:14 Сейчас в теме
(6) "из Бух 1.6 и КОРП 2.0" - это тоже оптимизированный мною вариант. "Родной вариант" выглядит несколько иначе. Он есть в первоначальном варианте теста из http://www.infostart.ru/public/64222/ Тест прикрепил к сообщению.

Предлагаю включить его "как есть", т.е. не загонять в 1 строку. Тогда разница в производительности будет очевиднее.

И еще замечание по замерам в тестах. На полученные результаты тестирования влияют циклы. Что искажает время результатов. Нужно из результатов тестов исключать время на циклы. Тогда останется только время выполнения самих функций. Примеры таких тестов можно посмотреть здесь http://www.infostart.ru/public/19021/
11. artbear 1448 28.01.10 15:53 Сейчас в теме
(7) Исправился - исключил время циклов.
4. artbear 1448 28.01.10 14:26 Сейчас в теме
Обновил публикацию.
По тестированию предполагаю использовать юнит-тестирование в том виде, как выкладывал в ветке по RegExp.
8. alexk-is 6533 28.01.10 15:16 Сейчас в теме
+7 ...что-то тест не прикрепился :(
Прикрепленные файлы:
Тест.epf
9. artbear 1448 28.01.10 15:19 Сейчас в теме
(8) В подфоруме завел новую тему по этой функции
10. artbear 1448 28.01.10 15:23 Сейчас в теме
(8) ОФФ. Я тебе по разукрашке ответил - не очень удобно работать :)
13. artbear 1448 28.01.10 16:29 Сейчас в теме
(12) Женя правильно сказал, что ради подобной функции не нужно юзать отдельную компоненту.
Вполне можно написать простой код на ВБ-скрипт и оформить его в виде отдельной функции 1С или класса 1С.

Да и сортировка массива ИМХО довольно редкий случай, намного чаще работаешь с сортировкой других коллекций.
15. tango 506 28.01.10 16:39 Сейчас в теме
(13) в УТ нашел два места, где тупым перебором ищется значение в массиве
14. artbear 1448 28.01.10 16:34 Сейчас в теме
(12) Завел новую подтему "Сортировка массива"
http://infostart.ru/public/64770/forum/topic/30873/
16. artbear 1448 28.01.10 17:41 Сейчас в теме
Еще кандидаты на оптимизацию из общего модуля "ОбщегоНазначения"
ТолькоЦифрыВСтроке
ВыделитьСлово
ЕстьНеЦифры
МассивыИдентичны
УдалитьНеЗаполненныеЭлементыМассива
УдалитьПовторяющиесяЭлементы
УдалитьПовторяющиесяЭлементыМассива
17. tango 506 28.01.10 18:16 Сейчас в теме
только цифры:

Попытка
нн = Число(Тестстрока);
Исключение
Сообщить("блин, не только цифры...");
КонецПопытки
20. artbear 1448 29.01.10 16:23 Сейчас в теме
(17) Блок Попытка-КонецПопытки очень медленный как правило.
Нужно потестить подобное преобразование :)
18. IamAlexy 344 28.01.10 21:01 Сейчас в теме
лучше бы закрытие месяца в типовых БП на SQL базах оптимизировали бы :)

19. Valerich 1633 29.01.10 14:20 Сейчас в теме
(18) на этом сайте уже выложено несколько вариантов оптимизаций
21. lustin 31.03.10 10:11 Сейчас в теме
Артур - тут такое дело

вот такой тест
Процедура ПроверитьРазборСтроковогоПараметраScriptЗначенияСКавычкамиВВнутри() Экспорт
	первыйЭлемент = Символ(34)+"я" +Символ(34);
	второйЭлемент = Символ(34)+"тест"+Символ(34);
	результат = ОбщегоНазначенияАльтернативный.РазложитьСтрокуВМассивПодстрок(первыйЭлемент+"="+второйЭлемент,"=");
	Я_Тест.ПроверитьРавенство(результат[0],первыйЭлемент);
	Я_Тест.ПроверитьРавенство(результат[1],второйЭлемент);
КонецПроцедуры


не пройдет на функции ОбщегоНазначенияАльтернативный.РазложитьСтрокуВМассивПодстрок
Функция РазложитьСтрокуВМассив(Строка, Разделитель = ",") Экспорт
    Возврат Script2.eval("Split(""" + Строка + """, """ + Разделитель + """)").Выгрузить();
КонецФункции


с ошибкой компиляции VBScript из-за недопустимого знака

сейчас пробую сделать так чтобы тест проходил

22. lustin 31.03.10 12:12 Сейчас в теме
(21)

блин, а не получается пока с наскока придумать как обойти это финт - туплю наверное :|
23. artbear 1448 31.03.10 12:20 Сейчас в теме
(21) "Не пройдет" или уже не проходит? ты в реале протестил?
24. lustin 31.03.10 13:24 Сейчас в теме
(23) вечно я недоформулирую

"Не прошел" имелось ввиду;

у меня выдало в реальности, я и написал тест (как Федор советовал - добейтесь вначале чтобы тест не проходил)
25. rasswet 82 01.04.10 08:38 Сейчас в теме
"требуется предварительная инициализация" каким образом?
26. artbear 1448 03.06.10 16:13 Сейчас в теме
(25) До вызова быстрого основного метода РазложитьСтрокуВМассив
предварительно нужно где-то вызвать метод Инит() - он довольно тормозной :(
27. iceflash 4 11.08.10 19:02 Сейчас в теме
Вообще, мне кажется данная "оптимизация" палка о двух концах. Из одного интерпретатора передавать управление на исполнение кода в другой=)
Тут наверное стоит подходит со стороны. что можно сделать средствами 1ц, а что средствами сторонних скриптовых движков\ВК. И на сколько я знаю обмен и взаимодействие по технологии COM достаточно ресурсоемкий (процессор, оперативная память), и данный вывод я делаю не как разработчик на 1ц, а как системный программист, 1ц - это "дуновение потребностей"=) Т.е. например когда действительно нужно применить регулярку, имеет смысл использовать JS регулярку=)
А вообще конечно хотелось бы увидеть примеры замеров производительности (обязательно раз по 10 как минимум, с средним арифметическим) 8-)
28. Serg G 22 10.06.15 04:24 Сейчас в теме
результаты тестов зависят от многих факторов. Например, большая часть времени уходит на создание обьекта (New RegExp) , на чем часто играют создатели, так сказать, "более быстрых альтернатив". Если же он создан и уже весит в памяти , то отработает, наверняка, быстрее всех. Хотя, Split() - это слишком примитивно.

Во-вторых, существенно влияет последовательность тестов. Т.е., что вы тестируете первым, то и покажет лучшие СВОИ результаты. Это связанно с оперативной памятью. (Кто-то ранее заметил, что запись в одну переменную - но физически это не так.)
RegExp - проверенный временем обьект, очень мощный и нужный. Главный минус, что он сторонный/внешний и ОСевой.
(Могу ошибаться, но в учебных платформах 1C com-обьекты тоже не подключаются. )

И всё же, при всех плюсах RegExp-a, желательно использовать стандартные наборы функций. Впринципе, это закон любой седы.

Реализовать такой обьект, как RegEx, в 1с не реально, имхо! Лучше лоббировать его включение и оптимизацию в саму платформу.
30. artbear 1448 10.06.15 12:07 Сейчас в теме
(28) >существенно влияет последовательность тестов
Не соглашусь.
Нет такой явной зависимости от последовательности выполнения
31. Serg G 22 10.06.15 21:37 Сейчас в теме
(30) Ну, я только знакомлюсь с 1с, так что, извините, 2010 для меня тоже самое что и 2020. :)
Имеется ввиду, если тест идет одной процедурой, последовательно.
Когда-то давно, тестировал ADO vs DAO на создание нескольких десятков и даже сотен тысяч строк в таблице... Впоследствии выяснилось, , последний покажет худший СВОЙ результат, чем будь он первым. Понимаете, даже хранение результатов первого теста в переменной уже уменьшает оперативную память, что приведет к более медленной отработке второго теста.
Такие "микротесты" (и тут http://infostart.ru/public/64222/) нужно проводить на идеально "вылизанных" машинах: без лишних служб, без сетей, без антивирусов и тп, что может "тормознуть" ОС на мгновение. И то... В общем, если проводить тесты, то уж на максимальных нагрузках.

>...на большом количестве выполнений.
Разбейте томик К.Маркса на слова, например, где результаты будут более 5 сек, хотя бы.


ps: Еще, подозреваю, что скорость wscript и сscript разная и точно зависит от установленных комплексов защиты компьютера и их настройки. Т.е. на разных машинах, результаты могут отличаться.
А на чем работает 1с при Eval()(Выполнить()) или на дефолте в системе?
29. artbear 1448 10.06.15 12:06 Сейчас в теме
Сейчас, конечно, я уже не найду результатов тестирования, 5 лет все-таки прошло :)
Но проверял на нескольких разных алгоритмах, естественно, на большом количестве выполнений.
32. ZLENKO 398 28.11.17 19:06 Сейчас в теме
Реализовано в версии 8.3.6.1977 функции: СтрРазделить(), СтрСоединить()
Читаем тут: https://infostart.ru/public/366865/
Оставьте свое сообщение