Имя: Пароль:
1C
1С v8
Объединение виртуальных таблиц.
,
0 Bon Jovi
 
24.09.20
18:07
Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Подскажите пожалуйста в следующем. Хочу написать запрос, который будет формироваться по ходу обхода цикла, то есть каждая строка будет добавлять часть кода. Проблема в том, что я хочу объединить очень много таблиц в одну (полей всего два и они общие, есть у всех таблиц). Но на сколько я понимаю, нельзя объединять виртуальные таблицы. То есть такой метод не работает и выдаёт ошибку "Содержимое объекта данных может быть выбрано только во временную таблицу":
ВЫБРАТЬ
    ТЗ.Элемент1 КАК Элемент1 ,
    ТЗ.Элемент2 КАК Элемент2
ИЗ
    &ТЗ КАК ТЗ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ТЗ2.Элемент1 ,
    ТЗ2.Элемент2
ИЗ
    &ТЗ2 КАК ТЗ2


Поделитесь информацией по этому поводу. Нужно именно таким способом, то есть каждая строка цикла должна добавить очередной кусок объединения.
1 shuhard
 
24.09.20
18:09
(0) дык помести во временную таблицу и объединяй
2 sqr4
 
24.09.20
18:10
ВЫБРАТЬ
    ТЗ.Элемент1 КАК Элемент1,
    ТЗ.Элемент2 КАК Элемент2
ПОМЕСТИТЬ т1
ИЗ
    &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗ2.Элемент1 КАК Элемент1,
    ТЗ2.Элемент2 КАК Элемент2
ПОМЕСТИТЬ т2
ИЗ
    &ТЗ2 КАК ТЗ2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    т1.Элемент1 КАК Элемент1,
    т1.Элемент2 КАК Элемент2
ИЗ
    т1 КАК т1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    т2.Элемент1,
    т2.Элемент2
ИЗ
    т2 КАК т2
3 Bon Jovi
 
24.09.20
18:11
(1) это понятно, но дело в том, что я могу поместить каждую таблицу из каждой строки цикла в таблицу, но как потом их объединить? Да, я приду к тому, что у меня будет 150 пакетов, которые будут хранить 150 временных таблиц, и как мне в конце, в самом последнем пакете ссылаться на каждый пакет, чтобы составить концовку запроса?
4 Bon Jovi
 
24.09.20
18:12
(2) такой же ответ как в (3) .
5 sqr4
 
24.09.20
18:27
(4) в цикле
6 Bon Jovi
 
24.09.20
18:30
(5) вы меня не поняли...
7 sqr4
 
24.09.20
18:34
(6) в первом цикле параллельно формируй верхнюю помещение ТЗ в виртуальные таблицы и последний пакет. Задача как по мне не сложна
8 PR
 
24.09.20
18:35
Какие же кретинские у людей решения, мама дорогая

(0) Если тебе не важно, считают ли тебя кретином, то выбирай из разных ТЗ, помещай в разные ВТ, потом выбирай из разных ВТ в одну выборку

А если ты готов закончить с кретинским прошлым, то просто предварительно помести все в одну ТЗ, а потом уже из нее выбирай запросом и не трахай наши мозг и чувство прекрасного
9 Bon Jovi
 
24.09.20
18:42
(8) Спасибо, учту Ваше пожелание.
10 Ёпрст
 
24.09.20
18:45
(0) если что, объединять через запрос - это одно из самых медленных решений
11 Bon Jovi
 
24.09.20
18:45
(7) Попробовал сделать так, обходя цикл формирую сразу 2 текста запроса: первый - обычный текст запроса, к которому добавляю из каждой строки цикла кусок текста, в котором передаю временную таблицу; второй - формирую концовку, также из каждой строки цикла беру текст, в которому хранится информация об объединении запроса. В самом конце, как вышел из цикла, формирую общий текст (добавляя к основному тексту запроса переменную со второй частью текста), и выполняю запрос всего один раз. Ответ получился нужный, но вот не знаю, не ярый ли костыль такая конструкция ...
12 Ёпрст
 
24.09.20
18:45
объединяй свои тз в коде.
13 Bon Jovi
 
24.09.20
18:46
(10) подскажите метод более быстрее, который объединит мне 100-1000 таблиц значений в одну?
14 PR
 
24.09.20
18:47
(13) Тебе уже хором все сказали, кодом объединяй
15 sqr4
 
24.09.20
18:50
Ильдарович делает так http://catalog.mista.ru/1c/articles/306536/ п 18
16 Ёпрст
 
24.09.20
18:52
(13) ну так, хотя бы

Для Каждого Строка Из Таблица0 Цикл ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Строка) КонецЦикла;
17 МихаилМ
 
24.09.20
21:01
(13) Этот код процентов на 30  
быстрее чем  добавить   ззс из (15)

адаптируйте его под много тзешность

//------------------------------------------------------------------------------------------------------------------------------

Функция УникальноеИмяКолонки() Экспорт
    Возврат "W"+СтрЗаменить(СокрЛП(Новый УникальныйИдентификатор),"-","");
КонецФункции //

//---------------------------------------------------------------------------------------------------------------------
Функция ПолучитьМассивВсехСтрок(ТЗ) Экспорт
Перем МассивТекСтрок;
Перем Отбор;
Перем ИмяВремКолонки;

    ИмяВремКолонки = УникальноеИмяКолонки();

    ТЗ.Колонки.Добавить(ИмяВремКолонки,Новый ОписаниеТипов("Булево"));
    Отбор = Новый Структура();
    Отбор.Вставить(ИмяВремКолонки,FALSE);
    МассивТекСтрок = ТЗ.НайтиСтроки(Отбор);
    ТЗ.Колонки.Удалить(ИмяВремКолонки);
    
