В процессе проектирования высоконагруженных систем на платформе 1С:Предприятие перед разработчиком часто встает вопрос оптимизации объема хранимых данных. Один из классических сценариев — выбор типа данных для хранения состояния объекта в регистре сведений. Что эффективнее: хранить состояние в виде строки или завести отдельный справочник и хранить ссылку? Давайте подробно разберем, как платформа 1С и системы управления базами данных (СУБД) обрабатывают эти типы данных.
Для начала проанализируем, что представляет собой ссылка в контексте хранения данных. Любая ссылка на объект метаданных (справочник, документ) в 1С:Предприятии — это уникальный идентификатор (GUID).
Ссылка определенного типа занимает ровно 16 байт.
Это значение фиксировано для полей, где в метаданных жестко указан один тип объекта (например, СправочникСсылка.Статусы). Независимо от того, насколько длинное «Наименование» или «Код» у элемента справочника, в таблице регистра, который ссылается на этот элемент, всегда будет записано ровно 16 байт бинарных данных.
Теперь рассмотрим альтернативу — хранение состояния в текстовом виде. Для понимания объема нам нужно знать, как 1С работает с кодировкой. Платформа использует кодировку Unicode (стандарт UCS-2), где на каждый символ выделяется фиксированное количество памяти.
В 1С каждый символ строки занимает 2 байта.
Проведем простые расчеты для сравнения:
Таким образом, математический порог эффективности — это 8 символов. Если ваше описание состояния короче 8 символов, строка теоретически занимает меньше места. Если длиннее — ссылка становится компактнее.
Проанализируем ситуацию, когда поле имеет «составной тип» (например, ссылка может указывать и на справочник «Статусы», и на справочник «ДополнительныеСостояния»). В этом случае структура хранения в СУБД (MS SQL Server или PostgreSQL) усложняется.
При использовании составного типа к базовым 16 байтам идентификатора добавляются служебные поля, описывающие тип ссылки. Обычно это добавляет от 1 до 4 дополнительных байт. В итоге запись может занимать 17–20 байт и более. Рассмотрим это на примере структуры таблиц SQL: для составного типа платформа может создавать отдельные колонки под каждый тип или использовать специальные типизированные поля, что в любом случае увеличивает накладные расходы на хранение каждой записи регистра.
Выясним причину, почему нельзя оценивать только размер ссылки в регистре. Если мы выбираем вариант со справочником, нам необходимо учитывать место, которое занимает сама запись в таблице этого справочника. Каждая запись справочника включает в себя:
ПометкаУдаления (1 байт), Предопределенный (1 байт) и другие.Даже самый простой справочник с коротким наименованием занимает в базе около 60–100 байт на одну запись. Однако, если записей в справочнике всего 10, а записей в регистре сведений — миллионы, эти накладные расходы ничтожны по сравнению с экономией в основной таблице регистра.
Важно понимать разницу в скорости обработки данных процессором СУБД. Посмотрим на ситуацию с точки зрения производительности:
Если набор состояний ограничен (например, «Новый», «В работе», «Закрыт») и не будет меняться пользователем в режиме «1С:Предприятие», проанализируем вариант использования Перечисления (Enum).
С точки зрения хранения в регистре, ссылка на перечисление также занимает 16 байт. Однако перечисление лишено недостатков справочника:
Рассмотрим пошаговый алгоритм выбора типа данных для хранения состояний:
Помните, что современные СУБД поддерживают механизмы сжатия данных. Если в колонке регистра миллион раз повторяется строка «Активен», СУБД при включенном сжатии страниц упакует её крайне эффективно, и разница в байтах между ссылкой и строкой на диске может стать практически незаметной. В этом случае на первый план выходит не экономия места, а удобство написания кода и архитектурная чистота решения.