Как лучше хранить данные в объекте ХранилищеЗначения: одним куском или частями?

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

При разработке архитектуры на платформе 1С:Предприятие мы часто сталкиваемся с необходимостью сохранения объемных данных, привязанных к конкретному документу. Возникает закономерный вопрос: следует ли помещать все эти данные в одну запись регистра сведений, используя ХранилищеЗначения, или правильнее будет разбить их на несколько записей? Давайте проанализируем этот выбор, опираясь на технические аспекты платформы и практические замеры.

Почему разбиение данных на части является предпочтительным

Многие разработчики приходят к выводу, что хранение данных «порциями» — это более гибкий подход. Рассмотрим основные причины, почему стоит выбирать дробление данных:

  1. Гибкость при чтении: Если ваша бизнес-логика предполагает работу только с определенной частью данных (например, только с одной таблицей из десяти), то при хранении «одним куском» вы будете вынуждены считывать и десериализовать весь объем данных. Это приводит к лишним затратам памяти и процессорного времени. Раздельное хранение позволяет извлекать только то, что нужно в текущем сеансе.
  2. Оптимизация производительности: Как показывают замеры, при больших объемах данных единовременное чтение огромной структуры вызывает пиковые нагрузки на оперативную память rphost. Потабличное чтение позволяет «размазать» нагрузку, делая работу системы более плавной и предсказуемой.
  3. Управление блокировками: При работе с данными в ХранилищеЗначения в рамках одного измерения, одновременная запись в разные таблицы документа одним и тем же пользователем или разными сеансами может привести к конфликтам. Разделив данные на несколько записей регистра, вы используете стандартные механизмы блокировки СУБД на уровне строк, что значительно повышает стабильность системы при параллельной работе.

Технические нюансы работы с ХранилищеЗначения

Необходимо помнить, что ХранилищеЗначения — это по сути BLOB (Binary Large Object) в базе данных. Когда мы записываем или считываем данные, платформа выполняет полную сериализацию или десериализацию.

Важный аспект, который стоит учитывать — это сохранение ссылочных типов. При десериализации данных из ХранилищеЗначения платформа 1С довольно гибко обрабатывает переименование объектов метаданных (например, справочников). Если вы сохранили ссылку на СправочникСсылка.МойСправочник, а затем переименовали его, система при чтении успешно восстановит ссылку, в отличие от работы с JSON, который в такой ситуации может вызвать ошибку десериализации.

Как реализовать потабличное хранение

Чтобы эффективно реализовать этот подход, разберем по шагам логику построения регистра сведений:

  1. Структура регистра: Создайте регистр сведений, где основным измерением будет Документ (ссылка на документ-владелец).
  2. Идентификатор части: Добавьте второе измерение, например, ИмяКоллекции (строка или перечисление), которое будет отвечать за то, какая именно таблица или структура хранится в данной записи.
  3. Ресурс для данных: Создайте один ресурс типа ХранилищеЗначения.

Таким образом, вместо одной «тяжелой» записи вы получите несколько «легких». Получение данных для бизнес-процесса будет выглядеть примерно следующим образом:


// Пример получения конкретной таблицы для обработки
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Регистр.Данные КАК Данные
    |ИЗ
    |    РегистрСведений.НашеХранилище КАК Регистр
    |ГДЕ
    |    Регистр.Документ = &Документ
    |    И Регистр.ИмяКоллекции = ""Таблица_1""";

Запрос.УстановитьПараметр("Документ", ВыбранныйДокумент);
Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда
    ТаблицаДанных = Результат.Данные.Получить();
КонецЕсли;

Подведем итоги

Рассмотрев ситуацию, мы можем сформулировать следующие правила:

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

← На главную