При разработке решений на платформе 1С мы нередко сталкиваемся с ситуациями, когда, казалось бы, простой отбор данных по реквизиту документа не дает ожидаемого результата. Особенно это становится заметно, когда реквизит имеет тип, заданный через ОпределяемыйТип. Давайте вместе разберем эту проблему и найдем эффективное решение.
Представим, что мы пытаемся получить выборку документов, используя прямой метод, например, Документы.ИмяДокумента.Выбрать(), и хотим применить отбор по реквизиту, который является ОпределяемымТипом (например, реквизит "Организация", чей тип определен как ОпределяемыйТипСсылкаНаОрганизацию). Мы ожидаем получить отфильтрованные данные, но метод возвращает либо пустую выборку, либо игнорирует условие отбора.
Проанализируем ситуацию. Как показывает практика и опыт многих разработчиков, основная причина такого поведения кроется в отсутствии или некорректной настройке индексирования базового реквизита, который участвует в отборе. Даже если реквизит использует ОпределяемыйТип, для эффективной работы прямых методов выборки данных, таких как Документы.ИмяДокумента.Выбрать(), необходимо, чтобы сам реквизит был проиндексирован в конфигураторе.
Платформа 1С использует индексы для быстрого поиска и сортировки данных в базе данных. Если реквизит не проиндексирован, системе приходится выполнять полное сканирование таблицы документов для каждого отбора, что значительно замедляет работу и, в некоторых случаях, может приводить к игнорированию условий отбора при использовании определенных механизмов платформы.
Давайте рассмотрим подробнее, как мы можем решить эту проблему, настроив индексирование реквизита.
Откроем конфигуратор: Переходим в режим конфигуратора для нашей информационной базы.
Найдем нужный документ и реквизит: В дереве объектов конфигурации найдем документ, с которым мы работаем, и в его составе — реквизит, по которому выполняется отбор (например, "Организация").
Проверим свойство "Индексировать": Откроем свойства этого реквизита. Нас интересует свойство "Индексировать".
Установим необходимое значение: Если свойство установлено в значение "Не индексировать" или не задано, нам необходимо выбрать одно из следующих значений:
"Индексировать": Этот вариант создает индекс по самому реквизиту. Он значительно ускоряет поиск по значениям этого реквизита. Платформа также добавляет ссылку на объект в индекс, чтобы обеспечить уникальность и определенный порядок записей при наличии повторяющихся значений реквизита.
"Индексировать с дополнительным упорядочиванием": Этот вариант создает более сложный индекс. Помимо самого реквизита, в индекс включается поле, которое часто используется для упорядочивания объектов данного типа. Например, для документов это может быть Дата, для справочников — Код или Наименование. Этот тип индекса особенно эффективен для оптимизации работы динамических списков, где часто используются отборы и сортировки по данному реквизиту.
Для нашей задачи, как правило, достаточно установить значение "Индексировать".
Обновим конфигурацию базы данных: После изменения свойства реквизита необходимо сохранить конфигурацию и обновить конфигурацию базы данных. Это приведет к физическому созданию индекса в СУБД.
После выполнения этих шагов мы увидим, что отбор по реквизиту с ОпределяемымТипом при прямой выборке документов начнет работать корректно и значительно быстрее.
Давайте также разберем, что такое ОпределяемыеТипы и почему они важны, но не отменяют необходимость индексирования.
ОпределяемыеТипы — это мощный механизм, появившийся в платформе 1С 8.3, который позволяет нам описывать часто используемые или потенциально изменяемые типы данных в одном месте конфигурации. Мы можем использовать один и тот же ОпределяемыйТип в различных реквизитах документов, измерениях регистров и т.д.
Преимущества использования ОпределяемыхТипов очевидны:
ОпределяемыйТип (например, добавить новый вид справочника), достаточно внести изменения только в определение самого типа. Все реквизиты, использующие его, автоматически обновятся.Однако важно понимать, что ОпределяемыеТипы упрощают *описание* структуры данных, но не отменяют необходимость правильной *индексации* базовых реквизитов для эффективной работы механизмов отбора и поиска. Проблема, с которой мы столкнулись, является ярким тому подтверждением. Платформа 1С, при выполнении прямых выборок, работает с физическими данными в базе, и наличие индекса для конкретного реквизита критически важно, независимо от того, является ли его тип базовым или ОпределяемымТипом.
Чтобы обеспечить оптимальную производительность нашей системы, давайте посмотрим на общие рекомендации по работе с индексами:
Используйте автоматически созданные индексы: Платформа 1С автоматически создает индексы для ключевых полей, таких как Ссылка для справочников и документов, или Регистратор для регистров. Эти индексы всегда активны и используются системой.
Создавайте дополнительные индексы осознанно: Дополнительные индексы следует создавать только для тех реквизитов, по которым часто выполняются отборы, сортировки или соединения в запросах.
Избегайте избыточного индексирования: Слишком большое количество индексов может негативно сказаться на производительности операций записи (добавление, изменение, удаление данных), так как при каждой модификации данных все связанные индексы также должны быть обновлены.
Учитывайте ширину столбцов: Избегайте индексирования очень "широких" (больших по объему) текстовых полей, так как это может увеличить потребление памяти и снизить общую производительность.
Оптимизация для запросов: При использовании запросов на языке 1С, хотя они и более гибки, производительность также будет зависеть от наличия подходящих индексов. Для оптимальной работы индекс должен содержать все поля, указанные в условии отбора, и эти поля должны располагаться в начале индекса и идти подряд.
Итак, мы выяснили, что ключ к решению проблемы с отбором по реквизиту ОпределяемогоТипа при прямой выборке документов лежит в правильной настройке индексирования этого реквизита в конфигураторе. Не забывайте, что ОпределяемыеТипы упрощают разработку и поддержку, но не снимают с нас ответственности за грамотную работу с индексами для обеспечения высокой производительности и корректной работы системы. Применяя эти знания, мы можем значительно улучшить стабильность и скорость работы наших прикладных решений на платформе 1С.