Как организовать хранение данных одной области 1С на отдельном сервере клиента при работе через центральный сервер?

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

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

Рассмотрим ситуацию: у нас есть общая база 1С с включенным разделением данных. Некоторые справочники и документы являются общими для всех клиентов, другие — персональными для каждой области данных. Один из клиентов выдвигает требование: его персональные данные должны храниться исключительно на его сервере. Идеальная картина для клиента заключается в том, чтобы у него был только SQL-сервер, на котором лежат его данные, а сам он работал бы "через центр", то есть через наш общий сервер 1С:Предприятия. Давайте проанализируем, насколько это возможно и какие технологии мы можем для этого использовать.

Понимание механизма разделения данных в 1С

Прежде чем углубляться в решения, давайте убедимся, что мы понимаем, что такое "область данных" в контексте 1С:Предприятия. Платформа 1С:Предприятие по своей сути является многопользовательской системой, которая позволяет хранить данные нескольких независимых организаций или клиентов в одной информационной базе, используя механизм разделения данных. Это достигается за счет использования общего реквизита конфигурации (например, Организация или специального разделителя области данных), который позволяет каждой области данных иметь доступ только к своим сведениям, а также к общим, неразделенным данным. Такой подход минимизирует затраты на администрирование, так как вся система (платформа, СУБД, конфигурация) едина. Однако он предполагает, что все данные, независимо от принадлежности, физически находятся в одной базе данных на одном SQL-сервере.

Подход 1: Шардирование таблиц на уровне СУБД

Одним из первых предположений, которое может возникнуть, является использование шардирования на уровне системы управления базами данных (СУБД), например, MS SQL Server или PostgreSQL. Давайте рассмотрим, что такое шардирование и как оно могло бы быть применено.

Что такое шардирование?

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

Выделяют два основных вида шардирования:

  1. Вертикальное шардирование: Оно разделяет данные не по строкам, а по столбцам таблицы. Например, редко используемые или ресурсоемкие поля могут быть вынесены на отдельные серверы. В контексте 1С, это могло бы означать вынос данных определенных модулей или даже отдельных реквизитов на сторонний сервер, но это весьма экзотическое и редко применяемое решение для общей базы.
  2. Горизонтальное шардирование (партиционирование по строкам): Этот метод распределяет однотипные данные (например, учетные записи или области данных) между отдельными базами данных. Структура таблиц остается одинаковой на всех шардах, но каждая база содержит свой поднабор строк. Например, данные клиента А могут быть на сервере 1, клиента Б — на сервере 2 и так далее. Именно этот тип шардирования наиболее близок к нашей задаче, когда данные конкретного клиента должны храниться на его отдельном сервере.

Проблемы шардирования с 1С

К сожалению, при попытке реализовать шардирование для базы 1С мы сталкиваемся с рядом критических проблем:

  1. Отсутствие нативной поддержки в 1С: Платформа 1С:Предприятие не имеет встроенных механизмов для работы с шардированными базами данных. Она ожидает, что вся информационная база находится в одном экземпляре СУБД. Все обращения к данным 1С делает через свой ORM (Object-Relational Mapping), который не знает о распределении данных по разным серверам.
  2. Реструктуризация конфигурации: Это самая серьезная проблема. Любое изменение конфигурации 1С (добавление нового реквизита, изменение типа данных, создание нового документа) приводит к реструктуризации базы данных на уровне СУБД. При этом 1С сама генерирует и выполняет DDL-скрипты. Если мы вручную внедрили шардирование, изменили схемы таблиц или их расположение, эти автоматические операции 1С могут легко нарушить нашу архитектуру, сломать связи или привести к потере данных. Платформа просто не будет знать о нашей распределенной структуре и будет пытаться работать с базой как с единым целым.
  3. Сложность запросов: Запросы, которые требуют объединения данных из разных шардов (cross-shard queries), значительно усложняются. Например, если общий справочник находится на центральном сервере, а персональные документы на сервере клиента, запрос, связывающий эти данные, должен будет выполняться распределенно, что не поддерживается 1С нативно.
  4. Распределенные транзакции: Обновление данных в нескольких шардах в рамках одной транзакции (например, запись документа, который ссылается на общий справочник и клиентские данные) представляет собой чрезвычайно сложную задачу. Это может существенно замедлять работу и требует реализации сложных протоколов двухфазного или трехфазного коммита, что выходит далеко за рамки возможностей 1С.
  5. Ребалансировка данных: При росте данных, изменении нагрузки или добавлении новых клиентов может потребоваться перераспределение данных между шардами. Это одна из самых сложных операционных задач, требующая остановки или значительного замедления работы системы.
  6. Особенности PostgreSQL: Если мы рассматриваем PostgreSQL, важно отметить, что сам по себе он не предоставляет встроенного шардирования базы данных между разными серверами. Он поддерживает партиционирование таблиц, что является масштабированием *внутри одного узла*, а не между узлами. Для полноценного шардирования в PostgreSQL требуются сторонние инструменты или ручная реализация, что дополнительно усложняет систему.

Потенциальный обходной путь с DDL-триггерами?

В рамках обсуждения прозвучала идея использовать DDL-триггеры (Data Definition Language triggers) на уровне СУБД, чтобы "не сломалось при реструктуризации" 1С. Некоторые эксперты, такие как Юрий Пермитин на Инфостарте, исследовали внутреннее устройство работы 1С с СУБД. DDL-триггеры могли бы позволить перехватывать и модифицировать DDL-операции 1С, пытаясь "подружить" их с ручным шардированием. Однако это крайне сложный и рискованный путь:

  1. Высочайшая сложность: Понимание всех DDL-операций 1С и корректная их модификация с помощью триггеров требует глубочайших знаний внутреннего устройства платформы и СУБД.
  2. Неподдерживаемость: Такое решение абсолютно не поддерживается фирмой "1С" и любое обновление платформы или конфигурации может нарушить работу триггеров и привести к непредсказуемым ошибкам, порче данных или полной неработоспособности системы.
  3. Нарушение лицензионного соглашения: Глубокие модификации на уровне СУБД, которые обходят стандартные механизмы работы платформы, могут рассматриваться как нарушение лицензионного соглашения.

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

Подход 2: Распределенные информационные базы (РИБ)

Другой, более нативный для 1С подход, предложенный в обсуждении, это использование Распределенных Информационных Баз (РИБ).

Что такое РИБ?

РИБ в 1С предназначены для организации обмена данными между географически удаленными филиалами или независимыми подразделениями. Они позволяют создать центральную (главную) базу и несколько дочерних баз. Главная и дочерние базы синхронизируют данные по определенным правилам. Данные могут быть разделены по префиксам или по принципу "для узла Х" – "для узла Y".

Как РИБ могут решить задачу?

Применительно к нашей ситуации, РИБ могут быть использованы следующим образом:

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

Соответствие идеалу клиента и ограничения РИБ

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

  1. Полноценный сервер 1С у клиента: Клиенту потребуется развернуть не просто SQL-сервер, а полноценный сервер 1С:Предприятия (или файловый вариант базы, если это допустимо по нагрузке и количеству пользователей), который будет обслуживать его информационную базу. Это более сложная инфраструктура, чем просто SQL-сервер.
  2. Независимая база: Фактически, у клиента будет своя, хоть и синхронизируемая, но независимая информационная база. Работа "через центр" в данном случае будет означать работу с этой дочерней базой, которая потом обменивается данными с центральной.
  3. Совместимость РИБ и разделения данных: Ранее были нарекания по поводу совместной работы РИБ и механизма разделения данных в одной конфигурации. Однако в последние годы, как отмечается в обсуждении, проблемы такого рода на форумах поднимаются значительно реже. Это может свидетельствовать об улучшении стабильности платформы в этом аспекте. Тем не менее, при проектировании такой схемы потребуется тщательное тестирование.

Таким образом, РИБ представляют собой рабочий, поддерживаемый 1С механизм, который позволяет изолировать данные клиента на его сервере. Однако он требует более сложной инфраструктуры у клиента, чем просто сервер СУБД, и не обеспечивает работу "через центр" в том смысле, что клиент не будет подключаться к центральному серверу 1С для работы со своими данными, а будет подключаться к своему локальному серверу 1С.

Подход 3: Добавление реквизита через расширение для имитации раздельных таблиц

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

Суть идеи

Основная идея, вероятно, заключается в следующем: если в расширении для каждого объекта (справочника, документа и т.д.) добавить новый реквизит, и затем для каждого клиента создать свое расширение с этим реквизитом, теоретически это могло бы привести к созданию отдельных таблиц в СУБД для данных каждого клиента. Например, если добавить реквизит КлиентскийРазделитель, то при реструктуризации 1С может создать отдельные физические таблицы или таблицы с дополнительными индексами, которые могли бы быть как-то ассоциированы с клиентом.

Проблемы и риски данного подхода

Этот подход крайне рискован и, скорее всего, не сработает так, как ожидается, а также создаст множество проблем:

  1. Неверное понимание работы 1С с СУБД: Добавление реквизита в расширении не приводит к созданию отдельных физических таблиц для каждой области данных или каждого клиента. 1С хранит все данные объектов в основной таблице, добавляя поля для новых реквизитов, в том числе из расширений. Разделитель области данных уже является реквизитом, по которому данные логически разделены в рамках одной таблицы. Добавление еще одного реквизита просто добавит еще одно поле к существующим таблицам.
  2. Целостность данных: Попытки управлять физическим расположением данных таким образом, минуя стандартные механизмы платформы, могут привести к нарушению целостности данных, сложностям с резервным копированием и восстановлением.
  3. Производительность: Создание большого количества расширений для каждого клиента с одинаковыми реквизитами, а затем попытка как-то связать это с физическим расположением данных, будет крайне неэффективным и, вероятно, приведет к деградации производительности всей системы.
  4. Сложность администрирования и поддержки: Такая архитектура будет чрезвычайно сложна в поддержке, обновлении и отладке. Любые стандартные операции 1С могут вызвать непредсказуемые последствия.

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

Общие принципы и альтернативы

Платформа 1С:Предприятие 8.3 поддерживает трехзвенную архитектуру с сервером 1С:Предприятия и отдельной СУБД (MS SQL Server, PostgreSQL, Oracle Database, IBM DB2). Эта архитектура обеспечивает надежное хранение данных и высокую производительность для большого числа пользователей. Механизм разделения данных (multi-tenancy) является ключевым для работы нескольких компаний в одном экземпляре приложения, предоставляя логическое, а не физическое разделение данных.

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

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

Выводы и рекомендации

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

Давайте подытожим наши выводы:

  1. Шардирование СУБД (MS SQL, PostgreSQL): Это теоретически может решить задачу физической изоляции данных, но практически неосуществимо с 1С:Предприятием из-за отсутствия нативной поддержки, высоких рисков при реструктуризации конфигурации и сложности обслуживания. Использование DDL-триггеров для обхода этих проблем также является крайне рискованным и неподдерживаемым путем.
  2. Распределенные информационные базы (РИБ): Это наиболее близкий к запросу, поддерживаемый платформой вариант. Он позволяет развернуть у клиента полноценную, синхронизируемую с центральной, информационную базу 1С. Однако это требует наличия полноценного сервера 1С у клиента, а не только SQL-сервера, и клиент будет подключаться к своей локальной базе, а не "через центр" в строгом смысле.
  3. Использование расширений для создания отдельных таблиц: Этот подход основан на неверном понимании архитектуры 1С и СУБД и является крайне рискованным и неработоспособным.

Таким образом, прямой, "из коробки" функциональности для реализации такого сценария в 1С нет. Любые попытки реализовать это будут сопряжены с высокой сложностью, огромными рисками и, скорее всего, приведут к неподдерживаемой системе. Если требование клиента является критическим и бескомпромиссным, то наиболее реалистичным и безопасным, хотя и требующим больших затрат на инфраструктуру со стороны клиента, будет вариант с отдельной информационной базой 1С у клиента, которая развернута на его сервере и либо работает независимо, либо с ограниченным обменом общими справочниками через механизм РИБ. В любом случае, клиенту потребуется больше, чем просто SQL-сервер.

← На главную