1с с какого значения начинается индексирование элементов коллекции
Индексы таблиц базы данных
В данном разделе приведен список индексов таблиц базы данных, которые создаются системой 1С:Предприятие 8. Индексы таблиц создаются неявным образом при создании объектов конфигурации, а также при тех или иных настройках объектов конфигурации. Для тех случаев, когда создание индексов зависит от настроек объектов конфигурации приведены условия создания индексов.
В приведенных ниже таблицах имена индексных полей приведены так, как они описаны в разделе документации "Таблицы запросов".
Для измерений, реквизитов и т.д. применяются условные имена Измерение1, Реквизит1 и т.д.
Для общих реквизитов, являющихся разделителями в режиме "независимо", будем использовать имена ОРНР (ОРНР1, ОРНР2, и т.д.).
Для общих реквизитов, являющихся разделителями в режиме "независимо и совместно", будем использовать имена ОРСР.
Если режим разделения не имеет значения, то для общих реквизитов, являющихся разделителями, будем использовать имена ОРР.
Если в конфигурации определены разделители, то в индексы может входит поле, которое содержит значение хэш-функции набора значений разделителей. Такое поле будем обозначать именем ОРРХ.
Те индексные поля, которые не являются обязательными приведены в квадратных скобках, а если в индексе присутствует набор однотипных полей, это описывается многоточием, например: Реквизит + Измерение1 + [Измерение2 +. ].
Данным материалом следует руководствоваться при написании текстов запросов с целью оптимизации времени их исполнения.
Справочник
Основные индексы
[ОРНР1 + . +] Ссылка (Кластерный)
Всегда.
В индекс входят поля независимых разделителей, которые разделяют этот справочник.
[ОРРХ | ОРНР1 +] Код + Ссылка
Свойство "Длина кода" не равно 0.
Если справочник разделяется одним независимым разделителем, тип которого не Строка, то индекс содержит поле этого разделителя.
Если тип разделителя - Строка, или разделитель независимый и совместный, или разделителей больше одного, то индекс содержит поле значения хэш-функции значений разделителей.
Это правило справедливо для всех индексов, в составе которых указано [ОРРХ | ОРНР1 +].
Свойство "Длина наименования" не равно 0.
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать".
[ ОРРХ | ОРНР1 +] Реквизит + Код + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина кода" не равно 0, а свойство "Основное представление" равно "В виде кода".
[ ОРРХ | ОРНР1 +] Реквизит + Наименование + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина наименования" не равно 0, а свойство "основное представление" равно "В виде наименования".
Справочник включен в критерий отбора через реквизит "Реквизит".
Индекс по идентификатору предопределенного объекта метаданных.
Дополнительные индексы для подчиненного справочника (вне зависимости от иерархичности справочника)
Свойство "Длина кода" равно 0.
[ ОРРХ | ОРНР1 +] Владелец + Код + Ссылка
Свойство "Длина кода" не равно 0.
[ ОРРХ | ОРНР1 +] Владелец + Наименование + Ссылка
Свойство "Длина наименования" не равно 0.
[ ОРРХ | ОРНР1 +] Владелец + Реквизит + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать".
[ ОРРХ | ОРНР1 +] Владелец + Реквизит + Код + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина кода" не равно 0, а свойство "Основное представление" равно "В виде кода".
[ ОРРХ | ОРНР1 +] Владелец + Реквизит + Наименование + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина наименования" не равно 0, а свойство "основное представление" равно "В виде наименования".
Дополнительные индексы для иерархического неподчиненного справочника
Если для справочника установлено свойство "Размещать группы сверху", то в индексах, наряду с полем Родитель, участвует поле ЭтоГруппа. Состав индексов соответствует приведенной ниже таблице.
[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Ссылка
Свойство "Длина кода" равно 0 и свойство "Длина наименования" равно 0.
[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Код + Ссылка
Свойство "Длина кода" не равно 0.
[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Наименование + Ссылка
Свойство "Длина наименования" не равно 0.
[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Реквизит + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать".
[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Реквизит + Код + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина кода" не равно 0, а свойство "Основное представление" равно "В виде кода".
[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Реквизит + Наименование + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина наименования" не равно 0, а свойство "основное представление" равно "В виде наименования".
Для справочников без размещения групп сверху состав индексов соответствует приведенной выше таблице, но в индексы при этом не включено поле ЭтоГруппа.
Дополнительные индексы для иерархического подчиненного справочника
Если для справочника установлено свойство "Размещать группы сверху", то в индексах, наряду с полем Родитель, участвует поле ЭтоГруппа. Состав индексов соответствует приведенной ниже таблице.
[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Ссылка
Свойство "Длина кода" равно 0 и свойство "Длина наименования" равно 0.
[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Код + Ссылка
Свойство "Длина кода" не равно 0.
[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Наименование + Ссылка
Свойство "Длина наименования" не равно 0.
[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Реквизит + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать".
[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Реквизит + Код + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина кода" не равно 0, а свойство "Основное представление" равно "В виде кода".
[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Реквизит + Наименование + Ссылка
Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина наименования" не равно 0, а свойство "основное представление" равно "В виде наименования".
Для справочников без размещения групп сверху состав индексов соответствует приведенной выше таблице, но в индексы при этом не включено поле ЭтоГруппа.
Поиск в коллекциях значений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:
- Индексировать колонки, по которым выполняется поиск;
- Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).
* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.
2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :
При поиске значения в одной колонке таблицы значений оба метода одинаково эффективно используют индекс, если он был задан (см. п.1).
Однако при поиске значения сразу по нескольким (или по всем) колонкам необходимо учитывать следующие ограничения.
2.1. Не следует использовать метод Найти для поиска по нескольким колонкам в таблицах значений с большим количеством строк, даже если проиндексированы все колонки, обладающие хорошей селективностью. Это ограничение вызвано тем, что метод Найти выполняет поиск с применением индекса только по одному полю.
Например:
ТЗ.Индексы.Добавить("Колонка1");
ТЗ.Индексы.Добавить("Колонка2");
. = ТЗ.Найти("найдется все", "Колонка1, Колонка2"); // Индекс НЕ используется!
В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
Например:
ТЗ.Индексы.Добавить("Колонка1"); // Индекс1
ТЗ.Индексы.Добавить("Колонка2"); // Индекс2
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2 ", "Ищу1","Ищу2")); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // OK - используется Индекс1
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // OK - используется Индекс2
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2", "Ищу1","Ищу2")); // OK - индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2, Колонка1", "Ищу2","Ищу1")); // OK - индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // Индекс НЕ используется!
2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).
3. В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
- В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
- В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать("Дата,Ссылка", ОбъектСравнения);
Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.
3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:
- объекта Соответствие , если не важен порядок элементов;
- индексированной ТаблицаЗначений , если порядок элементов значим.
Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.
* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.
3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).
4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .
Итак, если хотите узнать, почему в 1С:БП не получается открыть встроенный отчет как внешний, есть ли смысл задавать настройки компоновки для динамического списка и при каких условиях нужно индексировать временные таблицы, то ознакомьтесь с сегодняшней подборкой. Приятного прочтения!
Вопрос №1: Есть ли смысл использовать настройки компоновки для динамического списка?
Ответ
- Да, запрос, который извлекает из базы данные динамического списка, тоже может изменяться в зависимости от используемых настроек компоновки.
В одном из занятий курса по СКД мы рассматриваем, как получить исполняемые настройки компоновки для динамического списка.
Например, в типовой конфигурации 1С:БП в форме списка справочника “Контрагенты” используется динамический список с запросом:
Видно, что в тексте запроса есть конструкции в фигурных скобках. Значит, таблицы регистров будут применяться в запросах, если поля из них используются в настройках компоновки.
Это пример разобранного вопроса из Мастер-группы курсаПрофессиональная разработка отчетов в 1С 8.3 на СКД .
Вопрос №2: При каких условиях необходимо индексировать временные таблицы?
Хотел бы задать вопрос про индексирование временных таблиц. Рекомендуется индексировать те поля, которые участвуют в условиях отбора или условиях соединения, но в тоже время нельзя бездумно использовать индекс. В связи с этим вопрос: при каком примерном количестве строк нужно индексировать ВТ (временная таблица)? Имеет ли смысл индексировать, если в ВТ будет до 100 строк? Где-то попадалась рекомендация, что нужно индексировать при наличии от 1000 строк.Ответ
Этот вопрос рассмотрен в статье на нашем сайте – 3 главных вопроса про временные таблицы 1С.
В общем случае рекомендацию можно сформулировать следующим образом – индексирование временной таблицы нужно использовать тогда, когда это дает эффект. Если же индекс не будет использоваться СУБД или наоборот – на индексирование будет потрачено дополнительное время, то индексирование таблицы будет неэффективно. Способ проверки, будет ли использоваться индекс в конкретной ситуации, также приведен в указанной статье.
Это пример разобранного вопроса из Мастер-группы курсаРазработка и оптимизация запросов в 1С:Предприятие 8.3 .
Вопрос №3: Почему сохраненный типовой отчет 1C:БП не открывается как внешний?
Ответ
Причина ошибки заключается в том, что у внешнего отчета или обработки в принципе нет модуля менеджера. А у отчета или обработки из конфигурации такой модуль присутствует.
В 1С:БП в модуле менеджера отчетов есть программный код, а в 1C:УТ – нет. Этим объясняется разница в поведении конфигураций.
При сохранении отчета или обработки во внешний файл модуль менеджера будет потерян. Поэтому нужно учесть этот момент, доработать внешний отчет, например, добавив нужные процедуры в модуль объекта.
Альтернативный вариант – создать расширение, в котором реализовать новый отчет, модуль менеджера в таком случае будет доступен.
Универсальные коллекции значений 1С - это динамические структуры с данными, которые не хранятся в системе, а формируются на время работы какого-либо алгоритма. Как правило, они служат для вспомогательного сбора, группировки, анализа и обработки информации.
Коллекции значений могут:
- возвращаться в виде результата какой-либо функции (функция возвращает в качестве значения универсальную коллекцию) ;
- задаваться разработчиком непосредственно в коде (обратившись к конструктору и создав экземпляр класса).
Почти любую универсальную коллекцию можно создать с помощью конструктора (исключением являются табличные части, которые выступают в качестве объектов конфигурации). Конструкторы для многих универсальных коллекций являются параметризованными. Используя параметры конструктора, можно сразу задать желаемое поведение данного объекта. При этом параметры являются необязательными, разработчик может их не задавать и в дальнейшем определить поведение объекта так, как считает нужным.
Для универсальных коллекций существуют такие общие понятия, как индекс и номер:
- Каждый элемент коллекции имеет индекс. При этом индекс начинается с нуля .
- Для некоторых коллекций (преимущественно у тех, которые могут отображаться в интерфейсе пользователя) существует понятие номера строки. Номер строки начинается с единицы (например, для табличной части).
Таким образом, если мы знаем номер строки и хотим обратиться по индексу, то в качестве индекса следует использовать значение на единицу меньше номера строки.
Для всех коллекций используется обход элементов коллекции двумя способами:
Методы большинства универсальных коллекций:
- Количество – метод, который возвращает количество элементов коллекции.
- Индекс - метод, который позволяет определить, какой индекс соответствует данной строке (т.е. текущую позицию строки в таблице). Значения индекса начинаются с нуля. Существует не у всех коллекций, а только у тех, на элементы которой можно сослаться.
В качестве примера можно привести ТаблицуЗначений. ТаблицаЗначений – это определенная коллекция строк, в строках могут содержаться разные колонки с разными типами значений. Каждая строка представляет собой самостоятельную сущность. На нее можно получить ссылку, через эту строку можно обращаться к значениям колонок в данной строке. Метод Индекс позволяет определить, какой индекс соответствует данной строке (т.е. текущую позицию строки в таблице).
Типы универсальных коллекций 1С:
Массив
Массив - пронумерованная коллекция значений произвольного типа.
К элементу массива можно обращаться по его индексу.
В качестве элементов массива могут выступать, в частности, другие массивы. Это позволяет создавать многомерные массивы.
Для того чтобы обратиться к элементу массива МойМассив, можно использовать обращение по индексу, который указывается в квадратных скобках.
Так как индекс начинается с нуля , система возвращает элемент массива с индексом 2, но четвертый (по порядку) элемент массива.
Структура
Структура - поименованная коллекция, состоящая из пар "ключ - значение". Обычно используется для хранения небольшого количества значений, каждое из которых имеет некоторое уникальное имя.
Ключ может быть только строковым , значение - произвольного типа.
К элементу структуры можно обращаться по значению его ключа, т.е. по имени.
Соответствие
Также как и структура, представляет собой коллекцию пар ключ - значение. Однако, в отличие от структуры, ключ может быть практически любого типа .
Список значений
Список значений позволяет строить динамические наборы значений и манипулировать ими (добавлять, редактировать, удалять элементы, сортировать). Используется, как правило, для решения интерфейсных задач.
Особенности списка значений:
- может содержать значения любого типа;
- в одном списке типы хранимых значений могут быть разными.
Например, список значений может использоваться для выбора конкретного документа из списка возможных документов, сформированного по сложному алгоритму.
Таблица значений
Таблица значений позволяет строить динамические наборы значений и манипулировать ими.
Особенности таблицы значений:
- может быть наполнена значениями любого типа;
- в одной таблице типы хранимых значений могут быть разными.
Одним из примеров использования таблицы значений может служить организация представления в форме списка элементов справочника, отобранных по сложному алгоритму.
Дерево значений
Дерево значений представляет собой динамически формируемый набор значений любого типа, похожий на таблицу значений.
В отличие от таблицы значений , строки дерева значений могут образовывать иерархические структуры: каждая строка дерева может иметь набор подчиненных строк, каждая из подчиненных строк, в свою очередь, также может иметь набор подчиненных строк и так далее.
При этом поиск значений, сортировка, получение итогов могут осуществляться либо по текущему уровню иерархии, либо включая все подчиненные.
COMSafeArray
COMSafeArray представляет собой объектную оболочку над многомерным массивом SAFEARRAY из COM. Позволяет создавать и использовать SAFEARRAY для обмена данными между COM-объектами.
ФиксированныйМассив
Неизменяемый массив, который заполняется системой при инициализации объектов данного типа или разработчиком, с помощью конструктора.
ФиксированнаяКолекция
Системная коллекция значений. Используется в качестве значений свойств других объектов. Заполняется системой при инициализации объектов данного типа.
Набор свойств этого объекта определяется в зависимости от контекста его использования и описан подробнее в описании тех свойств, где он используется.
Создать этот объект средствами встроенного языка нельзя.
ФиксированноеСоответствие
Представляет собой неизменяемую коллекцию пар КлючИЗначение .В качестве ключа может выступать любое значение ( рекомендуется значение примитивного типа или другого типа, значение которого может только присваиваться, но не может менять свое содержимое).
Если при обращении к элементу коллекции с помощью оператора [], указан несуществующий ключ, будет вызвано исключение.
В то же время метод Получить , в параметре которого указан несуществующий ключ, возвращает значение Неопределено.
ФиксированнаяСтруктура
Представляет собой фиксированную коллекцию пар КлючИЗначение .
При этом ключ может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка.
К значениям структуры можно обращаться как к свойствам объекта. При этом ключ используется как имя свойства.
Предназначен для использования в качестве значений параметров сеанса.
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Читайте также: