Для чего нужно индексирование временных таблиц 1с
Использование временных таблиц
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В общем случае, временные таблицы рекомендуется использовать для повышения производительности и стабильности выполнения запросов. Их можно использовать для других целей (например, для улучшения архитектуры кода), но при этом, нужно понимать, что это может в некоторых случаях приводить к снижению производительности.
2. Есть ситуации, когда временные таблицы не следует создавать или создание временных таблиц необходимо минимизировать.
2.1. Не следует создавать временные таблицы с очень большим объемом данных (сотни тысяч записей). Иначе это приведет к существенному снижению производительности при записи и исчерпанию свободного места на диске. Если алгоритму требуется работать с большим объемом данных, то он должен выполнять обработку этих данных порциями.
2.2. Следует максимально ограничивать количество данных, выбираемых во временную таблицу. Не следует помещать во временную таблицу больше данных, чем требуется последующим запросам.
2.3. Не следует помещать во временную таблицу поля, которые не используются в последующих запросах, т.к. время и место для их размещения тратится впустую.
2.4. Не следует создавать и удалять временные таблицы в цикле, если можно создать одну временную таблицу до выполнения цикла.
2.5. Не следует копировать одну временную таблицу в другую только ради того, чтобы переименовать первую таблицу во вторую. Вместо этого, следует передавать имя таблицы.
3. Временные таблицы следует всегда индексировать, когда это даст прирост производительности.
3.1. Индекс следует строить если:
3.1.1. Большая временная таблица участвует в соединении (не важно, с какой стороны). В индекс следует добавлять поля, участвующие в условии ПО .
3.1.2. Обращение к временной таблице выполняется в подзапросе конструкции логического оператора В (. ) . В индекс следует добавлять поля временной таблицы из списка выбора, соответствующие перечисленным с левой стороны логического оператора В (. ) .
3.2. Маленькие временные таблицы индексировать не нужно (менее 1000 записей).
3.3. Если условий выбора или соединений с временной таблицей больше одного, и только одно из них проверяется часто, то индекс следует строить для наиболее часто проверяемого условия.
Итак, если хотите узнать, почему в 1С:БП не получается открыть встроенный отчет как внешний, есть ли смысл задавать настройки компоновки для динамического списка и при каких условиях нужно индексировать временные таблицы, то ознакомьтесь с сегодняшней подборкой. Приятного прочтения!
Вопрос №1: Есть ли смысл использовать настройки компоновки для динамического списка?
Ответ
- Да, запрос, который извлекает из базы данные динамического списка, тоже может изменяться в зависимости от используемых настроек компоновки.
В одном из занятий курса по СКД мы рассматриваем, как получить исполняемые настройки компоновки для динамического списка.
Например, в типовой конфигурации 1С:БП в форме списка справочника “Контрагенты” используется динамический список с запросом:
Видно, что в тексте запроса есть конструкции в фигурных скобках. Значит, таблицы регистров будут применяться в запросах, если поля из них используются в настройках компоновки.
Это пример разобранного вопроса из Мастер-группы курсаПрофессиональная разработка отчетов в 1С 8.3 на СКД .
Вопрос №2: При каких условиях необходимо индексировать временные таблицы?
Хотел бы задать вопрос про индексирование временных таблиц. Рекомендуется индексировать те поля, которые участвуют в условиях отбора или условиях соединения, но в тоже время нельзя бездумно использовать индекс. В связи с этим вопрос: при каком примерном количестве строк нужно индексировать ВТ (временная таблица)? Имеет ли смысл индексировать, если в ВТ будет до 100 строк? Где-то попадалась рекомендация, что нужно индексировать при наличии от 1000 строк.Ответ
Этот вопрос рассмотрен в статье на нашем сайте – 3 главных вопроса про временные таблицы 1С.
В общем случае рекомендацию можно сформулировать следующим образом – индексирование временной таблицы нужно использовать тогда, когда это дает эффект. Если же индекс не будет использоваться СУБД или наоборот – на индексирование будет потрачено дополнительное время, то индексирование таблицы будет неэффективно. Способ проверки, будет ли использоваться индекс в конкретной ситуации, также приведен в указанной статье.
Это пример разобранного вопроса из Мастер-группы курсаРазработка и оптимизация запросов в 1С:Предприятие 8.3 .
Вопрос №3: Почему сохраненный типовой отчет 1C:БП не открывается как внешний?
Ответ
Причина ошибки заключается в том, что у внешнего отчета или обработки в принципе нет модуля менеджера. А у отчета или обработки из конфигурации такой модуль присутствует.
В 1С:БП в модуле менеджера отчетов есть программный код, а в 1C:УТ – нет. Этим объясняется разница в поведении конфигураций.
При сохранении отчета или обработки во внешний файл модуль менеджера будет потерян. Поэтому нужно учесть этот момент, доработать внешний отчет, например, добавив нужные процедуры в модуль объекта.
Альтернативный вариант – создать расширение, в котором реализовать новый отчет, модуль менеджера в таком случае будет доступен.
Доброго дня, коллеги! Если вы на практике не сталкивались с временными таблицами, в которых более 1000 записей, и с необходимостью их индексирования, то будем считать, что вам “повезло” и вопросы оптимизации и производительности вам чужды :) Успешно с этим жить и спокойно работать можно и дальше, но ровно до того момента, как вы решите сдать экзамен по платформе. В этом случае хотя бы в теории нужно изучить условия индексирования временных таблиц!
Вопрос
Разработчики 1С рекомендуют индексировать временные таблицы при 1000+ записей. На моей практике ни разу не встречал ситуаций, когда временная таблица содержит такое количество строк, тем более, такое количество строк в документах. У Вас же в примерах индексируется большая часть временных таблиц. На экзамене обязательно индексировать временные таблицы в запросе?
Ответ
Для индексирования временных таблиц есть формальные признаки – использование этих таблиц в отборах и соединениях. А есть более тонкие соображения – насколько оправданно будет индексировать эти таблицы, учитывая потенциальные затраты на эти операции и возможный выигрыш от использования индексов. Данный экзамен – на знание основных механизмов платформы, знание упомянутых “тонкостей” и нюансов оптимизации здесь не является обязательным, это уже уровень “1С:Эксперт”. Для данного экзамена использовался упрощенный подход – по формальным признакам. Ведь заранее не известен размер таблиц. Если экзаменатор увидит в запросе временную таблицу, где нет индексов, но по формальным признакам они нужны, будет непонятно: либо автор не знает про индексацию, либо эти индексы не используются намеренно, по каким-то соображениям. В данном курсе для упрощения, везде, где временные таблицы используются в отборах или соединениях, индексы включали – чтобы не возникало претензий с формулировкой “В задачах получения данных из информационной базы установка отборов по неиндексированным полям”. Если же Вы решите намеренно не использовать индексы исходя из приведенных Вами соображений, лучше привести эти аргументы в пояснении к решению, чтобы у экзаменатора не было сомнений не сей счет.
Это пример разобранного вопроса из Мастер-группы курса
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3 .
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, в духе 1С, нельзя получить список временных таблиц, которые хранятся в запросе.
Пример, как можно выгрузить временную таблицу в таблицу значений, а заодно и как использовать менеджер временных таблиц:
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это (спасибо Чепелевич А.А., раньше я думал что это невозможно):
Вместо перечисления списка полей можно использовать "ВЫБРАТЬ *".
От zag2art
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
[1с]
Процедура ТипизацияТЗ(ТЗ) Экспорт
РезультатТЗ = новый ТаблицаЗначений;
Для Каждого Колонка из ТЗ.Колонки Цикл
Имя = Колонка.Имя;
МассивТипов = новый Массив(1);
МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]);
Описатель = новый ОписаниеТипов(МассивТипов);
РезультатТЗ.Колонки.Добавить(Имя, Описатель);
КонецЦикла;
Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
КонецЦикла;
ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры
[/1с]
Функция для просмотра ВТ в отладчике
Вот как получить список всех ВТ, не знаю. Видимо никак.
Как удалить временную таблицу
Недостатки временных таблиц:</
1. Если в тексте запроса есть временная таблица, то этот запрос не разбирается конструктором запроса (это ограничение можно обойти нештатно, используя объявление подзапроса Книга знаний: v8: Конструирование сложных запросов для 1С). В релизе 8.1.11 можно использовать конструктор
2. Нельзя выполнить запрос над временной таблицей и поместить данные в нее же саму.
3. Нельзя получить список временных таблиц из менеджера временных таблиц.
Примечание: В последних версиях платформы больше 8.1.8 используется синтаксис "ПОМЕСТИТЬ" без предлога "В".
Читайте также: