Имя: Пароль:
1C
 
Временные таблицы в запросе
0 Merlin2006
 
04.12.07
10:20
Привет.

Конфигурация 8.1
Никто не подскажет как именно работать со временной таблицей.
Пример:

  МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; //создаем новый менеджер временных таблиц
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; //указываем запросу созданный менеджер временных таблиц
   Запрос.Текст= "ВЫБРАТЬ
                 |    ЖурналДляПользователей.Ссылка,
                 |    ЖурналДляПользователей.Номер,
                 |    ЖурналДляПользователей.Пользователь
                 |ПОМЕСТИТЬ ВременнаяТаблица
                 |ИЗ
                 |    ЖурналДокументов.ЖурналДляПользователей КАК ЖурналДляПользователей" ;

Дальше Я допустим хочу получить, не ссылку на документ, а имя документа в конфигураторе. Т.е. перебрать временную таблицу и поставить её в другой запрос.
Как это сделать?!
1 Merlin2006
 
04.12.07
10:32
up
2 Merlin2006
 
04.12.07
11:20
никто не знает?!
3 Ursus maritimus
 
04.12.07
11:21
Непонятно чётенадо
4 уродина
 
04.12.07
11:23
в program files есть такой файл с именем v8adddoc81, там все написано....
5 Merlin2006
 
04.12.07
11:44
Перебрать временную таблицу. Со своими условиями, которые Я могу получить только через обход элементов. А потом вставить эту таблицу в новый запрос.
6 Drx211
 
04.12.07
13:52
(5) И чего, ну так и пиши дальше ВЫБРАТЬ .... ИЗ ВременнаяТаблица ГДЕ ... и все будет работать на ура
7 Merlin2006
 
04.12.07
14:08
8 Merlin2006
 
04.12.07
14:08
Да это то всё ясно! Не понятно как работать с этой "Временной Таблице", НЕ в Запросе.
Простой пример. Я хочу узнать наименование документа как он задан в конфигураторе.
Через запрос Я этого сделать не могу. А через обход запроса можно. Т.е. получатеся такая конструкция

Пока ВыборкаДетали.Следующий() Цикл
  СтрокаТЗ.Имя=(СокрЛП(ВыборкаДетали.МояСсылка.Метаданные().Имя));
КонецЦикла;
И далее подставлять эту таблицу и сравнивать её с другим Запросом.
т.е. написать типа

Где ВторойЗапрос.Моёполе=ВременаяТаблица.ИзмененоеПоле;

И всё.
9 almar
 
04.12.07
14:15
>Не понятно как работать с этой "Временной Таблице", НЕ в Запросе
ИМХО, никак
10 Merlin2006
 
04.12.07
14:16
А тогда какой от них толк?! Если Я в принципе всё могу описать в одном запросе?!
11 Merlin2006
 
04.12.07
14:17
Ведь "МенеджерВременныхТаблиц" написано, что у него существует чтение и запись?!
12 Drx211
 
04.12.07
14:47
(0) Да-а-а - умение доносить свою мысль до окружающих - искусство..

По порядку:
1. Выгружаешь в ТЗ
2. Меняешь значения в колонках
3. Загружаешь обратно в запрос
4. И там делаешь что угодно... :)
13 Merlin2006
 
04.12.07
16:36
Можешь это продемонстрировать на простом примере?!
14 Бубузяка
 
04.12.07
23:22
Чисто учебный пример:
// 1. Создаем внешнюю таблицу
       МенеджерВТ = Новый МенеджерВременныхТаблиц;
       
       // 2. Создаем внешний источник данных.
       //        ТЗ можно набрать руками, но в учебных целях - это выгрузка результата запроса
       
       Запрос1 = Новый Запрос;
       Запрос1.Текст =
       "ВЫБРАТЬ
       |       РасходнаяНакладнаяСостав.Номенклатура,
       |       СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество,
       |       СУММА(РасходнаяНакладнаяСостав.Сумма) КАК Сумма
       |ИЗ
       |       Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
       |
       |СГРУППИРОВАТЬ ПО
       |       РасходнаяНакладнаяСостав.Номенклатура";
       
       ВнешнийИСточник = Запрос1.Выполнить().Выгрузить();
       
       // 3. Помещаем внешний источник данных в «менеджер временных таблиц»
       Запрос2 = Новый Запрос;
       Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
       Запрос2.Текст =
       "ВЫБРАТЬ
       |       Номенклатура,
       |       Количество,
       |       Сумма
       |ПОМЕСТИТЬ Расходы
       |ИЗ
       |       &ВнешнийИсточник";
       
       Запрос2.УстановитьПараметр("ВнешнийИсточник",ВнешнийИСточник);
       Запрос2.Выполнить();
       
       // 4. Получаем данные из справочника «Номенклатура», соединяя с данными внешнего источника
       Запрос3 = Новый Запрос;
       Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
       Запрос3.Текст =
       "ВЫБРАТЬ
                    |                   Код КАК КодНоменклатуры,
       |       Номенклатура,
       |       Количество,
       |       Сумма
       |ИЗ
       |       Расходы  
       |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура Как Товар
       |       ПО Товар.Ссылка = Номенклатура";
       
       РезультатЗапроса = Запрос3.Выполнить();

Понятно, что с ТЗ можно делать "что хочешь.."
15 Бубузяка
 
04.12.07
23:27
В последнем запросе таблица "Расходы" - это одна из таблиц в Менеджере ВТ. Т.к. структуру полей этой таблицы знаем, то и обращаемся к ним по имени. Конструктор запроса с МВТ не работает, потому что не знает структуру ее данных (это же необъект метаданных).
16 Merlin2006
 
05.12.07
10:47
Спасибо большое за пример. Но это не совсем то что Я хотел.
//
Возможно ли такой запрос написать с помощью "Временной таблицы"
           Запрос.УстановитьПараметр("НачДата",НачПериода);
           Запрос.УстановитьПараметр("КонДата",КонПериода);
           
           Для каждого Док из Метаданные.Документы Цикл
               
               Запрос.Текст= "ВЫБРАТЬ
               |    Документ" + Док.Имя + ".Ссылка МойДокумент,
               |    Документ" + Док.Имя + ".Дата МойДата
               
               |ИЗ
               |    Документ." + Док.Имя + " КАК " + "Документ" + Док.Имя + "
               |   Где Документ" + Док.Имя + ".Дата МЕЖДУ &НачДата И &КонДата  ";
               
               Результат = Запрос.Выполнить();
               Выборка = Результат.Выбрать();
               
               Пока Выборка.Следующий() Цикл
                   НоваяСтрока=ТЗ.Добавить();
                   НоваяСтрока.ДокументССЫлкаМой=Выборка.МойДокумент;
                   НоваяСтрока.ДокуИмя=Док.Имя;
                   Для каждого ТабличнаяЧасть из Док.ТабличныеЧасти цикл
                       НоваяСтрока.ИмяТч=ТабличнаяЧасть.имя;
                   КонецЦикла;
                   
               КонецЦикла;
           КонецЦикла;
17 Господин ПЖ
 
05.12.07
10:52
Бред какой-то...
18 Merlin2006
 
05.12.07
14:18
Почему Бред?!
Если Я хочу узнать имя документа, как он задан в конфигураторе?!
19 KAO111
 
05.12.07
14:49
Если только знать имя документа - может лучше сразу в запросе сделать  

ТекстЗапроса = "";
Для каждого Док из Метаданные.Документы Цикл
               
ТекстЗапроса = ТекстЗапроса+?(пустаястрока(ТекстЗапроса),"","объединить ")+"ВЫБРАТЬ
|    Ссылка КАК МойДокумент,
|    Дата КАК МойДата
|    " + Док.Имя + " КАК ДокуИмя
|ИЗ
|   Документ." + Док.Имя + " КАК " + "Документ" + Док.Имя + "
|   Где Дата МЕЖДУ &НачДата И &КонДата  ";

КонецЦикла;
20 Господин ПЖ
 
05.12.07
15:42
(18) А выгрузка ВСЕХ документов ВСЕХ типов в ТЗ с целью "узнать имена ТЧ" - это не бред?
21 Merlin2006
 
06.12.07
09:56
хорошо. Тогда как по твоему узнать имя табличной части?!
22 Денежко
 
06.12.07
10:01
Считаю, что топекСтаретр должен после (21) либо сменить НИК либо больше никада не писать....на 1С
23 Merlin2006
 
06.12.07
10:23
Это лично твоё мнение, но ответа до сих пор нету.....
24 Merlin2006
 
06.12.07
10:31
Вопрос то в том что можно конечно сделать и так
   
   Для каждого Док из Метаданные.Документы Цикл
           ТекстЗапроса = ТекстЗапроса+"ВЫБРАТЬ
               |    """+Док.Имя+""" КАК Наименование,
               |   Документ" + Док.Имя + ".Ссылка
               |ИЗ
               |    Документ." + Док.Имя + " КАК " + "Документ" + Док.Имя + "
               |   Где Документ" + Док.Имя + ".Дата МЕЖДУ &ДатаНачала И &ДатаКонца
               |";
               Для Каждого ТЧДокумента Из Док.ТабличныеЧасти Цикл
                       ТекстЗапроса = ТекстЗапроса+"ОБЪЕДИНИТЬ ВСЕ
                       |   ВЫБРАТЬ
                       |    """+Док.Имя+""" КАК Наименование,
                       |   Документ" + Док.Имя + ".Ссылка  
                       |ИЗ
                       |    Документ." + Док.Имя + "."+ТЧДокумента.Имя+" КАК " + "Документ" + Док.Имя + "
                       |   Где Документ" + Док.Имя + ".Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
                       |";
                   
              КонецЦикла;    
   КонецЦикла;    

Но как этого избежать?! С помощью временных таблиц?!
25 Господин ПЖ
 
06.12.07
10:47
Избежать можно, если пойти в лесники... Программирование не для вас.
26 Merlin2006
 
06.12.07
10:55
Ладно, где здесь ошибка?!
27 Господин ПЖ
 
06.12.07
10:56
(26) В ДНК наверное...
28 Merlin2006
 
06.12.07
11:00
Наверное да.
Только Я хотя бы что то пытаюсь делать. А не просто критикую........
И всё это уже превращается просто во  флуд какой-то.
Ведь задача проста. Как узнать имя табличной части документа так как он задан в конфигураторе?! С помощью временных таблиц или может возможен другой вариант.
29 Zlodeykin
 
06.12.07
11:03
Буквально 3 мин назад с этим работал вот из типовой УПП

// Функция возвращает имя табличной части, к которой принадлежит переданная строка
//
// Параметры
//  СтрокаТабличнойЧасти - ссылка на строку табличной части
//
// Возвращаемое значение:
//   Строка - имя табличной части, как оно задано в конфигураторе
//
Функция ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку(СтрокаТабличнойЧасти) Экспорт

   ИмяТабличнойЧасти = Метаданные.НайтиПоТипу(ТипЗнч(СтрокаТабличнойЧасти)).Имя;
   Возврат ИмяТабличнойЧасти;

КонецФункции // ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку()
30 Merlin2006
 
06.12.07
11:09
Спасибо!
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан