Временные таблицы - хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа
МенеджерВременныхТаблиц . Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "
ПОМЕСТИТЬ В ", например:
Код 1C v 8.х |ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.
Пример 1: Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:
Код 1C v 8.х Запрос= Новый Запрос( "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары" ) ;
Запрос. Выполнить( ) ;
ЗапросТМП= Новый Запрос( "ВЫБРАТЬ * ИЗ ВТТовары" ) ;
ЗапросТМП. МенеджерВременныхТаблиц= Запрос. МенеджерВременныхТаблиц;
ТЗ= ЗапросТМП. Выполнить( ) . Выгрузить( ) ;
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т. е. иметь тип. Вот пример, демонстрирующий это:
ТЗ= Новый ТаблицаЗначений( ) ;
ТЗ. Колонки. Добавить( "А" , Новый ОписаниеТипов( "Строка" ) ) ;
ТЗ. Колонки. Добавить( "Б" , Новый ОписаниеТипов( "Строка" ) ) ;
Стр= ТЗ. Добавить( ) ;
Стр. А= "А" ;
Стр. Б= "Б" ;
Стр= ТЗ. Добавить( ) ;
Стр. А= "А1" ;
Стр. Б= "Б1" ;
Запрос= Новый Запрос( "Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т" ) ;
Запрос. МенеджерВременныхТаблиц= Новый МенеджерВременныхТаблиц;
Запрос. УстановитьПараметр( "Таб" , ТЗ) ;
Запрос. Выполнить( ) ;
ЗапросТМП= Новый Запрос( "ВЫБРАТЬ * ИЗ ВТТаб" ) ;
ЗапросТМП. МенеджерВременныхТаблиц= Запрос. МенеджерВременныхТаблиц;
ТЗ1 = ЗапросТМП. Выполнить( ) . Выгрузить( ) ;
ТЗ1 . ВыбратьСтроку( ) ;
Вместо перечисления списка полей можно использовать "ВЫБРАТЬ * ".
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
Код 1C v 8.х Процедура ТипизацияТЗ(ТЗ) Экспорт
РезультатТЗ = новый ТаблицаЗначений;
Для Каждого Колонка из ТЗ. Колонки Цикл
Имя = Колонка. Имя;
МассивТипов = новый Массив( 1 ) ;
МассивТипов[0 ] = ТипЗнч( ТЗ[0 ][Имя]) ;
Описатель = новый ОписаниеТипов( МассивТипов) ;
РезультатТЗ. Колонки. Добавить( Имя, Описатель) ;
КонецЦикла ;
Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ. Добавить( ) ;
ЗаполнитьЗначенияСвойств( СтрокаРез, Строка) ;
КонецЦикла ;
ТЗ = РезультатТЗ. Скопировать( ) ;
КонецПроцедуры
Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой:
Код 1C v 8.х ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций. Период,
ВзаиморасчетыСРаботникамиОрганизаций. Физлицо,
ВзаиморасчетыСРаботникамиОрганизаций. СуммаВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций. Организация,
ВзаиморасчетыСРаботникамиОрганизаций. ПериодВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций. Регистратор
ПОМЕСТИТЬ РегВзаимРасч
ИЗ
РегистрНакопления. ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций. Период МЕЖДУ &ДатаН И &ДатаК
;
ВЫБРАТЬ
ЗарплатаКВыплатеОрганизацийЗарплата. Физлицо,
ЗарплатаКВыплатеОрганизацийЗарплата. Сумма,
ЗарплатаКВыплатеОрганизацийЗарплата. ВыплаченностьЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата. КомпенсацияЗаЗадержкуЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата. Ссылка
ПОМЕСТИТЬ ДокумЗарплКВыпл
ИЗ
Документ. ЗарплатаКВыплатеОрганизаций. Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
ГДЕ
ЗарплатаКВыплатеОрганизацийЗарплата. Ссылка. Дата МЕЖДУ &ДатаН И &ДатаК
;
ВЫБРАТЬ
РегВзаимРасч. Период,
РегВзаимРасч. Физлицо,
РегВзаимРасч. СуммаВзаиморасчетов,
ДокумЗарплКВыпл. Сумма,
ДокумЗарплКВыпл. ВыплаченностьЗарплаты,
ДокумЗарплКВыпл. КомпенсацияЗаЗадержкуЗарплаты
ИЗ
РегВзаимРасч КАК РегВзаимРасч
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл
ПО РегВзаимРасч. Регистратор = ДокумЗарплКВыпл. Ссылка
И РегВзаимРасч. Физлицо = ДокумЗарплКВыпл. Физлицо
;
УНИЧТОЖИТЬ РегВзаимРасч
;
УНИЧТОЖИТЬ ДокумЗарплКВыпл
Код 1C v 7.x xmldoc = CreateObject( "Msxml2.DOMDocument" ) ;
xmlDoc. loadXML( "<root/>" ) ;
nodeRoot = xmlDoc. documentElement;
расходы = xmlDoc. createElement( "СправочникРасходы" ) ;
Спр = Создатьобъект( "Справочник.Расходы" ) ;
Спр. ВыбратьЭлементы( ) ;
Пока Спр. ПолучитьЭлемент( ) = 1 цикл
расход = xmlDoc. createElement( "Расход" ) ;
расход. setAttribute( "Код" , Спр. Код) ;
расход. setAttribute( "Наименование" , Спр. Наименование) ;
расход. setAttribute( "Родитель" , Строка( Спр. Родитель) ) ;
расход. setAttribute( "Цена" , Строка( Спр. Цена. Получить( ТекущаяДата( ) ) ) ) ;
расход. setAttribute( "Количество" , Строка( Спр. Количество) ) ;
расход. setAttribute( "ЭтоГруппа" , Строка( Спр. ЭтоГруппа( ) ) ) ;
расходы. appendChild( расход) ;
КонецЦикла ;
nodeRoot. appendChild( расходы) ;
ДвижениеСчетов = xmlDoc. createElement( "ДвижениеСчетов" ) ;
рег = СоздатьОбъект( "Регистр.Счет" ) ;
рег. ВыбратьДвижения( ) ;
Пока Рег. ПолучитьДвижение( ) = 1 цикл
Движение = xmlDoc. createElement( "Движение" ) ;
Движение. setAttribute( "Приход" , Строка( Рег. Приход) ) ;
Движение. setAttribute( "Дата" , Строка( Рег. ТекущийДокумент( ) . ДатаДок) ) ;
Движение. setAttribute( "Описатель" , Строка( Рег. Описатель) ) ;
Движение. setAttribute( "СтатьяРасходов" , Строка( Рег. СтатьяРасходов) ) ;
Движение. setAttribute( "СтатьяПоступлений" , Строка( Рег. СтатьяПоступлений) ) ;
Движение. setAttribute( "Кто" , Строка( Рег. Кто) ) ;
Движение. setAttribute( "Кому" , Строка( Рег. Кому) ) ;
Движение. setAttribute( "Остаток" , Строка( Рег. Остаток) ) ;
Движение. setAttribute( "Количество" , Строка( Рег. Количество) ) ;
ДвижениеСчетов. appendChild( Движение) ;
КонецЦикла ;
nodeRoot. appendChild( ДвижениеСчетов) ;
xmlDoc. save( "C:\budjet.xml" ) ;
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2 . Найти( Кош, "Описатель" ) ;
Возврат Стр. Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2 . Найти( Кош, "Описатель" ) ;
Возврат Стр. Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20" + сред( дат, 7 , 2 ) + сред( дат, 4 , 2 ) + лев( дат, 2 ) ;
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект( "MSXML2.DOMDocument" ) ;
xmlDoc. load( "C:\budjet.xml" ) ;
nodeRoot = xmlDoc. documentElement;
Для каждого nod из nodeRoot. childNodes цикл
Если nod. nodeName = "СправочникРасходы" тогда
Сообщить( "нашли СправочникРасходы" ) ;
ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Код" ) ;
ТЗ. Колонки. Добавить( "Наименование" ) ;
ТЗ. Колонки. Добавить( "Родитель" ) ;
ТЗ. Колонки. Добавить( "Цена" ) ;
ТЗ. Колонки. Добавить( "Количество" ) ;
ТЗ. Колонки. Добавить( "ЭтоГруппа" ) ;
Для Каждого Расход из nod. childNodes Цикл
Строка = ТЗ. Добавить( ) ;
Строка. Код = Расход. getAttribute( "Код" ) ;
Строка. Наименование = Расход. getAttribute( "Наименование" ) ;
Строка. Родитель = Расход. getAttribute( "Родитель" ) ;
Строка. Цена = Число( Расход. getAttribute( "Цена" ) ) ;
Строка. Количество = Число( Расход. getAttribute( "Количество" ) ) ;
Строка. ЭтоГруппа = ? ( Расход. getAttribute( "ЭтоГруппа" ) = "1" , True, Ложь ) ;
КонецЦикла ;
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники. СтатьиЗатрат. НайтиПоНаименованию( Стр. Родитель, истина ) ;
Справ = Справочники. СтатьиЗатрат. НайтиПоНаименованию( Стр. Наименование, истина ) ;
Если Справ = Справочники. СтатьиЗатрат. ПустаяСсылка( ) тогда
Если Стр. ЭтоГруппа тогда
Справ = Справочники. СтатьиЗатрат. СоздатьГруппу( ) ;
Справ. Код = Стр. Код;
Справ. Наименование = Стр. Наименование;
Справ. Родитель = Родитель;
Справ. Записать( ) ;
Иначе
Справ = Справочники. СтатьиЗатрат. СоздатьЭлемент( ) ;
Справ. Код = Стр. Код;
Справ. Наименование = Стр. Наименование;
Справ. Родитель = Родитель;
Справ. Цена = Стр. Цена;
Справ. Количество = Стр. Количество;
Справ. Записать( ) ;
КонецЕсли ;
Иначе
КонецЕсли ;
КонецЦикла ;
ИначеЕсли nod. nodeName = "ДвижениеСчетов" тогда
Сообщить( "нашли движения счетов" ) ;
ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Приход" ) ;
ТЗ. Колонки. Добавить( "Дата" ) ;
ТЗ. Колонки. Добавить( "Описатель" ) ;
ТЗ. Колонки. Добавить( "Статья" ) ;
ТЗ. Колонки. Добавить( "Цена" ) ;
ТЗ. Колонки. Добавить( "Количество" ) ;
Для каждого движ из nod. childNodes цикл
Строка = ТЗ. Добавить( ) ;
Строка. Приход = ? ( движ. getAttribute( "Приход" ) = "1" , True, Ложь ) ;
Строка. Дата = Дата( Дата1 С( движ. getAttribute( "Дата" ) ) ) ;
Строка. Описатель = движ. getAttribute( "Описатель" ) ;
Строка. Статья = Справочники. СтатьиЗатрат. НайтиПоНаименованию( движ. getAttribute( ? ( Строка. Приход, "СтатьяПоступлений" , "СтатьяРасходов" ) ) , истина ) ;
Строка. Цена = Число( движ. getAttribute( "Остаток" ) ) ;
Строка. Количество = Число( движ. getAttribute( "Количество" ) ) ;
КонецЦикла ;
ТЗ. ВыбратьСтроку( ) ;
Доки = Новый ТаблицаЗначений;
Доки. Колонки. Добавить( "Док" ) ;
Доки. Колонки. Добавить( "Дата" ) ;
Доки. Колонки. Добавить( "КошелекС" ) ;
Доки. Колонки. Добавить( "КошелекНа" ) ;
Доки. Колонки. Добавить( "Статья" ) ;
Доки. Колонки. Добавить( "ВалютаС" ) ;
Доки. Колонки. Добавить( "ВалютаНа" ) ;
Доки. Колонки. Добавить( "ЦенаС" ) ;
Доки. Колонки. Добавить( "ЦенаНа" ) ;
Доки. Колонки. Добавить( "Количество" ) ;
УжеЕстьДок= Ложь ;
док= 0 ;
Для Каждого Стр Из ТЗ цикл
Если Стр. Приход Тогда
Если УжеЕстьДок тогда
Док. КошелекНа = Кошель( Стр. Описатель) ;
Док. ВалютаНа = Вал( Стр. Описатель) ;
Док. ЦенаНа = Стр. Цена;
Док. Количество = Стр. Количество;
Док. Статья = Стр. Статья;
УжеЕстьДок= Ложь ;
Иначе
Док = Доки. Добавить( ) ;
Док. КошелекНа = Кошель( Стр. Описатель) ;
Док. ВалютаНа = Вал( Стр. Описатель) ;
Док. ЦенаНа = Стр. Цена;
Док. Количество = Стр. Количество;
Док. Статья = Стр. Статья;
Док. Док = "ПоступлениеСредств" ;
КонецЕсли ;
Иначе
Док = Доки. Добавить( ) ;
Док. КошелекС = Кошель( Стр. Описатель) ;
Док. ВалютаС = Вал( Стр. Описатель) ;
Док. ЦенаС = Стр. Цена;
Док. Количество = Стр. Количество;
Док. Статья = Стр. Статья;
Если СокрЛП( Стр. Статья. Наименование) = "Обмен валюты" тогда
Док. Док = "ОбменВалюты" ;
УжеЕстьДок= истина ;
ИначеЕсли СокрЛП( Стр. Статья. Наименование) = "Перевод средств" тогда
Док. Док = "ПереводСредств" ;
УжеЕстьДок= истина ;
Иначе
Док. Док = "РасходСредств" ;
УжеЕстьДок= Ложь ;
КонецЕсли ;
КонецЕсли ;
Док. Дата = Стр. Дата;
КонецЦикла ;
Доки. ВыбратьСтроку( ) ;
КонецЕсли ;
КонецЦикла ;
Для Каждого Док из Доки Цикл
Если Док. Док = "ПоступлениеСредств" тогда
Докум = Документы. ПоступлениеСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. Кошелек = Док. КошелекНа;
Докум. Валюта = Док. ВалютаНа;
Докум. Сумма = Док. ЦенаНа;
Докум. Статья = Док. Статья;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
ИначеЕсли Док. Док = "ПереводСредств" тогда
Докум = Документы. ПеремещениеСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. КошелекКуда = Док. КошелекНа;
Докум. КошелекОтКуда = Док. КошелекС;
Докум. Валюта = Док. ВалютаНа;
Докум. Сумма = Док. ЦенаНа;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
ИначеЕсли Док. Док = "ОбменВалюты" тогда
Докум = Документы. ПеремещениеСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. КошелекКуда = Док. КошелекНа;
Докум. КошелекОтКуда = Док. КошелекС;
Докум. Валюта = Док. ВалютаС;
Докум. Сумма = Док. ЦенаС;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
Докум = Документы. ОбменВалюты. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. Кошелек = Док. КошелекНа;
Докум. ВалютаС = Док. ВалютаС;
Докум. ВалютаНа = Док. ВалютаНа;
Докум. СуммаС = Док. ЦенаС;
Докум. СуммаНа = Док. ЦенаНа;
Докум. Курс = Докум. СуммаС / Докум. СуммаНа;
Докум. Переключатель = 1 ;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
Иначе
Докум = Документы. РасходСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. Кошелек = Док. КошелекС;
Докум. Валюта = Док. ВалютаС;
тч = Докум. Затраты. Добавить( ) ;
тч. Сумма = Док. ЦенаС;
тч. Статья = Док. Статья;
тч. Цена = Док. ЦенаС;
тч. Количество = Док. Количество;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект( "MSXML2.DOMDocument" ) ;
xmlDoc. load( "C:\budjet.xml" ) ;
nodeRoot = xmlDoc. documentElement;
Для каждого nod из nodeRoot. childNodes цикл
Если nod. nodeName = "ДвижениеСчетов" тогда
Сообщить( "нашли движения счетов" ) ;
ТП1 = Новый ТаблицаЗначений;
ТП1 . Колонки. Добавить( "Описатель" ) ;
Типы = Новый Массив( 1 ) ; Типы[0 ] = Тип( "СправочникСсылка.Кошельки" ) ;
Тип = Новый ОписаниеТипов( Типы) ;
ТП1 . Колонки. Добавить( "Счет" , Тип) ;
Типы[0 ] = Тип( "СправочникСсылка.Валюты" ) ;
Тип = Новый ОписаниеТипов( Типы) ;
ТП1 . Колонки. Добавить( "Валюта" , Тип) ;
Для каждого движ из nod. childNodes цикл
Описатель = движ. getAttribute( "Описатель" ) ;
если ТП1 . Найти( Описатель, "Описатель" ) = Неопределено тогда
стр = ТП1 . Добавить( ) ;
Стр. Описатель = Описатель;
КонецЕсли ;
КонецЦикла ;
ТП2 = ТП1 ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры