При работе с крупными базами данных, такими как 1С:ERP Управление предприятием, часто возникает задача хранения огромного массива связанных данных: описаний товаров, сертификатов, фотографий и инструкций. Когда количество элементов номенклатуры превышает 200 000, а к каждому нужно прикрепить хотя бы один файл, перед разработчиком встает дилемма: хранить всё внутри базы в объектах типа ХранилищеЗначений или выносить во внешние тома на диске. Разберем эту ситуацию подробно, проанализируем технические нюансы сжатия и влияния на производительность СУБД.
Этот способ предполагает использование реквизита с типом ХранилищеЗначений. Рассмотрим, как платформа 1С обрабатывает такие данные. По умолчанию 1С использует алгоритм сжатия zlib (Deflate) при помещении данных в хранилище.
Проанализируем эффективность сжатия для разных типов данных:
zlib практически не уменьшит объем файла, а в некоторых случаях может даже немного увеличить его за счет служебных заголовков объекта 1С.Разберем по шагам, как программно поместить файл в базу:
// Пример помещения текстового файла в ХранилищеЗначений
ТекстОписания = "Пример очень длинного описания номенклатуры...";
НовыйОбъект = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
НовыйОбъект.Наименование = "Описание.txt";
// Платформа автоматически сожмет данные при создании ХранилищаЗначений
НовыйОбъект.ФайлХранилище = Новый ХранилищеЗначений(ТекстОписания, Новый СжатиеДанных(9));
НовыйОбъект.Записать();
Преимущества хранения в базе:
Если объем данных начинает исчисляться десятками гигабайт (например, при переходе от текстов к фотографиям высокого разрешения), хранение в базе становится рискованным. Выясним причину: большое количество BLOB-объектов (Binary Large Objects) внутри SQL-таблиц приводит к сильной фрагментации индексов и замедлению обслуживания базы (DBCC checkdb, реиндексация).
Типовые конфигурации (ERP, КА, УТ) имеют встроенный механизм «Тома хранения файлов». Проанализируем, как он работает:
/01/af/), что позволяет избежать ограничений файловой системы NTFS на количество файлов в одной директории.Риски внешнего хранения:
Рассмотрим ситуацию с точки зрения системного администратора СУБД. При чтении данных SQL Server кэширует страницы данных в оперативной памяти (Buffer Pool). Если в таблице номенклатуры или связанных с ней таблицах лежат тяжелые бинарные данные, они будут вытеснять из кэша полезные индексы. Это приведет к тому, что обычные запросы (например, подбор товара в заказ) станут работать медленнее, так как серверу придется чаще обращаться к дисковой подсистеме.
Если вы используете MS SQL Server Express, помните о жестком лимите в 10 Гб на размер базы. В этом случае внешнее хранение в томах — единственный выход.
Начиная с версии платформы 1С 8.3.15, появилась возможность использовать S3-совместимые хранилища (например, MinIO или облачные решения). Это «золотая середина» между базой и диском. Выясним преимущества:
Проанализировав все факторы, мы можем сформулировать следующие правила выбора для вашей задачи в 200 000 объектов:
ХранилищеЗначений). Суммарный объем после сжатия (около 500 Мб) несущественен для современных серверов, зато вы получаете автоматический полнотекстовый поиск и гарантированную целостность данных при бэкапах.Посмотрим на пример того, как проверить размер данных в хранилище перед записью, чтобы принять решение о способе хранения динамически:
// Оценка размера данных
РазмерДанных = СтрДлина(ТекстОписания) * 2; // Примерная оценка для Unicode
Если РазмерДанных < 10240 Тогда // Если меньше 10 Кб, храним в базе
Объект.Хранилище = Новый ХранилищеЗначений(ТекстОписания, Новый СжатиеДанных(9));
Иначе
// Логика по выносу во внешний том или S3
КонецЕсли;
Выясним напоследок: если вы работаете в типовой конфигурации ERP, не изобретайте велосипед. Перейдите в раздел "НСИ и администрирование" -> "Настройка параметров системы" -> "Работа с файлами" и настройте "Тома хранения файлов". Платформа сама определит, куда положить файл, исходя из ваших настроек, и обеспечит бесперебойную работу с 200 тысячами наименований номенклатуры.