Форум Кладовочки АЛьФ`а

Общие вопросы => 7.7 => Тема начата: Харлампий Дымба от 25 октября 2024, 13:09

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

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


Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: АЛьФ от 25 октября 2024, 13:34
Много лет подобное используем, вроде нет проблем.
Правда у нас несколько иначе сделано для наглядности:

    тзОплаты = глСоздатьТаблицу("Документ,ДнейПросрочки,ПроцентВычета,СуммаОплаты,ДоляВСумме,КоэффициентВычета");
    Шаблон_тзОплаты = ЗначениеВСтрокуВнутр(тзОплаты);
...
            тзОтгрузки.тзОплаты = ЗначениеИзСтрокиВнутр(Шаблон_тзОплаты);
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Харлампий Дымба от 25 октября 2024, 14:01
Да, тоже подумывал, через глобальный модуль делать, чтоб покрасивше было. Сделал на пробу
1й вариант
Функция глСоздатьТаблицуЗначений() Экспорт
возврат ЗначениеИзСтрокиВнутр("{""VT"",""1"",{""0"",{{"""",""0"",""0"",""0"","""",""2""}}}}");
КонецФункции
2й вариант
Перем глСозданиеТЗ Экспорт
...
глСтрокаДлТЗ=ЗначениеИзСтрокиВнутр("{""VT"",""1"",{""0"",{{"""",""0"",""0"",""0"","""",""2""}}}}");

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

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

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

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

И ещё, должен признаться: при всем своем опыте в некоторых областях "ванильной" 1С - во внешних компонентах я полный ноль . Политика партии в определенные моменты не позволяла их использование, плюс 1cpp точилось на регистры и sQL, а у меня основное ЗиК и Бух DBF, и там особых плюшек изначально 1с++ не давало (про AccountsRecordset слышал). Объемы у меня небольшие, и быстродействие не было слабым местом. Formex - замечательная штука, но пока хватало типового.  Мне и в типовом функционале - каждый день чудесные открытия. Так что сразу извинись, если вопросы могут показаться тупыми.
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Харлампий Дымба от 25 октября 2024, 16:12
Цитата: Харлампий Дымба от 25 октября 2024, 15:42Так что сразу извинись, если вопросы могут показаться тупыми.
Как вот такие описки появляются? Всего пару букв, а как смысл меняет!
Прошу читать как:
Так что сразу извиняюсь, если вопросы могут показаться тупыми
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Djelf от 25 октября 2024, 16:16
https://www.1cpp.ru/docum/html/TurboBL.html
а в 1с++ еще кеширование создания пустых объектов было сделано (именно ЗначениеИзСтрокиВнутр но скрытое)
правда при включенной 1с++ ЗначениеИзСтрокиВнутр("{}"); вызвает выпадение из 1с, но иногда это удобно, чтобы выкинуть кого-то с неминуемым крэшем  ;D
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Харлампий Дымба от 25 октября 2024, 16:45
Цитата: Djelf от 25 октября 2024, 16:16правда при включенной 1с++ ЗначениеИзСтрокиВнутр("{}"); вызвает выпадение из 1с,
Не, это в ей прям из коробки - встроенная фича,  1с++ тут ни при чём.
Как-то провёл пару занимательных часов в попытках понять что роняло базу: а всего-то в документе ПриЗаписи сохранял таблицу значений в строку с помощью ЗначениеВСтроку(), а пытался восстановить ПриОткрытии с помощью ЗначениеИзСтрокиВнутр(). Тут-то у меня 1С и валилась без лишних слов. Не мой был день.

Для крашей помогает ещё в расшифровку ячейки таблицы запихнуть таблицу значений побольше (65535?) :P
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Djelf от 25 октября 2024, 16:52
Странно, у меня с отключением 1c++ не падало. Возможно влияет текущее направление ветра.
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Злоп от 26 октября 2024, 09:04
Использовал значениеизстрокивнутр для создания СЗ, норм.
.
Про ТЗ тоже мысль была, но вилы к горлу в части быстродействия не торчали, поэтому не использовал. Да и вдобавок обычно создание ТЗ выносил "наверх" и передавал параметром обычно.
.
Смутно мне помнится, что когда загрузка в бухию универсальной загрузкой иксемеля штатной работала долго и меня это достало - полез смотреть, там сделано универсально, генерится СоздатьОбъект(типвидданных) каждый раз в циклах и это ощутимо жрало время, вынес все СО наружу, закешировал - прирост скорости был ощутимый
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Харлампий Дымба от 26 октября 2024, 23:59
(9) В ЗиКе там НДФЛ и взносы собираются в монструозные таблицы значений с десятками тысяч вложенных таблиц значений - и в принципе это достаточно удобно для последующей обработки, но если само заполнение можно хорошо оптимизировать, то вот на создание самих таблиц тратится уйма времени.
Помимо этого есть куча часто используемых функция глобального модуля возвращающих список или таблицу значений - а по ним создание наверх не вынесешь.
Но это всё теперь не важно, потому что:
(3) А я-то себя считал достаточно умным. Просто нет слов...
Простое ЗагрузитьВнешнююКомпоненту("1cpp.dll") дало по самым тормозным местам конфигурации буст по скорости 30-60%.
Это просто феноменально! Djelf, огромное спасибо за вразумление!

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

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


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

Боли добавляло ещё и то, что СоздатьОбъект в разделенном режиме работал в 10 раз медленнее, чем в монопольном. Ведь никакого обращение к данным, почему такое падение скорости, непонятно. Так что в разделенном режиме прибавка в скорости ещё больше.
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Злоп от 27 октября 2024, 14:46
С ТЗ, вложенными итд - гораздо удобно работать с применением ИТЗ.
с ИТЗ есть, например, и такие вещи как
ВнутреннееСоединение / InnerJoin
ЛевоеСоединение / LeftJoin
ПравоеСоединение / RightJoin
ПолноеСоединение / FullJoin
Объединить / Merge
Пересечение / Conjunction
Разность / Difference
.
https://1cpp.ru/docum/html/IndexedTable.html
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Злоп от 27 октября 2024, 23:38
С ТЗ еще есть прикол, что можно несколько колонок с одинаковым Идентификатором вкорячить... А потом сидишь колупаешься что за хрень.. Пока не визуализируешь.. ;-)
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Djelf от 28 октября 2024, 16:02
Не помню как давно отказался от ТЗ в пользу ИТ, но очень давно...
Поначалу загонял запросы 1С в ИТ и там уже объединял разными sql-подобными способами.
Потом появилось 1csqlite и необходимость в этом исчезла (почти все можно сделать на этапе запроса).
Отображение на форме... Так я от ТЗ на форме тоже давно отказался, с ТП работать значительно комфортнее.
Это не относится напрямую к данной теме.

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

30-60 Это очень хорошо! Тем более что "за-бесплатно".
Срочно выбивай премию за ускорение, ибо через месяц-два захотят ускорить еще раза в 2-3  ;D
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Arbuz от 28 октября 2024, 17:45
Цитата: Djelf от 28 октября 2024, 16:02Потом появилось 1csqlite и необходимость в этом исчезла
Я уже дошёл до того, что почти не кручу тз'шки в циклах — УложитьТЗ и дальше запросами. Опустился до того, что уже математику в селектах считаю  ;D

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

    ИТЗ.ЗаполнитьКолонкуПоАлгоритму(, 1, _вм);
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Ветер в поле от 29 октября 2024, 18:16
Не всегда ИТЗ использовать быстрее ТЗ. При сотнях тысячах строк ИТЗ вызывает очень неприятные подтормаживания при уничтожении переменной - закрываешь форму с отчетом и программа подвисает на несколько секунд.
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Злоп от 29 октября 2024, 18:55
да, очень неприятно ;-)
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: trdm от 29 октября 2024, 19:22
то же мне проблема...
Название: Re: Создание таблицы значений и списка значений через ЗначениеИзСтрокиВнутр
Отправлено: Злоп от 03 ноября 2024, 01:07
Цитата: Arbuz от 28 октября 2024, 17:45ИТЗ.ЗаполнитьКолонкуПоАлгоритму(, 1, _вм);
А зачем делать через ВМ? Просто функцию (обычную из доступного контекта), которая возвращает числовое значение - нельзя ?