Разработка и Конфигурация · 9 мин
Измерение и ресурс в 1С: в чём разница и как не ошибиться при проектировании
Разбираем разницу между измерением и ресурсом в регистрах 1С: назначение, примеры, типичные ошибки проектирования и как проверить правильность структуры.
При создании регистра сведений или регистра накопления в 1С разработчик обязательно сталкивается с двумя типами полей: измерения и ресурсы. От того, насколько правильно данные распределены между ними, зависят скорость запросов, корректность итогов и даже возможность получить нужный отчёт без доработок. Ошибка на этом этапе — одна из самых дорогих: переносить данные между измерением и ресурсом в работающей базе сложно и рискованно.
Разница между измерением и ресурсом лежит в самой логике хранения. Измерение отвечает на вопрос «в разрезе чего хранится значение», а ресурс — «что именно хранится». Например, в регистре «Цены номенклатуры» измерениями будут «Номенклатура» и «Вид цены», а ресурсом — «Цена»: цена хранится в разрезе товара и вида цены.
Что такое измерение и какую роль оно играет
Измерение — это реквизит регистра, который формирует аналитический разрез хранения данных. Совокупность измерений (плюс период для периодических регистров и регистратор для подчинённых регистров) образует уникальный ключ записи. Платформа не позволит записать две строки с одинаковым набором значений измерений: вторая запись либо заменит первую (в регистре сведений), либо вызовет ошибку уникальности.
Именно по измерениям строятся индексы, выполняются отборы и срезы. Когда вы в запросе пишете условие ГДЕ Номенклатура = &Номенклатура, поиск идёт по индексу измерения — быстро. Если бы тот же реквизит был ресурсом, отбор по нему потребовал бы полного сканирования таблицы.
Типичные примеры измерений: «Номенклатура», «Склад», «Организация», «Контрагент», «Валюта», «Сотрудник». Общий признак — это ссылочные или перечислимые значения, по которым данные группируются и фильтруются.
Что такое ресурс и как он используется
Ресурс — это значение, которое регистр хранит в заданном разрезе измерений. В регистрах накопления ресурсы, как правило, числовые: «Количество», «Сумма», «СуммаНДС». По ним платформа автоматически рассчитывает итоги и остатки. В регистрах сведений ресурсом может быть что угодно: цена, курс валюты, статус, дата, строка, булево.
Ключевая особенность ресурсов регистра накопления — поддержка агрегатных функций. Виртуальные таблицы «Остатки» и «Обороты» строятся именно по ресурсам: запрос Остатки.КоличествоОстаток вернёт сумму движений по ресурсу «Количество» в разрезе измерений. Если бы «Количество» ошибочно сделали измерением, получить остаток штатными средствами было бы невозможно.
Ресурс может меняться при том же ключе измерений. Например, цену товара в регистре сведений можно перезаписать, не создавая новую строку, — изменится только значение ресурса.
Сравнение измерения и ресурса по ключевым признакам
| Признак | Измерение | Ресурс |
|---|---|---|
| Назначение | Аналитический разрез (в разрезе чего) | Хранимое значение (что храним) |
| Ключ записи | Входит в уникальный ключ | Не входит, может меняться |
| Индексы и отборы | Индексируется, быстрый отбор | Отбор медленный, без индекса |
| Итоги и остатки | Задают разрез итогов | По ним считаются суммы |
| Типичные типы | Ссылки, перечисления | Числа, даты, строки, булево |
| Изменение структуры | Требует переноса данных | Требует переноса данных |
Из таблицы видно главное практическое следствие: если по полю нужно отбирать, группировать или строить уникальность — это измерение. Если по полю нужно суммировать, получать остатки или просто хранить значение — это ресурс.
Как решить, куда поместить новое поле
При проектировании задайте о поле три вопроса. Первый: участвует ли оно в уникальной идентификации записи? Если две записи с разными значениями этого поля — это разные строки, поле должно быть измерением. Второй: нужно ли по полю фильтровать и группировать данные в отчётах и запросах? Если да — измерение, иначе отборы будут медленными. Третий: нужно ли по полю считать суммы, остатки или обороты? Если да — только ресурс.
Классический пример дилеммы — «Характеристика номенклатуры». Если учёт остатков ведётся по характеристикам, она обязательно измерение: иначе остатки по характеристикам не получить. А вот «Комментарий к строке» — очевидный ресурс или реквизит: по нему не фильтруют и не группируют.
Как выбрать тип поля
Реквизиты регистра — третий вариант, о котором забывают
Кроме измерений и ресурсов у регистра есть реквизиты. Это дополнительная информация, которая не входит в ключ записи, не участвует в итогах, но сохраняется вместе со строкой. Типичные примеры: «Ответственный», «Комментарий», «Документ-основание» в регистре сведений.
Частая ошибка — делать реквизиты измерениями «на всякий случай». Каждое лишнее измерение расширяет уникальный ключ, увеличивает индексы и замедляет запись. Обратная ошибка — помещать в ресурс то, по чему потом потребуется отбор: запросы начнут тормозить, а переделка структуры в заполненной базе потребует переноса данных.
Особенности для разных видов регистров
Регистр сведений
В регистре сведений измерения полностью определяют уникальность записи (вместе с периодом для периодических). Ресурсы здесь не суммируются платформой — это просто хранимые значения. Пример: регистр «Курсы валют» с измерением «Валюта» и ресурсами «Курс» и «Кратность». Получение актуального значения делается через виртуальную таблицу «СрезПоследних», которая работает по ключу измерений.
Регистр накопления
В регистрах накопления вида «Остатки» ресурсы числовые и по ним автоматически поддерживаются итоги. Измерения задают разрез остатков: товар, склад, организация. В регистрах вида «Обороты» итоги по записям не хранятся, но обороты по ресурсам доступны всё равно. Здесь ошибка в выборе особенно критична: ресурс, сделанный измерением, лишает вас виртуальных таблиц «Остатки» и «Обороты» по этому значению.
Как проверить правильность структуры до запуска
Перед тем как заполнить регистр данными, прогоните структуру через контрольные вопросы: можно ли по каждому измерению осмысленно сгруппировать данные, нужны ли по каждому ресурсу итоги, нет ли в измерениях полей с большим числом «мусорных» значений вроде комментариев. Полезно набросать 3–5 тестовых записей и попробовать построить по ним типовой отчёт — несостыковки всплывут сразу.
Если регистр уже в работе и структура оказалась ошибочной, изменение потребует переноса данных: создания нового поля, обработки переноса значений, перепроведения документов. На больших таблицах это часы работы и риск рассинхронизации, поэтому такие изменения выполняют на копии базы с последующей проверкой итогов.
Как проверить результат
Запрос выполняется быстро, план показывает использование индекса
Полное сканирование таблицы, отчёт «подвисает»
Нужный числовой показатель доступен как ресурс итогов
Показателя нет в остатках — он ошибочно сделан измерением
Повторная запись с тем же ключом заменяет значение ресурса
Появляются дубли строк из-за лишнего измерения в ключе
Частые вопросы
Можно ли использовать ресурс в отборе запроса?
Технически да, условие по ресурсу в запросе работает. Но индекса по ресурсу нет, поэтому на больших таблицах такой отбор будет медленным. Если фильтрация по полю нужна регулярно, поле следует сделать измерением.
Может ли измерение быть числовым?
Может, и иногда это оправдано — например, измерение «Процент ставки» в регистре скидок. Но число, которое нужно суммировать или по которому считаются остатки, числовым измерением быть не должно — только ресурсом.
Чем реквизит регистра отличается от ресурса?
Ресурс — это основное хранимое значение, по которому в регистрах накопления считаются итоги. Реквизит — вспомогательная информация к строке, не участвующая ни в ключе, ни в итогах. В регистре сведений разница тоньше: оба хранят значения, но ресурс считается «главным» содержимым записи.
Сколько измерений может быть у регистра?
Платформа допускает десятки измерений, но практический предел ниже: каждое измерение расширяет ключ и индексы. Если измерений больше 5–7, стоит пересмотреть структуру — возможно, часть полей должна быть реквизитами или вынесена в отдельный регистр.
Что будет, если в регистре сведений записать строку с уже существующим набором измерений?
Новая запись заменит старую: значения ресурсов и реквизитов будут перезаписаны. Это штатное поведение, на нём основано обновление цен, курсов и настроек. Ошибки уникальности не возникает именно потому, что ключ определяет одну строку.
Как безопасно перенести поле из ресурса в измерение в рабочей базе?
Сделайте резервную копию, добавьте новое измерение, напишите обработку, которая читает существующие записи и перезаписывает их с заполненным новым полем, сверьте итоги до и после. Только после успешной проверки удаляйте старый ресурс. Всю операцию сначала отрабатывайте на копии базы.
Что важно запомнить
Измерение задаёт разрез хранения и входит в ключ записи, ресурс — хранимое значение, по которому считаются итоги. Поля для отборов и группировок делайте измерениями, суммируемые показатели — ресурсами, справочные пометки — реквизитами. Изменение структуры в заполненной базе выполняйте только через копию и перенос данных.