К таблице значений добавить вторую таблицу значений. Нужен оптимальный метод.

1. Aleksey_Abramov 13.09.23 10:54 Сейчас в теме
Сейчас код выглядит так:
РезультатЗапроса = Запрос.Выполнить();
ТЗ_Добавляемая = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТЗ_Добавляемая Цикл
    НоваяСтрока = ТЗ_Исходная.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
конеццикла;

Цикл проходит по нему 500 тысяч раз и это занимает очень много времени. Как быстрее можно объединить две таблицы? Пока идея такая - запросом, добавляя описание временных таблиц? Но может быть есть метод интереснее? Не хочу изобретать велосипед.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Aleksey_Abramov 13.09.23 11:51 Сейчас в теме
(2) Тоже интересный способ.
9. starik-2005 3166 13.09.23 16:47 Сейчас в теме
(1)
запросом
Запрос будет работать не всегда быстрее, ибо:
1. Он передает все данные на сервер СУБД, там объединяет и выгружает назад в виде таблицы. Т.е. это нагрузка на сервер и сеть, если там не шаредмемори и СУБД на одном сервере с 1С. Для файловой базы имеет какой-то смысл, но 500к строк и файловая база - это какая-то жесть.
2. Сервер СУБД может быть загружен активно работающими юзерами.

В части реализации, то перенос в одну строку всего цикла часто ускоряет процесс. Т.е. следует писать так:
Для каждого Ст ИЗ ТаблицаПоменьше Цикл ЗаполнитьЗначенияСвойств(ТаблицаПобольше.Добавить(), Ст) КонецЦикла;
10. Aleksey_Abramov 13.09.23 17:15 Сейчас в теме
(9)
В части реализации, то перенос в одну строку всего цикла часто ускоряет процесс

Каким образом запись кода в одну строку ускоряет процесс? Где это описано?
11. Sashares 33 13.09.23 17:55 Сейчас в теме
(10)
Каким образом запись кода в одну строку ускоряет процесс? Где это описано?

Да везде. Воспользуйтесь поиском.
Сделайте замер, если не верите.
12. starik-2005 3166 13.09.23 19:03 Сейчас в теме
(10)
Где это описано?
Официально - нигде. И работает не всегда. Но для циклов получается ощутимый прирост, т.к. не компилируются и не исполняются переходы строк, которые, с точки зрения ВМ 1С, исполняющей код, требуют для исполнения некоторое время. На циклах 100к эффект точено ощущается.
4. Aleksey_Abramov 13.09.23 11:53 Сейчас в теме
В общем быстро "сварил на коленке" код, объединяющий две таблицы с одинаковыми колонками, протестировал на больших таблицах, результат почти в 2 раза быстрее. Позже буду на рабочей базе проверять, возможно отпишусь.
Вот код:
&НаСервере
Процедура ВыполнитьОбъединениеТаблицНаСервере()
    
    Таблица1 = ПолучитьТаблицу1();
    Таблица2 = ПолучитьТаблицу2();
    РезультирующаяТаблица = ОбъединитьТаблицыСИдентичнымиКолонками(Таблица1, Таблица2);
    
КонецПроцедуры

&НаСервере
Функция ОбъединитьТаблицыСИдентичнымиКолонками(Таблица1, Таблица2)

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ *
        |Поместить ВТ_Таблица1
        |ИЗ
        |    &Таблица1 КАК Таблица1;
        |Выбрать *
        |Поместить ВТ_Таблица2
        |ИЗ
        |    &Таблица2 КАК Таблица2;
        |Выбрать *
        |ИЗ ВТ_Таблица1
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |Выбрать *
        |ИЗ ВТ_Таблица2";
    
    Запрос.УстановитьПараметр("Таблица1", Таблица1);
    Запрос.УстановитьПараметр("Таблица2", Таблица2);
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Возврат РезультатЗапроса;
    
КонецФункции
Показать
5. Sashares 33 13.09.23 12:10 Сейчас в теме
(4)
результат почти в 2 раза быстрее

Чем какой вариант?

Может перед выбором способа реализации стоит хотя бы проверить варианты?
6. SlavaKron 13.09.23 16:06 Сейчас в теме
ЗначениеВСтрокуВнутр не предлагать? Хотя там будут довольно большие расходы на преобразование в строку.
7. пользователь 13.09.23 16:14
Сообщение было скрыто модератором.
...
8. SlavaKron 13.09.23 16:43 Сейчас в теме
(7) Там СУБД, видимо на одной машине с сервером приложений. ТС нашёл решение, наши обдумывания ни к чему.
13. karamazoff 124 13.09.23 19:59 Сейчас в теме
(7)он точно 1с-ник и не плохой!
14. пользователь 13.09.23 20:00
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот