При проектировании регистров сведений в 1С начинающие разработчики часто сталкиваются с дилеммой: как совместить требования к уникальности данных и необходимость быстрого поиска (отбора) по заданным полям. Рассмотрим по шагам, как выстроить структуру регистра правильно.
В независимом регистре сведений уникальность записи определяется набором его измерений. Если в вашем случае запись должна быть уникальной в разрезе документа (то есть для каждого документа возможна только одна запись), то поле Документ обязательно должно быть измерением. Если вы вынесете его в ресурсы, вы потеряете контроль над уникальностью на уровне платформы, и система позволит создавать дублирующие записи для одного и того же документа.
Многие ошибочно полагают, что поля, по которым планируется отбор в запросах, обязательно нужно делать измерениями. На самом деле:
Если вам нужно фильтровать данные по Дате или ПризнакуБулево, помните, что избыточное количество измерений увеличивает нагрузку на СУБД при записи, так как при каждом изменении данных перестраиваются индексы. Если уникальность привязана к документу, структура Измерение: Документ и Ресурсы: Дата, ПризнакБулево является классической и наиболее эффективной.
Разберем важный технический нюанс: индексация полей типа Булево. Поле с типом Булево имеет крайне низкую селективность (всего два возможных значения). Оптимизаторы СУБД (например, MS SQL Server или PostgreSQL) крайне редко используют такие индексы, предпочитая полное сканирование таблицы, так как это быстрее и выгоднее по ресурсам.
Если вы все же решили индексировать поля, обратите внимание на следующие моменты:
Даты часто бывает полезна, если выборки идут по диапазонам (например, ГДЕ Дата МЕЖДУ &Начало И &Конец).Для вашего случая рекомендуем придерживаться следующей стратегии:
Документ первым измерением. Это гарантирует уникальность и обеспечит наличие эффективного кластерного индекса по документу.Дата и ПризнакБулево вынесите в ресурсы (если нет необходимости делать их измерениями для уникальности).Дату в состав измерений, но будьте готовы к тому, что теперь уникальность будет проверяться по связке Документ + Дата.Рассмотрим, как СУБД выполняет запрос. Если вы пишете запрос:
ВЫБРАТЬ
РС.Документ
ИЗ
РегистрСведений.МойРегистр КАК РС
ГДЕ
РС.Дата = &Дата
И РС.ПризнакБулево = ИСТИНА
Если Дата индексирована, СУБД выполнит поиск по индексу Дата, а затем отфильтрует полученный результат по значению ПризнакБулево. Если ПризнакБулево не проиндексирован, это не станет катастрофой для системы, так как фильтрация по уже отобранному набору строк (после индекса по дате) произойдет очень быстро.
В заключение: проектируйте структуру исходя из бизнес-логики (уникальность), а производительность проверяйте замерами и планами выполнения запросов, а не попытками «заиндексировать всё», что часто приводит к неоправданному замедлению процессов записи в базу данных.