В крупных и высоконагруженных информационных системах на базе платформы «1С:Предприятие» администраторы и архитекторы баз данных часто сталкиваются с необходимостью оптимизации хранения больших объемов информации. Иногда от бизнеса или руководства поступают весьма нестандартные задачи. Например: физически разнести данные одной таблицы на разные серверы (горизонтальное и вертикальное секционирование) и обеспечить возможность «горячего» отключения одного из серверов так, чтобы остальная часть системы продолжала функционировать.
В этой статье мы подробно разберем, насколько реализуема подобная задача средствами СУБД (на примере MS SQL Server и PostgreSQL), с какими критическими ограничениями платформы 1С вы столкнетесь при попытке внедрить секционирование вручную, и какие существуют надежные альтернативные архитектурные решения.
---
Проанализируем классический запрос: требуется разделить таблицы базы данных (например, архивные документы, тяжелые регистры сведений или регистры накопления) по определенному критерию (по дате, организации или филиалу) и физически разместить эти секции на разных серверах. Дополнительное требование — иметь возможность быстро отключить сервер с одной из секций (например, в целях безопасности или конфиденциальности) без остановки работы всей остальной базы.
Для СУБД (будь то MS SQL Server, Oracle или PostgreSQL) база данных «1С:Предприятие» представляет собой стандартный набор таблиц с индексами. Однако платформа 1С накладывает жесточайшие ограничения на структуру этих таблиц, их связи и логику работы с ними. Попытка внедрить низкоуровневые механизмы секционирования напрямую через СУБД в обход платформы 1С неизбежно приводит к ряду серьезных проблем.
---
Рассмотрим подробнее технические препятствия, которые делают прямое секционирование одной таблицы 1С по разным физическим серверам практически невозможным в реальной эксплуатации.
1. Требование к первичному ключу (Clustered Index / Primary Key)
Чтобы СУБД понимала, в какую секцию (партицию) записывать конкретную строку, столбец секционирования (например, дата документа или идентификатор организации) должен быть частью первичного кластерного ключа таблицы. В 1С структура таблиц и их индексы жестко контролируются платформой. Мы не можем произвольно изменить первичный ключ таблицы (например, добавить туда реквизит организации) на стороне СУБД. Любое ручное изменение структуры индексов через SQL Management Studio приведет к тому, что платформа 1С потеряет возможность корректно работать с объектами метаданных.
2. Проблема реструктуризации таблиц при обновлениях
Платформа 1С регулярно выполняет реструктуризацию таблиц при обновлении конфигурации или изменении свойств объектов. Этот процесс происходит по следующему алгоритму:
_v8_tmp_X.Любые ваши настройки секционирования, распределенные представления (Views), триггеры и схемы разбиения на стороне СУБД будут мгновенно уничтожены при первой же реструктуризации измененного объекта метаданных.
3. Нарушение ссылочной целостности и аварийный режим базы данных
Выясним, что произойдет при попытке физического отключения сервера, на котором хранится одна из секций таблицы. Объектная модель 1С спроектирована как единое целое. Если база данных физически распределена по разным файлам или серверам на уровне СУБД, потеря доступа хотя бы к одному файлу или связанному серверу (Linked Server) приведет к тому, что СУБД переведет всю базу данных в аварийный режим (например, SUSPECT или RECOVERY_PENDING в MS SQL Server). СУБД просто не позволит запустить базу «частично», так как нарушается физическая и логическая целостность транзакционной модели.
---
Теоретически в MS SQL Server распределение одной таблицы по разным физическим серверам реализуется через механизм **распределенных секционированных представлений** (Distributed Partitioned Views — DPV) с использованием связанных серверов (Linked Servers). Разберем, как это работает на бумаге:
-- Пример логики создания распределенного представления на уровне СУБД
CREATE VIEW dbo.v_SalesData AS
SELECT * FROM Server1.SalesDB.dbo.SalesTable WHERE RegionID = 1
UNION ALL
SELECT * FROM Server2.SalesDB.dbo.SalesTable WHERE RegionID = 2;
Хотя этот механизм существует, для систем на платформе 1С он абсолютно не применим по следующим причинам:
---
Если перед вами стоит задача распределить данные по разным физическим серверам или обеспечить безопасность и отказоустойчивость, рассмотрим проверенные на практике и поддерживаемые платформой 1С методы.
Если вам требуется физически разделить данные по серверам (например, по филиалам или организациям) так, чтобы при отключении одного сервера остальные продолжали бесперебойную работу, используйте штатный механизм РИБ.
Рассмотрим этот подход по шагам:
Если цель секционирования — повысить производительность дисковой подсистемы и разнести «горячие» и «холодные» данные, это можно сделать в рамках одного сервера СУБД с помощью файловых групп.
Проанализируем этот сценарий:
Если ваша инфраструктура работает на СУБД PostgreSQL, обратите внимание на коммерческую версию Postgres Pro Enterprise, разработанную специально для крупных инсталляций 1С. В ней реализованы механизмы, позволяющие гибко управлять хранением данных без нарушения логики 1С:
Начиная с версии платформы 8.3.14, в 1С встроен официальный инструмент для разделения нагрузки между серверами СУБД. Если ваша цель — снизить нагрузку на основной рабочий сервер СУБД за счет вынесения тяжелых аналитических отчетов на другой физический сервер, выполните следующие действия:
Если клиент просит возможность «дернуть шнурочек» и скрыть конфиденциальные данные, физическое секционирование СУБД здесь не поможет, так как база просто сломается. В таких случаях применяются другие методы:
---
Попытка реализовать распределенное горизонтальное или вертикальное секционирование одной таблицы 1С по разным серверам средствами СУБД — это крайне рискованный путь, который сделает вашу базу необновляемой, нестабильной и приведет к постоянным ошибкам СУБД. При первом же обновлении конфигурации платформа сотрет все ручные настройки схем секционирования.
Для решения задач масштабирования и безопасности используйте только стандартные, поддерживаемые вендором архитектурные паттерны: механизмы РИБ, интеграцию через шины данных (RabbitMQ/Kafka), вынос тяжелых данных во внешние файловые хранилища или штатный механизм «Отчеты на копиях БД».