Получить значение по индексу 1с

Обновлено: 08.07.2024

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путём последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.

Если простым языком индекс похож на содержание книги, когда вам надо найти что-то в книге у вас два варианта:

1. Если содержания нет - просмотреть всю книгу с первой по последнюю страницу в поисках нужной главы. Повторять это для каждого запроса.

2. Зайти в содержание (индекс), найти быстро номер страницу нужной главы (адрес). Перейти на нужную страницу.

Понятно что второй способ занимает, особенно если книга большая*, намного меньше времени. А если повторять это многократно то время экономится глобально (читай - ресурсы сервера).

* - Важно! Если книга очень маленькая, то использование содержания (индекса) становится бесполезным и даже вредным, проще просмотреть две страницы и сразу выяснить искомую главу.

Как выглядят индексы в базе 1С

В файловом режим базы данных (*.1cd) индексы не увидишь, а вот если база в клиент-серверном варианте, то индексы выглядят в консоли СУБД примерно так:

Как добавить индексы в 1С

В базу 1С индексы могут быть добавлены двумя способами:

1. Платформой автоматически. Независимо от действий программиста, при создании объектов метаданных в дереве (справочники, документы, регистры), одновременно с созданием в БД соотвествущей таблицы (таблиц), платформа создает и индексы для этих таблиц.

2. Явным указанием программиста. Программист может частично управлять созданием индекса, в "свойствах" реквизита для этого выделен специальный элемент "индексировать":

Конкретно в этом случае не используется разделение данных и ОРРХ | ОРНР1 не будет. Значит будет создан индекс "Реквизит + Ссылка", включающий в себя целевой реквизит "вид номенклатуры" и еще колонку "ссылка", составной индекс по двум полям таблицы.

Справка 1С:

Кроме варианта "Индексировать" в данном свойстве для большинства объектов можно установить вариант "Индексировать с доп. упорядочиванием". Данный вариант предназначен, прежде всего, для использования в динамических списках.

В варианте "Индексировать" строится индекс непосредственно по реквизиту. Индекс также дополняется ссылкой, чтобы обеспечить определенный порядок записей в индексе при повторяющихся значениях реквизита.

В варианте "Индексировать с доп. упорядочиванием" индекс строится по реквизиту, а также по некоторому полю, которое обычно используется для упорядочивания объектов этого типа. Для справочника индекс в зависимости от основного представления дополняется кодом или наименованием. А для документа, индекс дополняется датой. Этот индекс также дополняется ссылкой.

Таким образом при определении варианта свойства Индексировать следует исходить из того, какие варианты выборки информации необходимо оптимизировать в первую очередь. Например, если требуется просмотр списка с отбором по реквизиту, то имеем смысл использовать вариант "Индексировать с доп. упорядочиванием". А если индекс нужен, например, только для поиска с помощью запроса объектов по данному реквизиту без упорядочивания, то лучше использовать вариант "Индексировать", чтобы создаваемые индекс требовал меньше ресурсов системы.

Есть еще один способ явно указать платформе что надо создать индекс, необходимо этот реквизит справочника включить в какой-нибудь "критерий отбора".

Есть еще один способ - добавить индекс в вашем запросе, используется для временных таблиц. Во время написания запроса пишем "ИНДЕКСИРОВАТЬ ПО" после которого перечислить поля, по которым нужно построить индекс. Например:

Поля, по которым происходит индексирование, должны находиться в списке выборки.

Можно ли обойти ограничения платформы по индексам

Ограничение платформы - 1С сама добавляет к вашему индексу дополнительные колонки, т.е. делает его составным. А вот если вы решили сделать составной индекс из нескольких реквизитов, то эта возможность наоборот отсутствует.

Частично можно обойти ограничение следующим образом. Вычислить имя таблицы, есть обработки которые показывают настоящие имена таблиц, создать запрос создания индекса, примерно такой:

Выполняем его в консоли СУБД, готово индекс добавлен и будет работать.

Есть проблема, при реструктуризации базы данных (например после изменения справочника) все те индексы, что Вы создадите скриптами самостоятельно будут удалены. Вам потребуется заново запустить эти скрипты после реструктуризации, например, добавив их в Jobs на сервере СУБД на ежедневный запуск.

Внимание! Прежде чем лепить свои индексы попробуй оптимизировать код запроса средствами 1С, возможно одно добавленное условие, или смена порядка, приведет к "попаданию в индекс" и запрос ускорится в разы! Также не забывай что у тебя есть способ указать для реквизита "индексировать".

Как обслуживать индексы в базе 1С

А надо что-то делать? Ведь индексы уже созданы автоматически? Да, надо. Необходимо еженедельно\ежедневно и в некоторых случая частично ежечасно обновлять данные в индексах, чтобы они работали действительно эффективно. Для этого существуют стандартные команды обновления и\или перестроения индекса которые необходимо отправлять СУБД. Как правило для этого создают регламентную работу на сервере СУБД и она выполняется автоматически.

В MSSQL это можно сделать одной мышью в "планах обслуживания" - создаем задачу, указываем базу - готово. Выглядит примерно так.

Штатная реиндексация в 1С

В конфигураторе через меню Администрирование - Тестирование и исправление, можно попасть в форму где можно выбрать работу по реиндексации текущей базы.

