Временные таблицы - хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа
МенеджерВременныхТаблиц . Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "
ПОМЕСТИТЬ В ", например:
Код 1C v 8.х |ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.
Пример 1: Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:
Код 1C v 8.х Запрос= Новый Запрос( "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары" ) ;
Запрос. Выполнить( ) ;
ЗапросТМП= Новый Запрос( "ВЫБРАТЬ * ИЗ ВТТовары" ) ;
ЗапросТМП. МенеджерВременныхТаблиц= Запрос. МенеджерВременныхТаблиц;
ТЗ= ЗапросТМП. Выполнить( ) . Выгрузить( ) ;
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т. е. иметь тип. Вот пример, демонстрирующий это:
ТЗ= Новый ТаблицаЗначений( ) ;
ТЗ. Колонки. Добавить( "А" , Новый ОписаниеТипов( "Строка" ) ) ;
ТЗ. Колонки. Добавить( "Б" , Новый ОписаниеТипов( "Строка" ) ) ;
Стр= ТЗ. Добавить( ) ;
Стр. А= "А" ;
Стр. Б= "Б" ;
Стр= ТЗ. Добавить( ) ;
Стр. А= "А1" ;
Стр. Б= "Б1" ;
Запрос= Новый Запрос( "Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т" ) ;
Запрос. МенеджерВременныхТаблиц= Новый МенеджерВременныхТаблиц;
Запрос. УстановитьПараметр( "Таб" , ТЗ) ;
Запрос. Выполнить( ) ;
ЗапросТМП= Новый Запрос( "ВЫБРАТЬ * ИЗ ВТТаб" ) ;
ЗапросТМП. МенеджерВременныхТаблиц= Запрос. МенеджерВременныхТаблиц;
ТЗ1 = ЗапросТМП. Выполнить( ) . Выгрузить( ) ;
ТЗ1 . ВыбратьСтроку( ) ;
Вместо перечисления списка полей можно использовать "ВЫБРАТЬ * ".
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
Код 1C v 8.х Процедура ТипизацияТЗ(ТЗ) Экспорт
РезультатТЗ = новый ТаблицаЗначений;
Для Каждого Колонка из ТЗ. Колонки Цикл
Имя = Колонка. Имя;
МассивТипов = новый Массив( 1 ) ;
МассивТипов[0 ] = ТипЗнч( ТЗ[0 ][Имя]) ;
Описатель = новый ОписаниеТипов( МассивТипов) ;
РезультатТЗ. Колонки. Добавить( Имя, Описатель) ;
КонецЦикла ;
Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ. Добавить( ) ;
ЗаполнитьЗначенияСвойств( СтрокаРез, Строка) ;
КонецЦикла ;
ТЗ = РезультатТЗ. Скопировать( ) ;
КонецПроцедуры
Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой:
Код 1C v 8.х ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций. Период,
ВзаиморасчетыСРаботникамиОрганизаций. Физлицо,
ВзаиморасчетыСРаботникамиОрганизаций. СуммаВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций. Организация,
ВзаиморасчетыСРаботникамиОрганизаций. ПериодВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций. Регистратор
ПОМЕСТИТЬ РегВзаимРасч
ИЗ
РегистрНакопления. ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций. Период МЕЖДУ &ДатаН И &ДатаК
;
ВЫБРАТЬ
ЗарплатаКВыплатеОрганизацийЗарплата. Физлицо,
ЗарплатаКВыплатеОрганизацийЗарплата. Сумма,
ЗарплатаКВыплатеОрганизацийЗарплата. ВыплаченностьЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата. КомпенсацияЗаЗадержкуЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата. Ссылка
ПОМЕСТИТЬ ДокумЗарплКВыпл
ИЗ
Документ. ЗарплатаКВыплатеОрганизаций. Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
ГДЕ
ЗарплатаКВыплатеОрганизацийЗарплата. Ссылка. Дата МЕЖДУ &ДатаН И &ДатаК
;
ВЫБРАТЬ
РегВзаимРасч. Период,
РегВзаимРасч. Физлицо,
РегВзаимРасч. СуммаВзаиморасчетов,
ДокумЗарплКВыпл. Сумма,
ДокумЗарплКВыпл. ВыплаченностьЗарплаты,
ДокумЗарплКВыпл. КомпенсацияЗаЗадержкуЗарплаты
ИЗ
РегВзаимРасч КАК РегВзаимРасч
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл
ПО РегВзаимРасч. Регистратор = ДокумЗарплКВыпл. Ссылка
И РегВзаимРасч. Физлицо = ДокумЗарплКВыпл. Физлицо
;
УНИЧТОЖИТЬ РегВзаимРасч
;
УНИЧТОЖИТЬ ДокумЗарплКВыпл
Код 1C v 8.х
Функция ПроверитьОрфографию(Текст, ДеревоЗначений = Null) Экспорт
Попытка
Ворд = Новый COMОбъект( "Word.Application" ) ;
Исключение
Предупреждение( "Microsoft Word не установлен!" , , "Ошибка!" ) ;
Возврат Ложь ;
КонецПопытки ;
ТекстБезОшибок = Ворд. CheckSpelling( Текст) ;
Если ТекстБезОшибок Тогда
Возврат Истина ;
Иначе
Если ДеревоЗначений < > Null Тогда
Ворд_Активен = Ворд. Visible;
ВремДок = Ворд. Documents. Add( ) ;
МояОбласть = ВремДок. Range( 0 , 0 ) ;
МояОбласть. I_nsertBefore( Текст) ;
ЧислоСлов = МояОбласть. Words. Count;
ДеревоЗначений = Новый ДеревоЗначений;
МассивТипов = Новый Массив;
МассивТипов. Добавить( Тип( "Строка" ) ) ;
ОписаниеТипов = Новый ОписаниеТипов( МассивТипов) ;
ДеревоЗначений. Колонки. Добавить( "Слово" , ОписаниеТипов, "Слово/Замена" , ) ;
wdSpellword= 0 ;
wdDoNotSaveChanges= 0 ;
Для НомерСлова = 1 По ЧислоСлов Цикл
ОбработкаПрерыванияПользователя( ) ;
ПровОбласть = МояОбласть. Words( НомерСлова) ;
ПровСлово = СокрЛП( ПровОбласть. Text) ;
СловоБезОшибок = Ворд. CheckSpelling( ПровСлово) ;
Если НЕ СловоБезОшибок Тогда
Если ДеревоЗначений. Строки. Найти( ПровСлово, "Слово" ) = Неопределено Тогда
НоваяСтрока = ДеревоЗначений. Строки. Добавить( ) ;
НоваяСтрока. Слово = ПровСлово;
Замены = ПровОбласть. GetSpellingSuggestions( , 1 , , wdSpellword) ;
ЧислоЗамен = Замены. Count;
Если ЧислоЗамен > 0 Тогда
Для НомерЗамены = 1 По ЧислоЗамен Цикл
СловоЗамены = СокрЛП( Замены. Item( НомерЗамены) . Name) ;
НоваяПодСтрока = НоваяСтрока. Строки. Добавить( ) ;
НоваяПодСтрока. Слово = СловоЗамены;
КонецЦикла ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
ВремДок. Close( wdDoNotSaveChanges, , ) ;
Если Не Ворд_Активен Тогда
Ворд. Quit( ) ;
КонецЕсли ;
КонецЕсли ;
Возврат Ложь ;
КонецЕсли ;
КонецФункции
Пример использования:
Код 1C v 8.х
Перем ДеревоЗначений;
Состояние( "Идет проверка орфографии. Пожалуйста ждите..." ) ;
Текст = ЭлементыФормы. ПолеТекстовогоДокумента. ПолучитьТекст( ) ;
Если ПроверитьОрфографию( Текст, ДеревоЗначений) Тогда
Предупреждение( "Текст ошибок не содержит!!!" , 5 , "OK" ) ;
Иначе
Если ДеревоЗначений. Строки. Количество( ) > 0 Тогда
ФормаВыбора = ЭтотОбъект. ПолучитьФорму( "ФормаВыбора" ) ;
Для каждого СтрокаДЗ Из ДеревоЗначений. Строки Цикл
Строка = ФормаВыбора. ДеревоЗначений. Строки. Добавить( ) ;
Строка. Слово = СтрокаДЗ. Слово;
Для каждого ПодСтрокаДЗ Из СтрокаДЗ. Строки Цикл
ПодСтрока = Строка. Строки. Добавить( ) ;
ПодСтрока. Слово = ПодСтрокаДЗ. Слово;
КонецЦикла ;
КонецЦикла ;
Если ФормаВыбора. ОткрытьМодально( ) = "OK" Тогда
Для каждого СтрокаДЗ Из ФормаВыбора. ДеревоЗначений. Строки Цикл
Для каждого ПодСтрокаДЗ Из СтрокаДЗ. Строки Цикл
Если ПодСтрокаДЗ. Пометка Тогда
Текст = СтрЗаменить( Текст, ПодСтрокаДЗ. Родитель. Слово, ПодСтрокаДЗ. Слово) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
ЭлементыФормы. ПолеТекстовогоДокумента. УстановитьТекст( Текст) ;
КонецЕсли ;
Иначе
Предупреждение( "В тексте найдены ошибки, но вариантов автозамены не нашлось!!!" , 5 , "Ошибка" ) ;
КонецЕсли ;
КонецЕсли ;
Файл для загрузки содержит данные вида(КодФизЛица, ФизЛицо, Сумма):
000000513~Петров Юрий Викторович~150
000000184~Иванов Александр Юрьевич~50
Код 1C v 8.х
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Текст(*.txt)|*.txt" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл для загрузки" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ПутьКФайлу = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
ВидУдерж= Неопределено ;
МассивТипов = Новый Массив;
МассивТипов. Добавить( Тип( "ПланВидовРасчетаСсылка.УдержанияОрганизаций" ) ) ;
ОписаниеВозможныхТипов = Новый ОписаниеТипов( МассивТипов) ;
Если ВвестиЗначение( ВидУдерж, "Выберите вид удержания" , ОписаниеВозможныхТипов) Тогда
Если Удержания. Количество( ) > 0 тогда
Предупреждение( "Внимание! В таблице уже есть данные, новые данные Добавлены к существующим данным!" ) ;
КонецЕсли ;
текдок= Новый ТекстовыйДокумент;
текдок. Прочитать( ПутьКФайлу) ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
Стр = текдок. ПолучитьСтроку( Ном) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( стр, "~" ) ;
НовСтр= Удержания. Добавить( ) ;
Физик = Справочники. ФизическиеЛица. НайтиПоКоду( СтрМ[0 ]) ;
Если СокрЛП( Физик. Наименование) = СокрЛП( СтрМ[1 ]) тогда
НовСтр. Физлицо = Физик;
Иначе
Сообщить( "В справочнике Физ. Лиц не найден " + СтрМ[1 ], СтатусСообщения. ОченьВажное) ;
КонецЕсли ;
НовСтр. ВидРасчета= ВидУдерж;
НовСтр. ДатаНачала= РабочаяДата;
НовСтр. ДатаОкончания= РабочаяДата;
НовСтр. Показатель1 = СтрМ[2 ];
НовСтр. Результат= СтрМ[2 ];
КонецЦикла ;
КонецЕсли ;