Почему при создании справочника в расширении конфигурация требует реструктуризации базы данных?

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

При начале работы с механизмом расширений конфигурации в платформе 1С:Предприятие многие разработчики сталкиваются с неочевидным на первый взгляд поведением системы. Казалось бы, расширение — это нечто внешнее, "накладываемое" на основную конфигурацию. Однако при попытке добавить в расширение новый объект (например, Справочник, Документ или Регистр сведений), платформа запускает процесс обновления конфигурации базы данных с полной реструктуризацией. Давайте разберем подробно, почему так происходит, как это работает «под капотом» и какие последствия это несет для разработчика и администратора.

Миф о «виртуальности» расширений

В ранних версиях платформы (до 8.3.11) расширения использовались преимущественно для доработки кода, изменения форм и макетов. Эти изменения действительно применялись динамически и не требовали изменения физической структуры базы данных. Это породило распространенное заблуждение, что расширение живет "где-то отдельно" или исключительно в оперативной памяти сервера приложений.

Однако, начиная с версии 8.3.11, разработчики получили возможность добавлять собственные объекты хранения данных. И здесь вступает в силу физика работы реляционных баз данных (СУБД). Давайте проанализируем ситуацию, озвученную в вопросе: мы создаем новый Справочник.

Физическое хранение данных: одна база на всех

Как справедливо заметили участники обсуждения, данные нового справочника должны где-то храниться. Давайте разберем по шагам, что происходит в системе, когда вы нажимаете кнопку "Обновить конфигурацию базы данных":

  1. Объявление метаданных: Вы создали объект Справочник в дереве расширения. Для платформы 1С это описание того, как данные должны выглядеть (какие будут реквизиты, длины строк, типы чисел).
  2. Потребность в хранении: Справочник — это список элементов. Каждый элемент имеет стандартные реквизиты (Код, Наименование, Ссылка, ПометкаУдаления) и ваши добавленные реквизиты. Чтобы записать "Иванов" или "Товар №1", системе нужно место на жестком диске.
  3. Взаимодействие с СУБД: 1С:Предприятие работает поверх СУБД (MS SQL, PostgreSQL, IBM DB2 или файловая база). СУБД ничего не знает о "расширениях" или "конфигурациях". Она оперирует понятиями "Таблица", "Индекс", "Поле".
  4. Единое пространство: Важно понимать — второй базы данных не существует. Данные расширения хранятся в той же самой базе данных (файл .1CD или база на SQL-сервере), что и данные основной конфигурации.

Что такое реструктуризация в данном контексте?

Процесс, который платформа называет "реструктуризацией", на языке баз данных является выполнением команд DDL (Data Definition Language — язык описания данных). Когда вы добавляете справочник в расширение, платформа генерирует команду вида CREATE TABLE.

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

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

Reference30_X1

Где X1 — это идентификатор конкретного расширения.

Таким образом, реструктуризация — это процесс физического создания новых таблиц и индексов в базе данных для обслуживания структур данных, описанных вами в расширении (после чего может потребоваться обновление индексов SQL). При необходимости можно воспользоваться скриптом для адаптивного обновления индексов MS SQL.

Почему это вызывает вопросы у новичков?

Путаница возникает из-за того, что расширения часто позиционируются как способ доработки системы без снятия с поддержки и без изменения основной структуры. Это верно, но с оговоркой: структура основной конфигурации (объекты вендора) действительно остается неизменной. Но структура базы данных (физическое хранилище) меняется кардинально.

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

Критические особенности жизненного цикла данных в расширении

Разберем важные аспекты, которые следуют из того факта, что расширение создает собственные таблицы.

1. Риск потери данных при удалении

Это самый опасный момент. Если вы удаляете объект из основной конфигурации, платформа часто предупреждает вас или оставляет данные в базе (в виде "битых" ссылок или удаленных таблиц при определенных условиях, пока не будет выполнено полное тестирование и исправление со сжатием). В случае с расширением логика более жесткая.

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

2. Монопольный доступ

Изменение схемы базы данных (создание таблиц, изменение полей) — это ресурсоемкая операция, требующая блокировки. Хотя в современных версиях платформы (8.3.22 и новее) механизм фоновой реструктуризации значительно улучшен, и многие изменения можно применить динамически, добавление новых объектов хранения данных часто все еще требует или монопольного доступа, или вызывает временные "тормоза" при обновлении, так как СУБД должна выделить место и зарегистрировать новые структуры.

3. Сложность переноса в основную конфигурацию

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

Просто скопировать объект метаданных из дерева расширения в дерево основной конфигурации ("Конфигурация" -> "Открыть конфигурацию") недостаточно для сохранения данных. С точки зрения платформы это будут два разных объекта:

При удалении расширения таблица ReferenceN_X1 удалится. Поэтому перед "переездом" необходимо писать обработки для выгрузки данных (например, в XML или JSON) и последующей загрузки в новую структуру основной конфигурации — для этого есть универсальный перенос данных между базами 1С.

Влияние на производительность и запросы

Давайте посмотрим, как использование данных расширения влияет на работу запросов. Когда вы пишете запрос, объединяющий данные из основного справочника и справочника расширения, СУБД выполняет JOIN между таблицами ReferenceA и ReferenceB_X1.

Пример кода запроса, который выглядит одинаково, но работает с разными физическими сущностями:


ВЫБРАТЬ
    Номенклатура.Наименование,
    ДопСвойстваРасширения.Значение
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Расширение1_ДопСвойства КАК ДопСвойстваРасширения
        ПО Номенклатура.Ссылка = ДопСвойстваРасширения.Владелец

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

Резюме

Отвечая на вопрос "почему происходит реструктуризация", можно сформулировать следующие тезисы:

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

Разработчику важно помнить: создавая объекты хранения в расширении, вы берете на себя ответственность за сохранность этих данных. Удаление расширения равносильно уничтожению всех таблиц, созданных в рамках этого расширения.

← На главную