1С 8.x Управляемое приложение 1С 7.7. Бухучет Статьи Ссылки
1С 8.x arrow 1С 8.x arrow Узелки на память arrow Работа с запросами: временные таблицы, пакеты
Работа с запросами: временные таблицы, пакеты Печать

Временные таблицы. Работа с Табличной Частью. 

 

Процедура РаботаСТабличнойЧастьюЧерезВременнуюТаблицу(ТабличнаяЧасть)
 
 
 //Для того, чтобы передать таблицу значений в качестве значения временной таблицы в запрос,
 //поля этой тз должны быть типизированы
 
 ТЗ = Новый ТаблицаЗначений;
 ТЗ.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
 ТЗ.Колонки.Добавить("Код" , Новый ОписаниеТипов("Строка"));
 
 
 ТЗ = ТабличнаяЧасть.Выгрузить();//Формируем таблицу значений
 
 //1)
 //В менеджер временных таблиц передаем заданную таблицу значений
 Запрос = Новый Запрос;
 Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

 
 Выборка = ЗапросТМП.Выполнить().Выбрать();
 
 Пока Выборка.Следующий() Цикл
  Сообщить(Строка(Выборка.Организация));
 КонецЦикла;
 
 
 //3
 //Удаляем временную таблицу
 
 ЗапросУДАЛЕНИЕ = Новый Запрос;
 ЗапросУДАЛЕНИЕ.МенеджерВременныхТаблиц = МенеджерВТ;
 ТекстЗапросаУДАЛЕНИЕ = "УНИЧТОЖИТЬ ВТ_ТабличнаяЧасть";
 ЗапросУДАЛЕНИЕ.Текст = ТекстЗапросаУДАЛЕНИЕ;
 ЗапросУДАЛЕНИЕ.Выполнить();
 
 
КонецПроцедуры

 

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

 

Использование в запросе временной таблицы из другого запроса 

 

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

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

 

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

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

 

 ПАКЕТНЫЕ ЗАПРОСЫ

 

Цитата из файла V8AddDoc81.htm 

 

Платформа 1С:Предприятие 8.1 позволяет работать с пакетами запросов. В пакетном запросе тексты запросов разделяются символом «;». Запросы исполняются последовательно, при этом временные таблицы, которые были созданы во время исполнения какого-либо запроса будут существовать до окончания исполнения всего пакета запроса или до исполнения в пакете запроса, уничтожающего данную временную таблицу. Например:

Запрос = Новый Запрос;

Запрос.Текст=

"ВЫБРАТЬ

| УчетНоменклатурыОстаткиИОбороты.Номенклатура,

| УчетНоменклатурыОстаткиИОбороты.КоличествоПриход,

| УчетНоменклатурыОстаткиИОбороты.КоличествоРасход,

| УчетНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток

|ПОМЕСТИТЬ УчетНоменклатуры

|ИЗ

| РегистрНакопления.УчетНоменклатуры.ОстаткиИОбороты(, , Авто, , ) КАК УчетНоменклатурыОстаткиИОбороты

|;

|

|ВЫБРАТЬ

| УчетНоменклатуры.Номенклатура,

| УчетНоменклатуры.КоличествоРасход,

| УчетНоменклатуры.КоличествоКонечныйОстаток

|ИЗ

| УчетНоменклатуры КАК УчетНоменклатуры

|;

 

Результат=Запрос.Выполнить();

Первый запрос создает временную таблицу, данные из которой используются во втором запросе.

Если объекту Запрос, исполняющему пакетный запрос, установлен менеджер временных таблиц, временные таблицы, которые не были уничтожены в рамках пакетного запроса, сохранятся в установленном менеджере. В тексте пакетного запроса возможно использование и уничтожение временных таблиц, которые существовали в установленном менеджере временных таблиц на момент запуска пакета на исполнение.
Метод ВыполнитьПакет()

Кроме метода Выполнить(), последовательно выполняющего все запросы пакета и возвращающего результат последнего запроса в пакете, платформа 1С:Предприятие 8 предоставляет еще один метод – ВыполнитьПакет(). Этот метод последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета в последовательности расположения запросов в тексте пакета. Результатом выполнения запроса на уничтожение временной таблицы является значение Неопределено, которое также помещается в массив результатов.

 

 

 

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

 

// ИСПОЛЬЗОВАНИЕ ПАКЕТА ЗАПРОСА С ВРЕМЕННОЙ ТАБЛИЦЕЙ

Процедура ИспользованиеПакетаЗапросаСВременнойТаблицей()
 
 Запрос = Новый Запрос;
 
  ТекстЗапроса = "ВЫБРАТЬ
  | НеУволенныеСотрудники.Сотрудник КАК Сотрудник
  |ПОМЕСТИТЬ ВТ_НеУволенныеСотрудники
  |ИЗ
  | (ВЫБРАТЬ РАЗЛИЧНЫЕ
  | СостоянияРаботниковОрганизаций.Сотрудник КАК Сотрудник
  | ИЗ
  | (ВЫБРАТЬ
  | РаботникиОрганизацийСрезПоследних.Организация КАК Организация,
  | РаботникиОрганизацийСрезПоследних.Регистратор КАК Регистратор,
  | РаботникиОрганизацийСрезПоследних.Период КАК Период,
  | РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
  | РаботникиОрганизацийСрезПоследних.Должность КАК Должность,
  | РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
  | РаботникиОрганизацийСрезПоследних.ОбособленноеПодразделение КАК ОбособленноеПодразделение,
  | РаботникиОрганизацийСрезПоследних.ПериодЗавершения КАК ПериодЗавершения,
  | РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния
  | ИЗ
  | РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, Организация = &Организация) КАК РаботникиОрганизацийСрезПоследних) КАК СостоянияРаботниковОрганизаций
  | ГДЕ
  | (СостоянияРаботниковОрганизаций.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
  | ИЛИ СостоянияРаботниковОрганизаций.ПериодЗавершения > СостоянияРаботниковОрганизаций.Период)
  | И СостоянияРаботниковОрганизаций.ПричинаИзмененияСостояния <> &ЭтоУвольнение) КАК НеУволенныеСотрудники
  |;
  |
  |////////////////////////////////////////////////////////////////////////////////
  |ВЫБРАТЬ
  | ФактическиеОтпускаОрганизаций.Период,
  | ФактическиеОтпускаОрганизаций.Сотрудник,
  | ФактическиеОтпускаОрганизаций.ДатаОкончания,
  | ФактическиеОтпускаОрганизаций.Количество
  |ИЗ
  | ВТ_НеУволенныеСотрудники КАК ВТ_НеУволенныеСотрудники
  | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
  | ПО ВТ_НеУволенныеСотрудники.Сотрудник = ФактическиеОтпускаОрганизаций.Сотрудник";
   
   
  Запрос.УстановитьПараметр("Организация" , Организация);
  Запрос.УстановитьПараметр("Период" ,КонецДня(РабочаяДата));
  Запрос.УстановитьПараметр("ЭтоУвольнение",Перечисления.ПричиныИзмененияСостояния.Увольнение);
   
  Запрос.Текст = ТекстЗапроса;
   
  Выборка = Запрос.Выполнить().Выбрать();
   
  Пока Выборка.Следующий() Цикл
   
  Сообщить(Строка(Выборка.Сотрудник) + " " + Строка(Выборка.ДатаОкончания) + " " + Строка(Выборка.ДатаОкончания));
   
  КонецЦикла;
   
    
КонецПроцедуры

 

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

//ИСПОЛЬЗОВАНИЕ ПАКЕТОВ ПОСЛЕДОВАТЕЛЬНЫХ ЗАПРОСОВ

//

Процедура ДействияФормыИспользованиеПакетаПоследовательныхЗапросов(Кнопка)
 
 Запрос = Новый Запрос;
 
 ТекстЗапроса = "ВЫБРАТЬ
  | НачислениеЗарплатыРаботникамОрганизаций.Ссылка
  |ИЗ
  | Документ.НачислениеЗарплатыРаботникамОрганизаций КАК НачислениеЗарплатыРаботникамОрганизаций
  |;
  |
  |////////////////////////////////////////////////////////////////////////////////
  |ВЫБРАТЬ
  | ЗарплатаКВыплатеОрганизаций.Ссылка
  |ИЗ
  | Документ.ЗарплатаКВыплатеОрганизаций КАК ЗарплатаКВыплатеОрганизаций";
   
   
 Запрос.Текст = ТекстЗапроса;  
   
 МассивРезультатов = Запрос.ВыполнитьПакет();
 
 Для Инд = 0 По МассивРезультатов.Количество()-1 Цикл
 
  Сообщить("----------------------------------------------------------------------------------");
  Результат = МассивРезультатов[инд];
  Выборка = Результат.Выбрать();
  Пока Выборка.Следующий() Цикл
   
  Сообщить(Строка(Выборка.Ссылка));
   
  КонецЦикла;
 
 
 КонецЦикла;
 
   
КонецПроцедуры