Возврат МассивТекСтрок;    
КонецФункции // ПолучитьМассивВсехСтрок
//---------------------------------------------------------------------------------------------------------------------






Функция ОбъединитьТЗ_Через_МассивТекСтрок_Отбор_Добавить(Основа,Добавка)Экспорт
Перем МассивТекСтрок;
Перем НоваяОснова;
Перем ТекстрокаДобавки;


МассивТекСтрок = МодульНетленка1.ПолучитьМассивВсехСтрок(Основа);

Для Каждого ТекстрокаДобавки ИЗ Добавка Цикл
    МассивТекСтрок.Добавить(ТекстрокаДобавки);
КонецЦикла;    

НоваяОснова = Основа.Скопировать(МассивТекСтрок);
Основа = НоваяОснова;

Возврат TRUE;    
КонецФункции //ОбъединитьТЗ_Через_МассивТекСтрок_Отбор_Добавить
18 Ёпрст
 
24.09.20
23:30
(17) интересный подход, надо поиграться на досуге.
19 Ёпрст
 
24.09.20
23:31
Только непонятно, зачем в финале это:

НоваяОснова = Основа.Скопировать(МассивТекСтрок);
Основа = НоваяОснова;

раз уже через массив строк строки добавили ранее.. ?
20 МихаилМ
 
24.09.20
23:51
(19) к основе прибавляется добавка. поэтому новая тз копируется в основу. нужен был для унификации   тк в  добавить   ззс  онова "вырастает" . всего у меня штук 15 методов объединения тз . и в (17) не
всегда  самый эффективный .  для разного количества колонок и соотношения строк основы и добавки, и типов данных колонок  оптимальны разные методы.
21 МихаилМ
 
25.09.20
00:04
(18) поиграйтесь .. https://cloud.mail.ru/public/3WBf/3SGRGyqhJ
22 Ёпрст
 
25.09.20
02:37
(21) ага, спасибо
23 Bon Jovi
 
25.09.20
10:05
Немного ошибся (за что стыдно) ... Объединить не виртуальные, а временные таблицы...
24 Simod
 
25.09.20
11:03
В БСП: ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу()
Описание там же.
25 Bon Jovi
 
01.10.20
12:46
Вот как с этой задачей справился я:
ТекстЗапроса1 = ""; ТекстЗапроса2 = ""; Счётчик = 0;
    Для каждого СтрокаПараметра Из Параметры Цикл    
        
        Если НЕ ТипЗнч(ЗначениеИзСтрокиВнутр(СтрокаПараметра)) = Тип("ТаблицаЗначений") ИЛИ ЗначениеИзСтрокиВнутр(СтрокаПараметра).Количество() = 0 Тогда
            Продолжить;            
        КонецЕсли;    
        
        Счётчик = Счётчик + 1;
        
        ТекстЗапроса1 = ТекстЗапроса1 + "ВЫБРАТЬ ТЗ" + Счётчик + ".Номенклатура, ТЗ" + Счётчик + ".Склад ПОМЕСТИТЬ ТЗ" + Счётчик + " ИЗ &ТЗ" + Счётчик + " КАК ТЗ" + Счётчик + ";";        
        ТекстЗапроса2 = ТекстЗапроса2 + "ВЫБРАТЬ ТЗ" + Счётчик + ".Номенклатура, ТЗ" + Счётчик + ".Склад ИЗ ТЗ" + Счётчик + " КАК ТЗ" + Счётчик + "";
        
        Если Счётчик <> 1 Тогда
            ТекстЗапроса2 = СтрЗаменить(ТекстЗапроса2, "ВЫБРАТЬ ТЗ" + Счётчик, " ОБЪЕДИНИТЬ ВЫБРАТЬ ТЗ" + Счётчик);        
        КонецЕсли;
        
        Запрос.УстановитьПараметр("ТЗ" + Счётчик, ЗначениеИзСтрокиВнутр(СтрокаПараметра).Скопировать(, "Номенклатура, Склад"));                         
        
    КонецЦикла;      
    
    Если Счётчик = 0 Тогда
        Возврат;
    КонецЕсли;

    Запрос.Текст = ТекстЗапроса1 + ТекстЗапроса2;
26 МихаилМ
 
01.10.20
13:00
(25)
ну и объединяйте строки внутренние . для 2 колонок тз  будет раз в 50 быстрее чем ВАш код.
27 Bon Jovi
 
01.10.20
13:04
(26) Спорить не буду, не проверял. Но это лучший вариант из того, что мне предлагали выше...
28 TormozIT
 
гуру
01.10.20
13:31
Да что за болезнь такая у многих называть временные таблицы виртуальными? Надо выявить основных разносчиков и активно лечить их =)
29 МихаилМ
 
01.10.20
14:34
(28) 80% задающих здесь вопросы - случайные люди ит индустрии.
30 Bon Jovi
 
01.10.20
15:01
(28) Я уже извинился по этому поводу...
31 Bon Jovi
 
01.10.20
15:03
(29) Интересно, а какой процент людей, которые действительно дают дельные советы, а не такие как "объединить 100+ таблиц в одну путём сравнивания строк между одной таблицей с другой"...