Временные таблицы. Работа с Табличной Частью. Процедура РаботаСТабличнойЧастьюЧерезВременнуюТаблицу(ТабличнаяЧасть) //Для того, чтобы передать таблицу значений в качестве значения временной таблицы в запрос, //поля этой тз должны быть типизированы ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации")); ТЗ.Колонки.Добавить("Код" , Новый ОписаниеТипов("Строка")); ТЗ = ТабличнаяЧасть.Выгрузить();//Формируем таблицу значений //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 Цикл Сообщить("----------------------------------------------------------------------------------"); Результат = МассивРезультатов[инд]; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Строка(Выборка.Ссылка)); КонецЦикла; КонецЦикла; КонецПроцедуры
|