Как решить проблему раздувания таблиц и большого размера базы при использовании дополнительных реквизитов БСП в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При использовании типового механизма дополнительных реквизитов и сведений из Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с лавинообразным ростом физического размера базы данных. Особенно остро эта проблема проявляется в файловых базах данных (формат .1CD), где размер одной таблицы жестко ограничен лимитами файловой системы и движка платформы. Ситуация, когда пустые или булевые реквизиты занимают килобайты пространства в каждой строке, требует глубокого понимания физики хранения данных в 1С и применения правильных архитектурных решений.

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

Физика хранения составных типов данных в платформе 1С

Для начала выясним причину проблемы. В БСП табличная часть ДополнительныеРеквизиты любого справочника содержит реквизиты Свойство (ссылка на План видов характеристик) и Значение. Поле Значение имеет составной тип данных, определяемый ПВХ ДополнительныеРеквизитыИСведения. Набор доступных типов в этом ПВХ включает Булево, Число, Дата, Строка, а также ссылки на различные справочники конфигурации.

На уровне СУБД (будь то файловая база или SQL-сервер) платформа «1С:Предприятие» не может создать одну универсальную «резиновую» колонку для составного типа. Вместо этого СУБД физически раскладывает составной тип на несколько колонок под каждый базовый тип. В нашем примере поле Значение (в СУБД оно может называться, например, _FLD3633) разворачивается в целое семейство колонок:

  1. _FLD3633_TYPE — байт-идентификатор типа (определяет, какой именно тип сейчас записан в строке).
  2. _FLD3633_L — колонка для хранения Булево (1 байт).
  3. _FLD3633_N — колонка для Числа.
  4. _FLD3633_T — колонка для Даты.
  5. _FLD3633_RRef — колонка для хранения уникального идентификатора ссылки UUID (16 байт).
  6. _FLD3633_S — колонка для Строки ограниченной длины.

В чем кроется главная проблема файлового варианта (.1CD)? В отличие от современных клиент-серверных СУБД (MS SQL Server, PostgreSQL), которые динамически выделяют память под строки переменной длины и эффективно сжимают пустые поля (NULL/разреженные столбцы), внутренний формат файловой базы 1С устроен гораздо проще. Если в ПВХ разрешена строка ограниченной длины (например, до 1024 символов), то под колонку _FLD3633_S резервируется строго фиксированное место под максимальный размер. Каждый символ Unicode в кодировке UTF-16 занимает ровно 2 байта. Соответственно, строка длиной 1024 символа гарантированно резервирует 2048 байт (около 2 Кб) в файле базы данных.

Это место выделяется в файле данных для каждой строчки табличной части, даже если в этой строке фактически записано простое Булево «Истина/Ложь» или ссылка на справочник, а текстовое поле абсолютно пустое. В итоге, если у одной характеристики номенклатуры создано 10 дополнительных реквизитов (пусть даже простых флажков), каждая строка табличной части будет «весить» более 2 Кб, а сам элемент справочника с его табличной частью займет в базе порядка 20 Кб. При наличии сотен тысяч позиций номенклатуры и характеристик файловая база мгновенно исчерпает лимит размера файлов таблиц (4 ГБ или 6 ГБ в зависимости от размера страницы) и заблокирует работу пользователей.


Решение 1: Оптимизация максимальной длины строки в ПВХ

Самый быстрый и эффективный способ уменьшить аппетиты файловой базы — скорректировать метаданные в Конфигураторе. По умолчанию в типовых конфигурациях 1С для типа «Строка» в ПВХ ДополнительныеРеквизитыИСведения установлена длина 1024 символа.

Выполним следующие шаги для оптимизации:

  1. Откроем базу в режиме Конфигуратор.
  2. Найдем План видов характеристик ДополнительныеРеквизитыИСведения.
  3. В свойствах ПВХ найдем настройку типов данных и перейдем к редактированию типа Строка.
  4. Уменьшим максимальную длину строки со стандартных 1024 символов до разумного минимума — например, до 50 или 100 символов.
  5. Сохраним изменения и запустим реструктуризацию базы данных (при этом платформа физически уменьшит размер колонки _S во всех связанных таблицах).

Проанализируем эффект: уменьшение длины строки со 1024 до 100 символов сократит физический размер колонки _S с 2048 байт до 200 байт. Это мгновенно снизит объем, занимаемый каждой пустой строкой в табличной части дополнительных реквизитов, практически в 10 раз!

Как быть, если пользователям действительно нужны длинные тексты?

В Библиотеке стандартных подсистем этот сценарий уже заложен на архитектурном уровне. В БСП табличная часть ДополнительныеРеквизиты содержит не только поле Значение, но и отдельный реквизит ТекстоваяСтрока с типом Строка неограниченной длины.

Когда пользователь создает в режиме «1С:Предприятие» новый дополнительный реквизит и выбирает тип «Строка», ему доступен флаг «Неограниченная длина». В этом случае БСП работает следующим образом:

Таким образом, ограничив обычную строку в ПВХ до 50–100 символов, мы убираем лишний оверхед, а для ввода больших текстов ориентируем пользователей на выбор типа «Строка неограниченной длины».


Решение 2: Перенос свойств в категорию «Дополнительные сведения»

Рассмотрим разницу между механизмами дополнительных реквизитов и дополнительных сведений, предоставляемыми БСП:

Если определенные свойства товаров или характеристик заполняются редко (например, у 10–20% ассортимента) и их не требуется постоянно держать открытыми на форме элемента для редактирования, переведем их в категорию дополнительных сведений. Это полностью исключит создание пустых «строк-пустышек» в объектах и сэкономит дисковое пространство файловой базы.


Решение 3: Использование «родных» реквизитов и расширений конфигурации (Best Practice)

Если анализ базы данных показывает, что определенный дополнительный реквизит (например, «Цвет», «Размер» или «Производитель») заполняется практически для всех элементов справочника (90% и более), использовать универсальный механизм БСП становится архитектурно нецелесообразно.

Универсальность БСП удобна для пользователя, но за нее приходится платить избыточностью СУБД. В такой ситуации правильным решением будет отказ от хранения этого свойства в табличной части доп. реквизитов и создание «родного» реквизита конфигурации.

Выполним эту задачу современным способом без снятия конфигурации с поддержки — через Расширение конфигурации:

  1. Создадим новое расширение конфигурации.
  2. Добавим в расширение нужный справочник (например, ХарактеристикиНоменклатуры).
  3. Создадим в справочнике реальный реквизит с конкретным ссылочным типом (например, Реквизит_Цвет с типом СправочникСсылка.Цвета).
  4. Выведем этот реквизит на форму элемента справочника в расширении.

Проанализируем разницу в хранении:

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


Как отслеживать размер таблиц в реальном времени

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

Начиная с версии платформы 1С 8.3.15, мы можем программно получать детальную информацию о размере таблиц базы данных прямо из встроенного языка, используя специализированные функции и методы работы с информационной базой. Для файловых баз также отлично подходят внешние утилиты анализа структуры файлов .1CD (например, утилита Tool1CD или специализированные обработки с ИТС), которые показывают точный размер каждой таблицы данных, индексов и BLOB-полей.

Если вы видите, что размер таблицы табличной части дополнительных реквизитов (например, _InfoRgXXXX для регистров или _ReferenceXX_VTXX для табличных частей справочников) приближается к критическим 4 ГБ, незамедлительно примените один из описанных выше методов оптимизации, после чего обязательно запустите процедуру «Тестирование и исправление» с включенным режимом «Сжатие таблиц» (дефрагментация файла базы данных).

← На главную