Не могу побороть поведение платформы в части создания временной таблицы на основе внешнего источника
1С делает вставку значений построчно (и 8.1.15 и 8.2.13.205)
на партнерском форуме где-то видел что платформа делает вставку массово (чего и хочу добиться)
более подробно:
1. имеем обработку ПроизвольныйКод82 (с трассировкой SQL запросов): приложена к данному посту (мопед почти не мой - я просто совместил 2 обработки с Инфостарта: ПроизвольныйКод и КонсольЗапросовСТрассировкой)
2а. читаю в документации
Цитата:Для того чтобы создать временную таблицу на основании внешнего источника, следует в тексте запроса в списке источников указать имя параметра, в который будет помещен внешний источник. Остальной синтаксис идентичен обычному созданию временной таблицы. В качестве внешнего источника могут выступать:
таблица значений;
табличная часть;
результат запроса.
2б. выполняю в консоли кода следующий фрагмент:
КС = Новый КвалификаторыСтроки(15);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Тесть",ОписаниеТиповС);
Для сч = 1 По 128 Цикл
тз.Добавить().Тесть = "Тесть"+сч;
КонецЦикла;
_запрос = Новый Запрос;
_запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
_запрос.Текст = "ВЫБРАТЬ Тесть ПОМЕСТИТЬ втХрень ИЗ &тз КАК Хрень ; выбрать * из втХрень; УНИЧТОЖИТЬ втХрень";
_запрос.УстановитьПараметр("тз",тз);
Попытка
результат = _запрос.Выполнить();
Исключение
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
_запрос.Текст = "ВЫБРАТЬ Тесть ПОМЕСТИТЬ втХрень ИЗ &результат КАК Хрень; ВЫБРАТЬ * ИЗ втХрень; УНИЧТОЖИТЬ втХрень";
_запрос.УстановитьПараметр("результат",результат);
Попытка
результат = _запрос.Выполнить();
Исключение
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
3. вижу результат трассировки и понимаю что 1С-сина в своих внутренностях выполняет примерно следующую инструкцию:
for each value from VT do
execSQL("N'INSERT INTO %temp (%field) VALUES(@P1)',N'@P1 %typev ',N'%value'", value)
end do
в итоге я вижу 128 вызовов типа "INSERT".
Внимание вопрос: умеет ли восьмерка (хоть какая нибудь) делать массовую вставку во временую таблицу.
P.S. Если кому интересно почему именно 128 - могу отдельно рассказать:
мне эта Времянка нужна потом для фильтров и если Времянка будет из одной колонки
то прекрасно работает конструкция "ГДЕ ЧетоТам В($параметрСписокЗначений)"
однако есть 2 проблемы
1. если Список будет иметь более 128 значений - тогда он уедет на SQL как временная таблица все равно: по принципу такому же как код выше.
2. если в запросе будет фильтрация вида "ГДЕ Номенклатура.Ссылка В(&СписокСсылок) И Номенклатура.ЭтоГруппа"
и в СпискеСсылок будет значений более чем 1000 (эмпирическим путем выявлено) Оптимизатор SQL построит слегка Невеселый пан запроса с секцией MissingIndex
P.S.S. Один выход я уже нашел
вызывать Запрос со СпискамиСсылок нарезанными по 128 значений, а потом в коде объединять таблицы результатов - работает быстрее и Оптимизатор не нагибается.
---
и еще я знаю что если тебе нужно отправлять фильтр из 1000 строк на сервер БД, значит ты как то нет так подготовил данные - однако код подготовки не мой и рассредоточен по всей конфигурации
. Поэтому и хочу узнать можно ли победить данную проблему переработкой запроса - или придется идти играть в политические игрища с убеждением остальных участников процесса разработки.