Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр

Автор Харлампий Дымба, 25 октября 2024, 13:09

« назад - далее »

Харлампий Дымба

Есть ли какие-то подводные камни в использовании
ТЗ=ЗначениеИзСтрокиВнутр("{""VT"",""1"",{""0"",{{"""",""0"",""0"",""0"","""",""2""}}}}");
вместо
ТЗ=СоздатьОбъект("ТаблицаЗначений");
?

А то уж больно большая прибавка в скорости, особенно в циклах и во вложенных таблицах - в ЗиКе у меня хорошо так ускорилось. Но гложет - не может же быть всё так просто и хорошо?



АЛьФ

Много лет подобное используем, вроде нет проблем.
Правда у нас несколько иначе сделано для наглядности:

    тзОплаты = глСоздатьТаблицу("Документ,ДнейПросрочки,ПроцентВычета,СуммаОплаты,ДоляВСумме,КоэффициентВычета");
    Шаблон_тзОплаты = ЗначениеВСтрокуВнутр(тзОплаты);
...
            тзОтгрузки.тзОплаты = ЗначениеИзСтрокиВнутр(Шаблон_тзОплаты);

Харлампий Дымба

Да, тоже подумывал, через глобальный модуль делать, чтоб покрасивше было. Сделал на пробу
1й вариант
Функция глСоздатьТаблицуЗначений() Экспорт
возврат ЗначениеИзСтрокиВнутр("{""VT"",""1"",{""0"",{{"""",""0"",""0"",""0"","""",""2""}}}}");
КонецФункции
2й вариант
Перем глСозданиеТЗ Экспорт
...
глСтрокаДлТЗ=ЗначениеИзСтрокиВнутр("{""VT"",""1"",{""0"",{{"""",""0"",""0"",""0"","""",""2""}}}}");

и создание в модулях соответственно делать через
ТЗ=глСоздатьТаблицуЗначений();
либо
ТЗ=ЗначениеИзСтрокиВнутр(глСозданиеТЗ)

Оба варианта получились помедленнее, чем исходный. Решил, что раз уж взялся ускорить, то пусть лучше везде будет понатыкана немного некрасивая, но быстрая
ТЗ=ЗначениеИзСтрокиВнутр("{""VT"",""1"",{""0"",{{"""",""0"",""0"",""0"","""",""2""}}}}");

Хотя вариант создавать таблицу значений сразу со всей структурой себе в голове заначил - можно же строку передавать уже с учетом всех колонок.

А с чем вообще связано такое поведение, просто интересно?


Djelf

А не проще 1с++ подключить в "холостом" режиме (только для подобного ускорения), чтобы turbobl включилось?

Харлампий Дымба

Цитата: Djelf от 25 октября 2024, 14:57А не проще 1с++ подключить в "холостом" режиме (только для подобного ускорения), чтобы turbobl включилось?
Помню же, что было про алфавит) но не стал озвучивать - неужто всё настолько просто и тупо.
Я обязательно посмотрю при случае - самому интересно: вся разница между тормозным СоздатьОбъект() и быстрым ЗначениеИзстрокиВнутр() только в первой букве названия? :o

И ещё, должен признаться: при всем своем опыте в некоторых областях "ванильной" 1С - во внешних компонентах я полный ноль . Политика партии в определенные моменты не позволяла их использование, плюс 1cpp точилось на регистры и sQL, а у меня основное ЗиК и Бух DBF, и там особых плюшек изначально 1с++ не давало (про AccountsRecordset слышал). Объемы у меня небольшие, и быстродействие не было слабым местом. Formex - замечательная штука, но пока хватало типового.  Мне и в типовом функционале - каждый день чудесные открытия. Так что сразу извинись, если вопросы могут показаться тупыми.

Харлампий Дымба

Цитата: Харлампий Дымба от 25 октября 2024, 15:42Так что сразу извинись, если вопросы могут показаться тупыми.
Как вот такие описки появляются? Всего пару букв, а как смысл меняет!
Прошу читать как:
Так что сразу извиняюсь, если вопросы могут показаться тупыми

Djelf

https://www.1cpp.ru/docum/html/TurboBL.html
а в 1с++ еще кеширование создания пустых объектов было сделано (именно ЗначениеИзСтрокиВнутр но скрытое)
правда при включенной 1с++ ЗначениеИзСтрокиВнутр("{}"); вызвает выпадение из 1с, но иногда это удобно, чтобы выкинуть кого-то с неминуемым крэшем  ;D

Харлампий Дымба

Цитата: Djelf от 25 октября 2024, 16:16правда при включенной 1с++ ЗначениеИзСтрокиВнутр("{}"); вызвает выпадение из 1с,
Не, это в ей прям из коробки - встроенная фича,  1с++ тут ни при чём.
Как-то провёл пару занимательных часов в попытках понять что роняло базу: а всего-то в документе ПриЗаписи сохранял таблицу значений в строку с помощью ЗначениеВСтроку(), а пытался восстановить ПриОткрытии с помощью ЗначениеИзСтрокиВнутр(). Тут-то у меня 1С и валилась без лишних слов. Не мой был день.

Для крашей помогает ещё в расшифровку ячейки таблицы запихнуть таблицу значений побольше (65535?) :P

Djelf

Странно, у меня с отключением 1c++ не падало. Возможно влияет текущее направление ветра.

Злоп

Использовал значениеизстрокивнутр для создания СЗ, норм.
.
Про ТЗ тоже мысль была, но вилы к горлу в части быстродействия не торчали, поэтому не использовал. Да и вдобавок обычно создание ТЗ выносил "наверх" и передавал параметром обычно.
.
Смутно мне помнится, что когда загрузка в бухию универсальной загрузкой иксемеля штатной работала долго и меня это достало - полез смотреть, там сделано универсально, генерится СоздатьОбъект(типвидданных) каждый раз в циклах и это ощутимо жрало время, вынес все СО наружу, закешировал - прирост скорости был ощутимый

Харлампий Дымба

(9) В ЗиКе там НДФЛ и взносы собираются в монструозные таблицы значений с десятками тысяч вложенных таблиц значений - и в принципе это достаточно удобно для последующей обработки, но если само заполнение можно хорошо оптимизировать, то вот на создание самих таблиц тратится уйма времени.
Помимо этого есть куча часто используемых функция глобального модуля возвращающих список или таблицу значений - а по ним создание наверх не вынесешь.
Но это всё теперь не важно, потому что:
(3) А я-то себя считал достаточно умным. Просто нет слов...
Простое ЗагрузитьВнешнююКомпоненту("1cpp.dll") дало по самым тормозным местам конфигурации буст по скорости 30-60%.
Это просто феноменально! Djelf, огромное спасибо за вразумление!

Что касается использования ЗначениеИзСтрокиВнутр(), то с включенным TurboBL это работает медленнее(sic!), чем СоздатьОбъект(), поэтому буду откатывать всё назад.

Замеры (К сожалению, не разобрался как сделать сюда красивой таблицей):

  • СоздатьОбъект("СписокЗначений")                                                 6594    118    51420    120
  • ЗначениеИзСтрокиВнутр("{"VL",{}}")                                                   226    227         226    226
  • СоздатьОбъект("ТаблицаЗначений")                                                 7231    145    52294    146
  • ЗначениеИзСтрокиВнутр("{"VT","1",{"0",{{"","0","0","0","","2"}}}}")       565    566         564    564

1я колонка - монопольно без 1c++
2я колонка - монопольно с 1c++
3я колонка - разделённо без 1c++
4я колонка - разделённо с 1c++

Боли добавляло ещё и то, что СоздатьОбъект в разделенном режиме работал в 10 раз медленнее, чем в монопольном. Ведь никакого обращение к данным, почему такое падение скорости, непонятно. Так что в разделенном режиме прибавка в скорости ещё больше.

Злоп

С ТЗ, вложенными итд - гораздо удобно работать с применением ИТЗ.
с ИТЗ есть, например, и такие вещи как
ВнутреннееСоединение / InnerJoin
ЛевоеСоединение / LeftJoin
ПравоеСоединение / RightJoin
ПолноеСоединение / FullJoin
Объединить / Merge
Пересечение / Conjunction
Разность / Difference
.
https://1cpp.ru/docum/html/IndexedTable.html

Злоп

С ТЗ еще есть прикол, что можно несколько колонок с одинаковым Идентификатором вкорячить... А потом сидишь колупаешься что за хрень.. Пока не визуализируешь.. ;-)

Djelf

Не помню как давно отказался от ТЗ в пользу ИТ, но очень давно...
Поначалу загонял запросы 1С в ИТ и там уже объединял разными sql-подобными способами.
Потом появилось 1csqlite и необходимость в этом исчезла (почти все можно сделать на этапе запроса).
Отображение на форме... Так я от ТЗ на форме тоже давно отказался, с ТП работать значительно комфортнее.
Это не относится напрямую к данной теме.

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

30-60 Это очень хорошо! Тем более что "за-бесплатно".
Срочно выбивай премию за ускорение, ибо через месяц-два захотят ускорить еще раза в 2-3  ;D

Arbuz

Цитата: Djelf от 28 октября 2024, 16:02Потом появилось 1csqlite и необходимость в этом исчезла
Я уже дошёл до того, что почти не кручу тз'шки в циклах — УложитьТЗ и дальше запросами. Опустился до того, что уже математику в селектах считаю  ;D

Цитата: Злоп от 27 октября 2024, 14:46с ИТЗ есть, например, и такие вещи как
А ещё в ИТЗ есть такое:
_вм =СоздатьОбъект("ВыполняемыйМодуль");
    _стр ="
    |Перем Парам;
    |Процедура ВНачало(__знач)
    |    Парам =__знач;
    |КонецПроцедуры
    |
    |Функция NextValue()
    |    Парам =Парам +1;
    |    Возврат Парам;
    |КонецФункции
    |";
    _вм.УстановитьМодуль(_стр);
    _вм.КомпилироватьМодуль();
    _вм.ВыполнитьМодуль();
    _вм.ВНачало(0);

    ИТЗ.ЗаполнитьКолонкуПоАлгоритму(, 1, _вм);