При разработке архитектуры на платформе 1С:Предприятие мы часто сталкиваемся с необходимостью сохранения объемных данных, привязанных к конкретному документу. Возникает закономерный вопрос: следует ли помещать все эти данные в одну запись регистра сведений, используя ХранилищеЗначения, или правильнее будет разбить их на несколько записей? Давайте проанализируем этот выбор, опираясь на технические аспекты платформы и практические замеры.
Многие разработчики приходят к выводу, что хранение данных «порциями» — это более гибкий подход. Рассмотрим основные причины, почему стоит выбирать дробление данных:
rphost. Потабличное чтение позволяет «размазать» нагрузку, делая работу системы более плавной и предсказуемой.ХранилищеЗначения в рамках одного измерения, одновременная запись в разные таблицы документа одним и тем же пользователем или разными сеансами может привести к конфликтам. Разделив данные на несколько записей регистра, вы используете стандартные механизмы блокировки СУБД на уровне строк, что значительно повышает стабильность системы при параллельной работе.Необходимо помнить, что ХранилищеЗначения — это по сути BLOB (Binary Large Object) в базе данных. Когда мы записываем или считываем данные, платформа выполняет полную сериализацию или десериализацию.
Важный аспект, который стоит учитывать — это сохранение ссылочных типов. При десериализации данных из ХранилищеЗначения платформа 1С довольно гибко обрабатывает переименование объектов метаданных (например, справочников). Если вы сохранили ссылку на СправочникСсылка.МойСправочник, а затем переименовали его, система при чтении успешно восстановит ссылку, в отличие от работы с JSON, который в такой ситуации может вызвать ошибку десериализации.
Чтобы эффективно реализовать этот подход, разберем по шагам логику построения регистра сведений:
Документ (ссылка на документ-владелец).ИмяКоллекции (строка или перечисление), которое будет отвечать за то, какая именно таблица или структура хранится в данной записи.ХранилищеЗначения.Таким образом, вместо одной «тяжелой» записи вы получите несколько «легких». Получение данных для бизнес-процесса будет выглядеть примерно следующим образом:
// Пример получения конкретной таблицы для обработки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Регистр.Данные КАК Данные
|ИЗ
| РегистрСведений.НашеХранилище КАК Регистр
|ГДЕ
| Регистр.Документ = &Документ
| И Регистр.ИмяКоллекции = ""Таблица_1""";
Запрос.УстановитьПараметр("Документ", ВыбранныйДокумент);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
ТаблицаДанных = Результат.Данные.Получить();
КонецЕсли;
Рассмотрев ситуацию, мы можем сформулировать следующие правила:
Разбиение позволяет достичь лучшей масштабируемости, снижает потребление оперативной памяти и делает архитектуру решения более прозрачной. Мы рекомендуем подходить к хранению данных как к набору атомарных сущностей, что позволит избежать проблем с производительностью в будущем, когда объем данных в базе начнет расти.