10.07.2023
Дополнительные возможности по работе с временными таблицами
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в 8.3.25
Добавление данных в существующую временную таблицу
Как известно, временная таблица создается при выполнении запроса с помощью предложения ПОМЕСТИТЬ, идущего после перечисления полей в инструкции ВЫБРАТЬ. Имя временной таблицы идет после ПОМЕСТИТЬ, а её структура определяется структурой самого запроса.
Такой запрос
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
создаст временную таблицу ВТ_Товары с полями Код и Наименование.
Добавить данные в уже созданную временную таблицу нельзя. Если мы захотим сложить в ВТ_Товары ещё и содержимое справочника Услуги:
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
ВЫБРАТЬ
Услуги.Код КАК Код,
Услуги.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ИЗ
Справочник.Услуги КАК Услуги
;
мы получим ошибку «Временная таблица уже существует».
В версии 8.3.25 появится возможность добавлять данные в уже существующую временную таблицу с помощью предложения ДОБАВИТЬ (ADD):
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
ВЫБРАТЬ
Услуги.Код КАК Код,
Услуги.Наименование КАК Наименование
ДОБАВИТЬ ВТ_Товары
ИЗ
Справочник.Услуги КАК Услуги
;
Структура запросов, добавляющих данные в существующую временную таблицу (состав колонок и их типы) должны совпадать со структурой временной таблицы, иначе возникнет ошибка «Структура существующей временной таблицы не соответствует структуре добавляемых данных».
Возможность добавлять данные в существующую временную таблицу позволит в ряде сценариев сократить количество «однотипных» временных таблиц в запросе, сделать текст запроса более читаемым, а исполнение запроса – более эффективным.
Создание нескольких индексов для временной таблицы
Для временной таблицы можно будет создавать несколько индексов для ускорения поиска по временной таблице. Для предложения ИНДЕКСИРОВАТЬ ПО будет реализовано расширение НАБОРАМ (SETS):
ИНДЕКСИРОВАТЬ ПО НАБОРАМ ((НаборПолей1)[ ,(НаборПолей2)[,…]])
Пример:
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ ВТ_Товары
ИЗ
Справочник.Номенклатура КАК Номенклатура
ИНДЕКСИРОВАТЬ ПО НАБОРАМ (
(Код, Наименование),
(Артикул)
)
Во временной таблице ВТ_Товары будут созданы два индекса – по двум полям (Код, Наименование) и по одному полю (Артикул).
Создавать индексы можно будет только при первом помещении данных во временную таблицу.
Уникальные индексы на временных таблицах
Для предложений ИНДЕКСИРОВАТЬ ПО будет реализована опция УНИКАЛЬНО (UNIQUE). При её использовании будет создан уникальный индекс.
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
Справочник.Номенклатура КАК Номенклатура
ИНДЕКСИРОВАТЬ ПО НАБОРАМ (
(Код, Наименование) УНИКАЛЬНО,
(Артикул)
)
Встроенный язык будет расширен для поддержки новой функциональности. Конструктор запросов также будет доработан.
Надеемся, что новая функциональность позволит вам ещё эффективнее использовать такой мощный механизм, как временные таблицы.
Теги:
8.3.25
разработка
cfk
02.12.15
✎
14:36
тзДанные77 = Новый ТаблицаЗначений;
мт = Новый Массив;
мт.Добавить(Тип(«Строка»));
мт.Добавить(Тип(«Дата»));
мт.Добавить(Тип(«Число»));
отСтрока = Новый ОписаниеТипов(мт,,,
Новый КвалификаторыЧисла(9,2,ДопустимыйЗнак.Любой),
Новый КвалификаторыСтроки(25,ДопустимаяДлина.Переменная),
Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя),);
стрКолонки = Новый Структура(«Документ,Период,Организация,ОрганизацияКлюч,»
+»Склад,СкладКлюч,Контрагент,КонтрагентКлюч,Сумма»);
Для каждого киз Из стрКолонки Цикл
тзДанные77.Колонки.Добавить(киз.Ключ,отСтрока);
КонецЦикла;
Пока РН77.ПолучитьДокумент()=1 Цикл
Если РН77.Проведен()=1 Тогда
стз = тзДанные77.Добавить();
стз.Документ = РН77.НомерДок;
стз.Период = РН77.ДатаДок;
стз.Организация = РН77.Фирма.Наименование;
стз.ОрганизацияКлюч = РН77.Фирма.Код;
стз.Склад = РН77.МестоХранения.Наименование;
стз.СкладКлюч = РН77.МестоХранения.Код;
стз.Контрагент = РН77.Контрагент.Наименование;
стз.КонтрагентКлюч = РН77.Контрагент.Код;
стз.Сумма = РН77.Итог(«СуммаСНДС»);
КонецЕсли;
//Сообщить(«Документ <«+РН77.НомерДок
// +»> от <«+РН77.ДатаДок
// +»>Фирма <«+РН77.Фирма.Наименование
// +»> Контрагент <«+РН77.Контрагент.Наименование
// +»> Сумма <«+РН77.Итог(«СуммаСНДС»)
// +»> Проведен <«+РН77.Проведен()
// +»>»);
КонецЦикла;
З = Новый Запрос;
мвт = Новый МенеджерВременныхТаблиц;
З.МенеджерВременныхТаблиц = мвт;
З.УстановитьПараметр(«тзДанные77»,тзДанные77);
З.Текст = »
|ВЫБРАТЬ
| тзДанные77.Организация,
| тзДанные77.ОрганизацияКлюч,
| тзДанные77.Склад,
| тзДанные77.СкладКлюч,
| тзДанные77.Контрагент,
| тзДанные77.КонтрагентКлюч,
| тзДанные77.Документ,
| тзДанные77.Период,
| тзДанные77.Сумма
|ПОМЕСТИТЬ Данные77
|ИЗ
| &тзДанные77 КАК тзДанные77
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Данные77.Организация,
| Данные77.ОрганизацияКлюч КАК Ключ,
| МАКСИМУМ(Организации.Ссылка) КАК Ссылка
|ИЗ
| Данные77 КАК Данные77
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
| ПО Данные77.ОрганизацияКлюч = Организации.Ключ
|
|СГРУППИРОВАТЬ ПО
| Данные77.Организация,
| Данные77.ОрганизацияКлюч
|
|ИМЕЮЩИЕ
| МАКСИМУМ(Организации.Ссылка) ЕСТЬ NULL «;
рз = З.Выполнить();
cfk
02.12.15
✎
14:37
{Обработка.Импорт.Форма.Форма.Форма(141)}: Ошибка при вызове метода контекста (Выполнить): {(12, 11)}: Временная таблица уже существует «Данные77»
ПОМЕСТИТЬ <<?>>Данные77
ДенисЧ
02.12.15
✎
14:39
второй раз вызываешь без обнуления переменных…
Nuobu
02.12.15
✎
14:40
(1) Отладкой делаешь З.Выполнить(), смотришь результат.
А как оно само доходит до этой строчки, то падает.
cfk
02.12.15
✎
14:40
тоесть (2) нет =) С первого раза выскакивает. А менеджер в исключении закрывается
cfk
02.12.15
✎
14:41
(4) не понял, чем будет отличаться отладка от рантайма в данном случае
VikingKosmo
02.12.15
✎
14:41
(7) тем, что в рантайм не будет повторного создания ВТ
cfk
02.12.15
✎
14:43
(8,9) где вы видите повторное создание. С ПЕРВОГО раза выскакивает, говорю вам. и Менеджер временных таблиц закрывается каждый раз при исключении. Т.е. временные таблицы после каждого исключения уничтожаются.
cfk
02.12.15
✎
14:45
(8), (9) так понятнее?
Попытка
v77 = Новый COMОбъект(«V77.Application»);
Dir = стрПар.Каталог;
Usr = стрПар.Пользователь;
Pwd = стрПар.Пароль;
ConnStr = «/D»»»+Dir+»»»»
+» /N»»»+Usr+»»»»+
?(StrLen(TrimAll(Pwd))<>0,» /P»»»+Pwd+»»» «,»»);
// Сообщить(«Подключаюcь как <«+Usr+»> к <«+Dir+»>»);
Если v77.Initialize(v77.RMTrade,TrimAll(ConnStr),»NO_SPLASH_SHOW») = 0 Тогда
ВызватьИсключение(«Сбой подключения к <«+Dir+»>»);
КонецЕсли;
// Сообщить(«Успешно подключена база <«+Dir+»>»);
Период = стрПар.Период;
РН77 = v77.CreateObject(«Документ.РасходнаяНакладная»);
Если РН77.ВыбратьДокументы(Период.ДатаНачала,Период.ДатаОкончания) = 1 Тогда
тзДанные77 = Новый ТаблицаЗначений;
мт = Новый Массив;
мт.Добавить(Тип(«Строка»));
мт.Добавить(Тип(«Дата»));
мт.Добавить(Тип(«Число»));
отТипы = Новый ОписаниеТипов(мт,,,
Новый КвалификаторыЧисла(9,2,ДопустимыйЗнак.Любой),
Новый КвалификаторыСтроки(25,ДопустимаяДлина.Переменная),
Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя),);
стрКолонки = Новый Структура(«Документ,Период,Организация,ОрганизацияКлюч,»
+»Склад,СкладКлюч,Контрагент,КонтрагентКлюч,Сумма»);
Для каждого киз Из стрКолонки Цикл
тзДанные77.Колонки.Добавить(киз.Ключ,отТипы);
КонецЦикла;
Пока РН77.ПолучитьДокумент()=1 Цикл
Если РН77.Проведен()=1 Тогда
стз = тзДанные77.Добавить();
стз.Документ = РН77.НомерДок;
стз.Период = РН77.ДатаДок;
стз.Организация = РН77.Фирма.Наименование;
стз.ОрганизацияКлюч = РН77.Фирма.Код;
стз.Склад = РН77.МестоХранения.Наименование;
стз.СкладКлюч = РН77.МестоХранения.Код;
стз.Контрагент = РН77.Контрагент.Наименование;
стз.КонтрагентКлюч = РН77.Контрагент.Код;
стз.Сумма = РН77.Итог(«СуммаСНДС»);
КонецЕсли;
//Сообщить(«Документ <«+РН77.НомерДок
// +»> от <«+РН77.ДатаДок
// +»>Фирма <«+РН77.Фирма.Наименование
// +»> Контрагент <«+РН77.Контрагент.Наименование
// +»> Сумма <«+РН77.Итог(«СуммаСНДС»)
// +»> Проведен <«+РН77.Проведен()
// +»>»);
КонецЦикла;
З = Новый Запрос;
мвт = Новый МенеджерВременныхТаблиц;
З.МенеджерВременныхТаблиц = мвт;
З.УстановитьПараметр(«тзДанные77»,тзДанные77);
З.Текст = »
|ВЫБРАТЬ
| тзДанные77.Организация,
| тзДанные77.ОрганизацияКлюч,
| тзДанные77.Склад,
| тзДанные77.СкладКлюч,
| тзДанные77.Контрагент,
| тзДанные77.КонтрагентКлюч,
| тзДанные77.Документ,
| тзДанные77.Период,
| тзДанные77.Сумма
|ПОМЕСТИТЬ Данные77
|ИЗ
| &тзДанные77 КАК тзДанные77
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Данные77.Организация,
| Данные77.ОрганизацияКлюч КАК Ключ,
| МАКСИМУМ(Организации.Ссылка) КАК Ссылка
|ИЗ
| Данные77 КАК Данные77
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
| ПО Данные77.ОрганизацияКлюч = Организации.Ключ
|
|СГРУППИРОВАТЬ ПО
| Данные77.Организация,
| Данные77.ОрганизацияКлюч
|
|ИМЕЮЩИЕ
| МАКСИМУМ(Организации.Ссылка) ЕСТЬ NULL «;
рз = З.Выполнить();
Если НЕ рз.Пустой() Тогда
//ЗначениеВР З.Выполнить().Выгрузить(),ДанныеФормыВЗначение(
тзОрганизации = З.Выполнить().Выгрузить();
стрРезультат.Значения.Вставить(«Организации»,тзОрганизации);
КонецЕсли;
//Склады
З.Текст = »
|ВЫБРАТЬ
| Данные77.Склад,
| Данные77.СкладКлюч КАК Ключ,
| МАКСИМУМ(Склады.Ссылка) КАК Ссылка
|ИЗ
| Данные77 КАК Данные77
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
| ПО Данные77.СкладКлюч = Склады.Ключ
|
|СГРУППИРОВАТЬ ПО
| Данные77.Склад,
| Данные77.СкладКлюч
|
|ИМЕЮЩИЕ
| МАКСИМУМ(Склады.Ссылка) ЕСТЬ NULL «;
рз = З.Выполнить().Выгрузить();
Если НЕ рз.Пустой() Тогда
тзСклады = рз.Выгрузить();
стрРезультат.Значения.Вставить(«Склады»,тзСклады);
КонецЕсли;
//Контрагенты
З.Текст = »
|ВЫБРАТЬ
| Данные77.Контрагент,
| Данные77.КонтрагентКлюч КАК Ключ,
| МАКСИМУМ(Контрагенты.Ссылка) КАК Ссылка
|ИЗ
| Данные77 КАК Данные77
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО Данные77.КонтрагентКлюч = Контрагент.Ключ
|
|СГРУППИРОВАТЬ ПО
| Данные77.Контрагент,
| Данные77.КонтрагентКлюч
|
|ИМЕЮЩИЕ
| МАКСИМУМ(Контрагенты.Ссылка) ЕСТЬ NULL «;
Если НЕ рз.Пустой() Тогда
тзКонтрагенты = рз.Выгрузить();
стрРезультат.Значения.Вставить(«Контрагенты»,тзКонтрагенты);
КонецЕсли;
//Продажи
З.Текст = »
|ВЫБРАТЬ
| Данные77.ОрганизацияКлюч,
| Данные77.СкладКлюч,
| Данные77.КонтрагентКлюч,
| Данные77.Документ,
| Данные77.Период,
| Данные77.Сумма
|ИЗ Данные77″;
Если НЕ рз.Пустой() Тогда
тзПродажи = рз.Выгрузить();
стрРезультат.Значения.Вставить(«Продажи»,тзПродажи);
КонецЕсли;
мвт.Закрыть();
стрРезультат.Результат = Истина;
Иначе
Сообщить(«У подключенной базы в выбранном периоде нет документов!»);
КонецЕсли;
v77 = Неопределено;
Исключение
Сообщить(ОписаниеОшибки());
Если мвт<>Неопределено Тогда
мвт.Закрыть();
КонецЕсли;
v77 = Неопределено;
КонецПопытки;
НЕА123
02.12.15
✎
14:48
рз = З.Выполнить();
Если НЕ рз.Пустой() Тогда
//ЗначениеВР З.Выполнить().Выгрузить(),ДанныеФормыВЗначение(
тзОрганизации = З.Выполнить().Выгрузить();
cfk
02.12.15
✎
14:50
(12) Дайте пепла, я одел рубище
Закрыто
cw014
02.12.15
✎
15:01
З.МенеджерВременныхТаблиц = мвт;
Удаляй это нафиг
cfk
02.12.15
✎
15:18
(14),(15),(16) Слово ЗАКРЫТО означает что проблема решена. Тема Закрыта.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
- Pick a username
- Email Address
- Password
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
2.92 Объекты для отладки. Временная таблица уже существует |
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
|
|
{Обработка.Импорт.Форма.Форма.Форма}: Ошибка при вызове метода контекста (Выполнить): {(12, 11)}: Временная таблица уже существует «Данные77» ПОМЕСТИТЬ <<?>>Данные77
второй раз вызываешь без обнуления переменных…
Отладкой делаешь З.Выполнить, смотришь результат. А как оно само доходит до этой строчки, то падает.
тоесть нет =) С первого раза выскакивает. А менеджер в исключении закрывается
не понял, чем будет отличаться отладка от рантайма в данном случае
тем, что в рантайм не будет повторного создания ВТ
(8,9) где вы видите повторное создание. С ПЕРВОГО раза выскакивает, говорю вам. и Менеджер временных таблиц закрывается каждый раз при исключении. Т.е. временные таблицы после каждого исключения уничтожаются.
Дайте пепла, я одел рубище Закрыто
З.МенеджерВременныхТаблиц = мвт; Удаляй это нафиг
,, Слово ЗАКРЫТО означает что проблема решена. Тема Закрыта.
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям