При начале работы с механизмом расширений конфигурации в платформе 1С:Предприятие многие разработчики сталкиваются с неочевидным на первый взгляд поведением системы. Казалось бы, расширение — это нечто внешнее, "накладываемое" на основную конфигурацию. Однако при попытке добавить в расширение новый объект (например, Справочник, Документ или Регистр сведений), платформа запускает процесс обновления конфигурации базы данных с полной реструктуризацией. Давайте разберем подробно, почему так происходит, как это работает «под капотом» и какие последствия это несет для разработчика и администратора.
В ранних версиях платформы (до 8.3.11) расширения использовались преимущественно для доработки кода, изменения форм и макетов. Эти изменения действительно применялись динамически и не требовали изменения физической структуры базы данных. Это породило распространенное заблуждение, что расширение живет "где-то отдельно" или исключительно в оперативной памяти сервера приложений.
Однако, начиная с версии 8.3.11, разработчики получили возможность добавлять собственные объекты хранения данных. И здесь вступает в силу физика работы реляционных баз данных (СУБД). Давайте проанализируем ситуацию, озвученную в вопросе: мы создаем новый Справочник.
Как справедливо заметили участники обсуждения, данные нового справочника должны где-то храниться. Давайте разберем по шагам, что происходит в системе, когда вы нажимаете кнопку "Обновить конфигурацию базы данных":
Справочник в дереве расширения. Для платформы 1С это описание того, как данные должны выглядеть (какие будут реквизиты, длины строк, типы чисел).Код, Наименование, Ссылка, ПометкаУдаления) и ваши добавленные реквизиты. Чтобы записать "Иванов" или "Товар №1", системе нужно место на жестком диске.Процесс, который платформа называет "реструктуризацией", на языке баз данных является выполнением команд DDL (Data Definition Language — язык описания данных). Когда вы добавляете справочник в расширение, платформа генерирует команду вида CREATE TABLE.
Рассмотрим подробнее механизм именования таблиц, чтобы понять, как платформа разделяет "основные" данные и данные "расширений" — для этого пригодится архитектурный анализ конфигурации и расширений 1С.
В основной конфигурации таблица справочника может называться, например, Reference30.
Для справочника, добавленного в расширение, платформа создает новую таблицу в той же базе данных, но добавляет к имени специальный постфикс (хэш), уникальный для данного расширения. Имя таблицы на уровне СУБД будет выглядеть примерно так:
Reference30_X1
Где X1 — это идентификатор конкретного расширения.
Таким образом, реструктуризация — это процесс физического создания новых таблиц и индексов в базе данных для обслуживания структур данных, описанных вами в расширении (после чего может потребоваться обновление индексов SQL). При необходимости можно воспользоваться скриптом для адаптивного обновления индексов MS SQL.
Путаница возникает из-за того, что расширения часто позиционируются как способ доработки системы без снятия с поддержки и без изменения основной структуры. Это верно, но с оговоркой: структура основной конфигурации (объекты вендора) действительно остается неизменной. Но структура базы данных (физическое хранилище) меняется кардинально.
Давайте проанализируем ключевые отличия работы с данными в расширении и в основной конфигурации, о которых необходимо помнить.
Разберем важные аспекты, которые следуют из того факта, что расширение создает собственные таблицы.
Это самый опасный момент. Если вы удаляете объект из основной конфигурации, платформа часто предупреждает вас или оставляет данные в базе (в виде "битых" ссылок или удаленных таблиц при определенных условиях, пока не будет выполнено полное тестирование и исправление со сжатием). В случае с расширением логика более жесткая.
Если вы удалите расширение (или отключите его использование в режиме Предприятия с удалением данных), платформа выполнит команду DROP TABLE для всех таблиц с постфиксом этого расширения. Все данные, накопленные в ваших добавленных справочниках, регистрах и документах, будут уничтожены мгновенно и безвозвратно. Бэкап — единственный способ восстановления.
Изменение схемы базы данных (создание таблиц, изменение полей) — это ресурсоемкая операция, требующая блокировки. Хотя в современных версиях платформы (8.3.22 и новее) механизм фоновой реструктуризации значительно улучшен, и многие изменения можно применить динамически, добавление новых объектов хранения данных часто все еще требует или монопольного доступа, или вызывает временные "тормоза" при обновлении, так как СУБД должна выделить место и зарегистрировать новые структуры.
Представим ситуацию: вы разработали функционал в расширении, создали там Справочник.ДоговорыСпециальные, пользователи заполнили его тысячами записей. Позже вы решили, что этот справочник должен стать частью основной конфигурации.
Просто скопировать объект метаданных из дерева расширения в дерево основной конфигурации ("Конфигурация" -> "Открыть конфигурацию") недостаточно для сохранения данных. С точки зрения платформы это будут два разных объекта:
ReferenceN_X1).ReferenceM).При удалении расширения таблица ReferenceN_X1 удалится. Поэтому перед "переездом" необходимо писать обработки для выгрузки данных (например, в XML или JSON) и последующей загрузки в новую структуру основной конфигурации — для этого есть универсальный перенос данных между базами 1С.
Давайте посмотрим, как использование данных расширения влияет на работу запросов. Когда вы пишете запрос, объединяющий данные из основного справочника и справочника расширения, СУБД выполняет JOIN между таблицами ReferenceA и ReferenceB_X1.
Пример кода запроса, который выглядит одинаково, но работает с разными физическими сущностями:
ВЫБРАТЬ
Номенклатура.Наименование,
ДопСвойстваРасширения.Значение
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Расширение1_ДопСвойства КАК ДопСвойстваРасширения
ПО Номенклатура.Ссылка = ДопСвойстваРасширения.Владелец
Для оптимизатора СУБД это стандартная операция соединения. Однако, если у вас много расширений, и каждое добавляет свои регистры и справочники, структура базы данных "обрастает" множеством дополнительных таблиц. Это может усложнить администрирование и анализ производительности, так как данные становятся фрагментированными — решить проблему поможет анализ физической структуры таблиц СУБД и индексов.
Отвечая на вопрос "почему происходит реструктуризация", можно сформулировать следующие тезисы:
Разработчику важно помнить: создавая объекты хранения в расширении, вы берете на себя ответственность за сохранность этих данных. Удаление расширения равносильно уничтожению всех таблиц, созданных в рамках этого расширения.