Для измерений, реквизитов и т.д. применяются условные имена Измерение1, Реквизит1 и т.д.
Для общих реквизитов, являющихся разделителями в режиме "независимо", будем использовать имена ОРНР (ОРНР1, ОРНР2, и т.д.).
Для общих реквизитов, являющихся разделителями в режиме "независимо и совместно", будем использовать имена ОРСР.
Если режим разделения не имеет значения, то для общих реквизитов, являющихся разделителями, будем использовать имена ОРР.
Если в конфигурации определены разделители, то в индексы может входит поле, которое содержит значение хэш-функции набора значений разделителей. Такое поле будем обозначать именем ОРРХ.
Те индексные поля, которые не являются обязательными приведены в квадратных скобках, а если в индексе присутствует набор однотипных полей, это описывается многоточием, например: Реквизит + Измерение1 + [Измерение2 +. ].

Данным материалом следует руководствоваться при написании текстов запросов с целью оптимизации времени их исполнения.

Справочник

Основные индексы

[ОРНР1 + . +] Ссылка (Кластерный)

Всегда.
В индекс входят поля независимых разделителей, которые разделяют этот справочник.

[ОРРХ | ОРНР1 +] Код + Ссылка

Свойство "Длина кода" не равно 0.
Если справочник разделяется одним независимым разделителем, тип которого не Строка, то индекс содержит поле этого разделителя.
Если тип разделителя - Строка, или разделитель независимый и совместный, или разделителей больше одного, то индекс содержит поле значения хэш-функции значений разделителей.
Это правило справедливо для всех индексов, в составе которых указано [ОРРХ | ОРНР1 +].

[ОРРХ | ОРНР1 +] Наименование + Ссылка

Свойство "Длина наименования" не равно 0.

[ОРРХ | ОРНР1 +] Реквизит + Ссылка

Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать".

[ОРРХ | ОРНР1 +] Реквизит + Код + Ссылка

Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина кода" не равно 0, а свойство "Основное представление" равно "В виде кода".

[ОРРХ | ОРНР1 +] Реквизит + Наименование + Ссылка

Для реквизита "Реквизит" свойство "Индексировать" установлено в значение "Индексировать с доп. упорядочиванием" и при этом свойство "Длина наименования" не равно 0, а свойство "основное представление" равно "В виде наименования".

[ОРРХ | ОРНР1 +] Реквизит

Справочник включен в критерий отбора через реквизит "Реквизит".

[ОРРХ | ОРНР1 +] PredefinedID

Индекс по идентификатору предопределенного объекта метаданных.

Дополнительные индексы для подчиненного справочника (вне зависимости от иерархичности справочника)

[ОРРХ | ОРНР1 +] Владелец + Ссылка

Свойство "Длина кода" равно 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С 8.3 представляют собой совокупность упорядоченных значений любого типа, в том числе и типа «массив», что в свою очередь позволяет организовывать многомерные массивы. Идентификация значений осуществляется по индексам, нумерация которых начинается с «0».

Создание массива

Синтаксис:

Примеры:

Добавление элементов в массив

Примеры:


Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>



Получение значения элемента по индексу

Поиск в массиве 1С

Присвоение значений элементам массива

Примеры:

Как узнать количество элементов массива (размер массива)

Перебор массива 1С

Примеры:

Перебор всех элементов двумерного массива

Примеры:

Удаление элементов из массива

Примеры:

Как разложить строку в массив


Пример преобразования массива в список значений


Пример преобразования массива в таблицу значений


Сортировка массива 1С разными способами

Примеры:

Как свернуть массив в 1С

Пример:


Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Услуги 1С

Наш канал на Youtube


При использовании данного сайта, вы подтверждаете свое согласие на использование файлов cookie в соответствии с настоящим уведомлением в отношении данного типа файлов. Если вы не согласны с тем, чтобы мы использовали данный тип файлов, то вы должны соответствующим образом установить настройки вашего браузера или не использовать сайт.

Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.


Как создать массив

Для создания массива в 1С используется ключевое слово Новый после которого указывается имя класса.

В переменной МассивЗначений будет находиться массив.

В конструкторе массива можно указать количество элементов:

МассивЗначений = Новый Массив ( 8 ) ; //в массиве 8 элементов

Сразу после создания все элементы массива будут равны Неопределено. При этом размер массива может быть изменен, при добавлении в него новых элементов.

Для добавления элементов используется метод Добавить:

Можно добавлять новые элементы в массив через метод Вставить, с указанием индекса, куда нужно вставить новый элемент. Если указать индекс больше чем количество элементов в массиве, то в массив будет добавлено нужное количество элементов со значением Неопределено:

//в массиве [Первый, Второй, Третий, Неопределено, Неопределено, Шестой]

Количество элементов в массиве

При добавлении каждого нового элемента в массив, количество элементов увеличивается на единицу. Получить общее количество элементов в массиве можно с помощью метода Количество:

Индекс массива

//будет ошибка Индекс находится за границами массива

Граница массива

Получить элемент массива

Получить элемент массива можно через квадратные скобки или методом Получить:

Перебор массива

С помощью цикла Для Каждого:

Через цикл Для Каждого нельзя изменить значения массива, меняться будет переменная ЭлементМассива.

Перебрать массив можно и через цикл Для. В этом случае через индекс можно изменять значения массива:

//метод ВГраница() возвращает максимальный индекс массива

Поиск в массиве

Для поиска значений в массиве предназначен метод Найти. Параметром нужно передать значение, которое нужно найти в массиве. А вернет метод индекс элемента в массиве, если он найден, и Неопределено, если такого значения нет в массиве. Нужно учитывать, что чем больше массив, тем медленнее будет выполняться поиск в нем, так как поиск в массиве выполняется перебором всех элементов.

Читайте также: