Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Коллеги, ваше мнение. Код такого вид имеет право на жизнь или это говнокод?

[Serg_1960, 18.02.21 - 12:49]
Коллеги, ваше мнение. Код такого вид имеет право на жизнь или это говнокод?
Я
   Галахад
 
18.02.21 - 10:46
[1C]

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("а", Новый ОписаниеТипов("Булево"));
    Таблица.Колонки.Добавить("б", Новый ОписаниеТипов("Строка"));
    
    НовСтр = Таблица.Добавить();
    НовСтр.а = Истина;
    НовСтр.б = "ббб";
    НовСтр = Таблица.Добавить();
    НовСтр.а = Ложь;
    НовСтр.б = "бббббб";
    
    
    Таблица2 = Новый ТаблицаЗначений;
    Таблица2.Колонки.Добавить("а", Новый ОписаниеТипов("Булево"));
    Таблица2.Колонки.Добавить("г", Новый ОписаниеТипов("Строка"));
    
    НовСтр = Таблица2.Добавить();
    НовСтр.а = Истина;
    НовСтр.г = "ууу";
    
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Таблица", Таблица);
    Запрос.УстановитьПараметр("Таблица2", Таблица2);
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ТаблицаДанных
    |ИЗ
    |    &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ТаблицаДанных2
    |ИЗ
    |    &Таблица2 КАК Таблица2
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    *
    |ИЗ
    |    ТаблицаДанных КАК ТаблицаДанных
    |        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаДанных2 КАК ТаблицаДанных2
    |        ПО ТаблицаДанных.а = ТаблицаДанных2.а";
    
    Таб = Запрос.Выполнить().Выгрузить();
    Таб.Колонки.Удалить("а1");


[/1C]
   ДенисЧ
 
1 - 18.02.21 - 10:47
   Fragster
 
2 - 18.02.21 - 10:48
а нафига тут субд дергать?
   H A D G E H O G s
 
3 - 18.02.21 - 10:48
Не имеет. Имена колонок и таблиц значений должны четко и однозначно передавать предметную суть.
   polosov
 
4 - 18.02.21 - 10:49
(3) Не обязательно. Может это одноразовая обработка.
   Галахад
 
5 - 18.02.21 - 10:51
Хм. А аргументировать?
   Галахад
 
6 - 18.02.21 - 10:51
(2) Это ж пример.
   Fragster
 
7 - 18.02.21 - 10:51
(4) обязательно. но, сдается мне, в (0) имена колонок синтетические для примера
   Галахад
 
8 - 18.02.21 - 10:58
(7) Конечно. На самом деле Колонок несколько больше, не говоря уж о строках.
   H A D G E H O G s
 
9 - 18.02.21 - 11:01
Я не понял, что спрашивает автор?
Можно ли соединять таблицы с помощью субд или с помощью сервера 1с?
Я думаю, не стоит использовать субд. Используй код. А в коде либо индексирование одной из таблиц, либо мердж.

Кроме того, SQL регистронезависим при работе со строками.
   Галахад
 
10 - 18.02.21 - 11:03
(9) В коде медленнее.
   Волшебник
 
11 - 18.02.21 - 11:03
говнокод детектед
   Галахад
 
12 - 18.02.21 - 11:04
(10) +
Ну или правильнее: в моем коде медленнее.
   Fragster
 
13 - 18.02.21 - 11:08
(12) таы просто не умеешь его готовить
   Garykom
 
14 - 18.02.21 - 11:11
(0) Науя?
   Галахад
 
15 - 18.02.21 - 11:12
(13) Наверное. А как быстрее?
   Garykom
 
16 - 18.02.21 - 11:13
(15) Сначала опиши что хочешь и какие граничные условия
Легко может получиться на больших табличках что заипешься ждать пока оно на субд и назад передается
   ptiz
 
17 - 18.02.21 - 11:14
(15) Покажи код и мы ткнем тебя в колонку, по которой ты не создал индекс. Или ты наименование колонки не указываешь в методе ТЗ.Найти()
   Bigbro
 
18 - 18.02.21 - 11:15
выглядит довольно бредово.
   Галахад
 
19 - 18.02.21 - 11:18
(16) Допустим есть 
Таблица1 - колонки 
   Справочник1, КоличествоА
Таблица2 - колонки
   Справочник1, КоличествоБ

В каждой по по 5000 записей.
Хочу получить 
Таблица3 - колонки
   Справочник1, КоличествоА, КоличествоБ
   Garykom
 
20 - 18.02.21 - 11:22
(19) Гыгыгыгы
Сначала слей в одну ТЗ а потом Свернуть()
Но учитывай что в некоторых версиях платформы 1С бага с тормозами если есть в ТЗ ссылки на Справочники и т.д.
   Галахад
 
21 - 18.02.21 - 11:26
(20) Запросом быстрее.
   Волшебник
 
22 - 18.02.21 - 11:34
(21) Это паразитная нагрузка на сервер. Эту тупую работу может выполнить клиентский компьютер.
При большой загруженности сервера он может уйти в себя.
   Hans
 
23 - 18.02.21 - 11:39
(0) Не вижу говнокода.
   Волшебник
 
24 - 18.02.21 - 11:40
(23) В запросе нет выборки из базы
   Галахад
 
25 - 18.02.21 - 11:41
(22) Ну а если код и так выполняется на сервере. Например регламентное задание.
   Волшебник
 
26 - 18.02.21 - 11:42
(25) Есть сервер 1С и сервер СУБД, два разных сервера
   Serg_1960
 
27 - 18.02.21 - 12:35
Эээ... чисто от скуки и спортивного интереса ради :)
Я могу быстренько набросать лаконичный (с десяток строк) универсальный алгоритм для объединения разнородных таблиц (с различными составом колонок).  Но только если кто-то потом согласится его протестировать на скорость на больших объёмах с другими алгоритмами (например, с запросом как у автора). Интересно же проверить идею :)
   Галахад
 
28 - 18.02.21 - 13:17
(27) Да легко. Самому интересно.
   Fragster
 
29 - 18.02.21 - 13:34
(28) сортируешь обе таблицы по ключам сопоставления, далее в один проход делаешь третью таблицу
   Малыш Джон
 
30 - 18.02.21 - 13:42
(29) а если исходный порядок надо сохранить? предварительно добавлять поле для сохранения порядка?
 
 Рекламное место пустует
   Малыш Джон
 
31 - 18.02.21 - 13:47
(27) алгоритм, я думаю, тут все смогут придумать. Проблемы две: 1) каким бы наглядным(не синоним слову "лаконичный") он не был, все равно тому, кто будет после тебя, нужно будет некоторое время, чтобы сообразить, что ты такое сделал (а запрос понимается сходу) и б) он будет медленнее варианта с запросом, особенно на больших объемах.
У варианта с запросом, естественно, свои недостатки
   fisher
 
32 - 18.02.21 - 14:04
(0) Ну, такое... Лично на меня такой код действует как лимон, ибо по ресурсам очевидный оверкил. Есть варианты когда такой подход допустим и когда не очень. Я так никогда не делаю, ибо первые случаи имеют тенденцию плавно и незаметно перетекать во вторые плюс чувство прекрасного не позволяет.
Многие считают иначе. В основном те, кто избалован высокоуровневым API и у кого баланс между простотой кода и эффективностью сильно смещен в первое.
   H A D G E H O G s
 
33 - 18.02.21 - 14:09
(30) Делаешь копии таблиц
   VladZ
 
34 - 18.02.21 - 14:14
(0) Моё мнение: можно использовать в определенных ситуациях.

У меня такой вопрос: почему при получении первой части данных (первая таблица) мы не могли сразу получить вторую часть запросом? В чем сложность?
   vi0
 
35 - 18.02.21 - 14:17
(6) встречный вопрос - запрос в цикле имеет право на жизнь?
   Вафель
 
36 - 18.02.21 - 14:23
тут нужен мердж
самому такое писать влом ибо нужно быть очень аккуратным
   Garykom
 
37 - 18.02.21 - 14:24
(35) иногда это быстрее
например если распараллелить цикл по 50 фоновым на 20+ ядерном серваке
   vi0
 
38 - 18.02.21 - 14:27
(37) ну вот и ответ на вопрос (0)
   H A D G E H O G s
 
39 - 18.02.21 - 14:40
Запросом 44 милисекунды
Кодом 303
Таблица1=Новый ТаблицаЗначений;
    Таблица1.Колонки.Добавить("КолонкаСвязи",Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
    Таблица2=Таблица1.СкопироватьКолонки();
    ГенераторСЧ=Новый ГенераторСлучайныхЧисел();
    Для Счетчик=1 По 10000 Цикл
        НоваяСтрока=Таблица1.Добавить();
        НоваяСтрока.КолонкаСвязи=ГенераторСЧ.СлучайноеЧисло(0,50000);
        НоваяСтрока=Таблица2.Добавить();
        НоваяСтрока.КолонкаСвязи=ГенераторСЧ.СлучайноеЧисло(0,50000);
    КонецЦикла;
    
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    Таблица1.КолонкаСвязи КАК КолонкаСвязи
    |ПОМЕСТИТЬ Таблица1
    |ИЗ
    |    &Таблица1 КАК Таблица1
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    Таблица2.КолонкаСвязи КАК КолонкаСвязи
    |ПОМЕСТИТЬ Таблица2
    |ИЗ
    |    &Таблица2 КАК Таблица2
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    Таблица1.КолонкаСвязи КАК КолонкаСвязи,
    |    Таблица2.КолонкаСвязи КАК КолонкаСвязиТаблицы2
    |ИЗ
    |    Таблица1 КАК Таблица1
    |        ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
    |        ПО Таблица1.КолонкаСвязи = Таблица2.КолонкаСвязи";
    
    Запрос.УстановитьПараметр("Таблица1",Таблица1);
    Запрос.УстановитьПараметр("Таблица2",Таблица2);
    ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Результат=Запрос.Выполнить().Выгрузить();
    ВремяОкночания=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Запросом "+Строка(ВремяОкночания-ВремяНачала));
    
    ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Таблица1.Сортировать("КолонкаСвязи");
    Таблица1.Колонки.Добавить("КолонкаСвязиТаблицы2");
    Таблица2.Сортировать("КолонкаСвязи");
    ИндексТаблицы1=0;
    ИндексТаблицы2=0;
    Пока Истина Цикл
        СтрокаТаблицы1=Таблица1[ИндексТаблицы1];
        СтрокаТаблицы2=Таблица2[ИндексТаблицы2];
        Если СтрокаТаблицы1.КолонкаСвязи>=СтрокаТаблицы2.КолонкаСвязи Тогда
            ИндексТаблицы2=ИндексТаблицы2+1;
            Если СтрокаТаблицы1.КолонкаСвязи=СтрокаТаблицы2.КолонкаСвязи Тогда
                СтрокаТаблицы1.КолонкаСвязиТаблицы2=СтрокаТаблицы2.КолонкаСвязи;
            КонецЕсли;
        Иначе
            ИндексТаблицы1=ИндексТаблицы1+1;
        КонецЕсли;
        Если ИндексТаблицы1>= Таблица1.Количество() Тогда
            Прервать;
        КонецЕсли;
        Если ИндексТаблицы2>= Таблица2.Количество() Тогда
            Прервать;
        КонецЕсли;        
    КонецЦикла;
    ВремяОкночания=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Кодом "+Строка(ВремяОкночания-ВремяНачала));
   H A D G E H O G s
 
40 - 18.02.21 - 14:41
Плата за плохую математику 1С. В Дельфи было бы быстрее кодом.
   lEvGl
 
41 - 18.02.21 - 14:41
в общем случае запросом быстрее и удобнее писать, при написании обходов циклами как раз и получается говнокод, даже визуально пока а б ц цикл н + 1 и остальные Стр и подобное. быстродействие будет зависеть от контекста выполнения, запрос всегда на субд, код на клиенте или сервере приложения, что мощнее по железу, то и будет быстрее. все от конкретной ситуации загруженности железа зависит.
поддержу (23)
   lEvGl
 
42 - 18.02.21 - 14:42
(34) ну это прозрачный пример, я так понимаю
   H A D G E H O G s
 
43 - 18.02.21 - 14:43
Потери размазаны по операциям сравнения, получению строки по индексу, и, удивительно, на сортировку.
http://prntscr.com/zz17qo
   lEvGl
 
44 - 18.02.21 - 14:44
(40) 1с это в принципе производная от более низкоуровневых языков
   H A D G E H O G s
 
45 - 18.02.21 - 14:44
Ну и СУБД у меня не нагружена и tempdb на SSD (а скорее, в памяти).
   lEvGl
 
46 - 18.02.21 - 14:46
(45) в этом конкретика ситуации и есть
те, кто топит за разгрузку субд видимо сталкивались с проблемами в этой части. они есть у всех, но тут сталкивались видимо особенно остро
   H A D G E H O G s
 
47 - 18.02.21 - 14:46
Забавно, но SQL соединил через hashmatch
   Garykom
 
48 - 18.02.21 - 14:48
(39) У тебя "кодом" говно какое то
   H A D G E H O G s
 
49 - 18.02.21 - 14:48
А причина, кстати, в том, что теперь 1С вставляет ТЗ в ВТ через bulk insert, а раньше просто через Insert
   H A D G E H O G s
 
50 - 18.02.21 - 14:49
Жить стало лучше, жить стало веселее, а твое знания внезапно устарели, а чем 1С даже не уведомила.
   H A D G E H O G s
 
51 - 18.02.21 - 14:49
Так что код автора теперь имеет право на жись.
И, пожалуй, я связывать ТЗ теперь буду на сервере
   Garykom
 
52 - 18.02.21 - 14:50
(48)+ Сделай плиз просто как в (20)
Все записи из двух ТЗ в одну новую ТЗ из 3-х колонок Справочник1, КоличествоА, КоличествоБ
Пиши 0 где нет значения а затем Свернуть
   H A D G E H O G s
 
53 - 18.02.21 - 14:50
(51) на сервере СУБД
   H A D G E H O G s
 
54 - 18.02.21 - 14:50
(52) Держи, там немного
https://yadi.sk/d/5gcAqwEYTrvsig
   ИС-2
 
55 - 18.02.21 - 14:53
(10) наоборот, в если помещаем таблицы в запрос, то получается медленее. Делал специально опыты несколько лет назад
   lEvGl
 
56 - 18.02.21 - 14:55
(39) вот вот, про такие коды я и говорю, индекс шминдекс + 1 ><= и остальные знаки "препинания"
Пока Истина Цикл
        СтрокаТаблицы1=Таблица1[ИндексТаблицы1];
        СтрокаТаблицы2=Таблица2[ИндексТаблицы2];
        Если СтрокаТаблицы1.КолонкаСвязи>=СтрокаТаблицы2.КолонкаСвязи Тогда
            ИндексТаблицы2=ИндексТаблицы2+1;

и это пишет человек, который имеет опыт, интересуется производительностью и технической частью, а если это студент или кому пофигу на все это, то решение этой же задачи в коде будет иметь такой унылый вид, что всегда проще написать самому заново
   H A D G E H O G s
 
57 - 18.02.21 - 14:56
(56) Это типовой mergejoin, типовее нет, какие вопросы то?
   lEvGl
 
58 - 18.02.21 - 15:01
(57) джоин кодовый, такой кодовый.. вопросы к читабельности и проблемности разбора этих "логик", которые там творятся, в (0) типовой запрос через вт и прозрачность на высоте и количество текста минимум (это про запрос. там даже создание ТЗ кодом занимает места больше чем, сам запрос)
   lEvGl
 
59 - 18.02.21 - 15:02
(57) ну я к тому что кодом лучше и не получится, если только не озадачиться именно этим
   fisher
 
60 - 18.02.21 - 15:12
(43) Ты протестил наихудший случай, которых на практике фактически не будет (поэтому у тебя почти 20000 итераций при 10000 строк в таблицах).
Во-вторых, почему ты не включил в замер времени выполнения запроса передачу таблиц на сервер? Плюс это время будет расти при увеличении размеров строк таблиц.
(51) Даже при наличии выигрыша по скорости, для реально больших таблиц (не только по количеству строк, но и по размеру строки) будут расти и накладные расходы на сервере СУБД, ухудшая его интегральную производительность.
 
 Рекламное место пустует
   fisher
 
61 - 18.02.21 - 15:18
Ну и плюс утилизация сетки, если по серверам разнесено.
   Малыш Джон
 
62 - 18.02.21 - 15:18
(60)
1) Почему наихудший? Случайным образом заполненные таблицы. Почему такого на практике не будет?
2) ну вон же присланы данные замера производительности. По сравнению с временем выполнения запроса - затраты на передачу таблиц нулевые
3) понятно, что будут расти нагрузка на сервер. Вопрос на сколько: На 10 - 20 - 50% или на 0.00001%?
   lEvGl
 
63 - 18.02.21 - 15:19
(60)при реально больших таблицах ресурсы будут расти и на сервере приложений, не говоря о клиенте
   fisher
 
64 - 18.02.21 - 15:24
(62)
1) в реальности ты вряд ли будешь джойнить таблицы, в которых ни одного ключа не совпадает
2) я бы все-таки передвинул инициализацию времени начала замера действительно в самое начало, чтобы исключить возможные косяки замера производительности
   Почему 1С
 
65 - 18.02.21 - 15:30
(39) Почему в
Если СтрокаТаблицы1.КолонкаСвязи>=СтрокаТаблицы2.КолонкаСвязи Тогда

не двигается индекс таблицы 1 при равенстве ключей?
   fisher
 
66 - 18.02.21 - 15:33
(62)
3) в том-то и дело, что это проблематично спрогнозировать, если начать применять такой подход повсеместно.
   Почему 1С
 
67 - 18.02.21 - 15:33
(0) Не знаю говнокод или нет, но такой поход использую не только для соединения таблиц, но и построения итогов (иерархий) по таблицам.
   Serg_1960
 
68 - 18.02.21 - 15:35
(28) Ой, sorry. Я вышел с ветки и отвлёкся работой :)
Обещанный смешной (но рабочий) алгоритм:

    // заполнение таблиц для примера

    
    Т1 = Новый ТаблицаЗначений;
    Т1.Колонки.Добавить("а", Новый ОписаниеТипов("Булево"));
    Т1.Колонки.Добавить("б", Новый ОписаниеТипов("Число"));
    
    НовСтр = Т1.Добавить();
    НовСтр.а = Истина;
    НовСтр.б = 1;
    НовСтр = Т1.Добавить();
    НовСтр.а = Ложь;
    НовСтр.б = 2;
    
    
    Т2 = Новый ТаблицаЗначений;
    Т2.Колонки.Добавить("а", Новый ОписаниеТипов("Булево"));
    Т2.Колонки.Добавить("г", Новый ОписаниеТипов("Число"));
    
    НовСтр = Т2.Добавить();
    НовСтр.а = Истина;
    НовСтр.г = 3;
    НовСтр = Т2.Добавить();
    НовСтр.а = Ложь;
    НовСтр.г = 4;
    
    // Собственно говоря сам алгоритм "объединения" таблиц

    
    Т3 = ?(Т1.Количество() > Т2.Количество(), Т1.Скопировать(), Т2.Скопировать());
    Тх = ?(Т1.Количество() > Т2.Количество(), Т2.Скопировать(), Т1.Скопировать());
    Для к = 1 По Тх.Количество() Цикл Т3.Вставить(0); КонецЦикла;
    
    Для к = 0 По Тх.Колонки.Количество()-1 Цикл
        Имя = Тх.Колонки[к].Имя;
        Если Т3.Колонки.Найти(Имя) = Неопределено Тогда
            Т3.Колонки.Добавить(Имя, Тх.Колонки[к].ТипЗначения);
        КонецЕсли;
        Т3.ЗагрузитьКолонку(Тх.ВыгрузитьКолонку(Имя),Имя);
    КонецЦикла;
    
    // чисто для примера работа с "объединенной" таблицей

    
    Т3.Свернуть("а","б,г");
    Т3.ВыбратьСтроку();
   Вафель
 
69 - 18.02.21 - 16:00
сдается мне что в коде основная проблема это сортировка таблиц
   Garykom
 
70 - 18.02.21 - 16:00
(54)
Запросом 157
Кодом 347

"связывать ТЗ теперь буду на сервере СУБД" +1
   Garykom
 
71 - 18.02.21 - 16:02
(70)+ Точнее так
Кодом 631
Запросом 157
Моим кодом 357


&НаСервереБезКонтекста
Процедура ТестированиеНаСервере()
    Таблица1=Новый ТаблицаЗначений;
    Таблица1.Колонки.Добавить("КолонкаСвязи",Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
    Таблица1.Колонки.Добавить("КолонкаЗначения",Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
    Таблица2=Таблица1.СкопироватьКолонки();
    ГенераторСЧ=Новый ГенераторСлучайныхЧисел();
    Для Счетчик=1 По 10000 Цикл
        НоваяСтрока=Таблица1.Добавить();
        НоваяСтрока.КолонкаСвязи=ГенераторСЧ.СлучайноеЧисло(0,50000);
        НоваяСтрока.КолонкаЗначения=ГенераторСЧ.СлучайноеЧисло(0,500);
        НоваяСтрока=Таблица2.Добавить();
        НоваяСтрока.КолонкаСвязи=ГенераторСЧ.СлучайноеЧисло(0,50000);
        НоваяСтрока.КолонкаЗначения=ГенераторСЧ.СлучайноеЧисло(0,500);
    КонецЦикла;
    
    ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    Таблица1.КолонкаСвязи КАК КолонкаСвязи,
    |    Таблица1.КолонкаЗначения КАК КолонкаЗначения
    |ПОМЕСТИТЬ Таблица1
    |ИЗ
    |    &Таблица1 КАК Таблица1
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    Таблица2.КолонкаСвязи КАК КолонкаСвязи,
    |    Таблица2.КолонкаЗначения КАК КолонкаЗначения
    |ПОМЕСТИТЬ Таблица2
    |ИЗ
    |    &Таблица2 КАК Таблица2
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    Таблица1.КолонкаСвязи КАК КолонкаСвязи,
    |    Таблица1.КолонкаЗначения КАК КолонкаЗначения1,
    |    Таблица2.КолонкаЗначения КАК КолонкаЗначения2
    |ИЗ
    |    Таблица1 КАК Таблица1
    |        ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
    |        ПО Таблица1.КолонкаСвязи = Таблица2.КолонкаСвязи";
    
    Запрос.УстановитьПараметр("Таблица1",Таблица1);
    Запрос.УстановитьПараметр("Таблица2",Таблица2);
    //ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();

    Результат=Запрос.Выполнить().Выгрузить();
    ВремяОкночания=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Запросом "+Строка(ВремяОкночания-ВремяНачала));
    
    ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Таблица1.Сортировать("КолонкаСвязи");
    Таблица1.Колонки.Добавить("КолонкаСвязиТаблицы2");
    Таблица2.Сортировать("КолонкаСвязи");
    ИндексТаблицы1=0;
    ИндексТаблицы2=0;
    Пока Истина Цикл
        СтрокаТаблицы1=Таблица1[ИндексТаблицы1];
        СтрокаТаблицы2=Таблица2[ИндексТаблицы2];
        Если СтрокаТаблицы1.КолонкаСвязи>=СтрокаТаблицы2.КолонкаСвязи Тогда
            ИндексТаблицы2=ИндексТаблицы2+1;
            Если СтрокаТаблицы1.КолонкаСвязи=СтрокаТаблицы2.КолонкаСвязи Тогда
                СтрокаТаблицы1.КолонкаСвязиТаблицы2=СтрокаТаблицы2.КолонкаСвязи;
            КонецЕсли;
        Иначе
            ИндексТаблицы1=ИндексТаблицы1+1;
        КонецЕсли;
        Если ИндексТаблицы1>= Таблица1.Количество() Тогда
            Прервать;
        КонецЕсли;
        Если ИндексТаблицы2>= Таблица2.Количество() Тогда
            Прервать;
        КонецЕсли;        
    КонецЦикла;
    ВремяОкночания=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Кодом "+Строка(ВремяОкночания-ВремяНачала));
    
    
    // Моим кодом

    ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Таблица3=Новый ТаблицаЗначений;
    Таблица3.Колонки.Добавить("КолонкаСвязи",Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
    Таблица3.Колонки.Добавить("КолонкаЗначения1",Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
    Таблица3.Колонки.Добавить("КолонкаЗначения2",Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
    
    Для Каждого ТекСтр Из Таблица1 Цикл
        НовСтр = Таблица3.Добавить();
        НовСтр.КолонкаСвязи = ТекСтр.КолонкаСвязи;
        НовСтр.КолонкаЗначения1 = ТекСтр.КолонкаЗначения;
        НовСтр.КолонкаЗначения2 = 0;
    КонецЦикла;
    
    Для Каждого ТекСтр Из Таблица2 Цикл
        НовСтр = Таблица3.Добавить();
        НовСтр.КолонкаСвязи = ТекСтр.КолонкаСвязи;
        НовСтр.КолонкаЗначения1 = 0;
        НовСтр.КолонкаЗначения2 = ТекСтр.КолонкаЗначения;
    КонецЦикла;
    
    Таблица3.Свернуть("КолонкаСвязи", "КолонкаЗначения1, КолонкаЗначения2");
    
    ВремяОкночания=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Моим кодом "+Строка(ВремяОкночания-ВремяНачала));
    
КонецПроцедуры

&НаКлиенте
Процедура Тестирование(Команда)
    ТестированиеНаСервере();
КонецПроцедуры


   H A D G E H O G s
 
72 - 18.02.21 - 16:05
(64) Ключи совпадают и довольно часто.
   Малыш Джон
 
73 - 18.02.21 - 16:05
(71) и теперь ещё сравнить результат-то один и тот же получился или нет))
   Малыш Джон
 
74 - 18.02.21 - 16:07
(71) кстати, для объединения можно использовать таблицу1, просто туда вставить нужное количество пустых строк, а потом поколоночно загрузить таблицу2. Получиться быстрее должно.
   H A D G E H O G s
 
75 - 18.02.21 - 16:07
(60) Ты реально думаешь, что ТЗ уходит на сервер в точке
УстановитьПараметр()
?
А не при Запрос.Выполнить()
?
   H A D G E H O G s
 
76 - 18.02.21 - 16:07
(74) Это не соединение по ключу
   Garykom
 
77 - 18.02.21 - 16:08
(75) Уходит да но полное время же хотим, время установки параметра + время передачи установленного на сервер
   H A D G E H O G s
 
78 - 18.02.21 - 16:09
(71) Что будет, если будут строковые ресурсы или ссылочные?
   Малыш Джон
 
79 - 18.02.21 - 16:09
(76) так и в (71) (в третьем варианте) тоже не соединение
   Garykom
 
80 - 18.02.21 - 16:10
(78) будет другой алгоритм
   Garykom
 
81 - 18.02.21 - 16:12
(80)+ Вместо Свернуть, будет Сортировать и цикл сравнивающий пары строк, перенося в новую ТЗ
   Малыш Джон
 
82 - 18.02.21 - 16:13
(78)
   - Товарищ Сталин, дошла информация, что маршал Рокоссовский, не состоя в браке с актрисой Серовой, открыто с ней сожительствует и всячески разлагается. Что делать будем?
   - Чьто будэм, чьто будэм... Завыдоват будэм!
   H A D G E H O G s
 
83 - 18.02.21 - 16:16
Запросом 157 у Гарри
Запросом 40 у Hadgehogs

Это все, что нужно знать о оборудовании Гарри на древних ксеонах.
   H A D G E H O G s
 
84 - 18.02.21 - 16:16
Вот что страшно
   H A D G E H O G s
 
85 - 18.02.21 - 16:17
Потом подключаешься к клиентам и теряешь драгоценные мгновения бесценной жизни, смотря на крутящееся колесико в ERP на 2.2 Ггц.
   Малыш Джон
 
86 - 18.02.21 - 16:18
(85) Человеку, не желающему терять драгоценные мгновения бесценной жизни, в принципе не рекомендуется связываться с ERP. На любом оборудовании.
   Garykom
 
87 - 18.02.21 - 16:20
(83) Это рабочий сервак на который я маты складываю
https://i.paste.pics/23acaba9bb778a9c5cc74f42b7abd7a5.png?trs=60174cc3ec6c8948da637408dbbd4706e227433d9d28e072a7bc087834a70180

Сча тестану на паре зионов
   fisher
 
88 - 18.02.21 - 16:21
Все равно не брошу работать с ТЗ "по месту" :)=
Вот еще, себе "руку сбивать" из-за тормозов интерпретатора, да еще сиквел обижать.
   Малыш Джон
 
89 - 18.02.21 - 16:23
Если надо смержить данных
Все равно на серв не брошу
Буду мержить их руками
Потому что я хороший
   H A D G E H O G s
 
90 - 18.02.21 - 16:24
(87) мммм., Silver, миленько.
   Garykom
 
91 - 18.02.21 - 16:24
(90) Виртуалка в облаке
   H A D G E H O G s
 
92 - 18.02.21 - 16:25
(91) Но ведь Silver, да?
А это твое облако или стороннее?
   Шоколадный глаз
 
93 - 18.02.21 - 16:27
(0) Любой код имеет право на жизнь, главное не показывай его заказчику.
   Garykom
 
94 - 18.02.21 - 16:28
(92) Чужое, Сотел

кста на моем рабочем инженернике i7-6400T
Запросом 127
Кодом 198
Моим кодом 114
   Garykom
 
95 - 18.02.21 - 16:29
(94) sql - Postgres
   Megas
 
96 - 18.02.21 - 16:31
(4)
Особенно в одноразовой обработке.
Потому что буквально через пару недель на рабочем столе лежит 12штук ВнешняяОбработка1 - 12,  с кнопокой "выполнить"
   Garykom
 
97 - 18.02.21 - 16:31
(94)+ На разогнанном 1650v2
Запросом 173
Кодом 168
Моим кодом 111
   Garykom
 
98 - 18.02.21 - 16:32
(97)+ Но это файловая, серверной там у меня не стоит
   H A D G E H O G s
 
99 - 18.02.21 - 16:39
(97) SQL - MSSQL, i5-8600k, 40 мсек.
   Garykom
 
100 - 18.02.21 - 16:40
(99) ты мой код запусти
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.