При активной эксплуатации крупных информационных систем на базе 1С программисты часто сталкиваются с проблемой взрывного роста таблиц. Когда справочник разрастается до десятков миллионов записей и начинает занимать десятки гигабайт, это сказывается на времени резервного копирования, скорости обновления конфигурации и общей производительности СУБД. Рассмотрим подробнее, какие инструменты предоставляет платформа 1С и возможности MS SQL Server для решения задачи выноса «тяжелых» данных за пределы основной базы.
Проанализируем первый и самый очевидный способ — использование объекта метаданных ВнешниеИсточникиДанных. Этот механизм позволяет подключаться к сторонним базам данных (через ODBC-драйверы) и работать с их таблицами так, будто это объекты 1С. Разберем основные аспекты этого подхода:
.mdf.СоздатьЭлемент()) в полной мере, как для внутренних справочников. Также могут возникнуть сложности с участием этих данных в сложных транзакциях.Этот метод идеально подходит, если справочник является по сути «архивным» или справочным классификатором, который редко меняется в самой 1С.
Выясним причину, по которой иногда лучше не менять ничего в коде 1С, а воздействовать на уровне СУБД. Если ваша задача — не просто «вынести» данные, а распределить нагрузку на дисковую подсистему, нам поможет горизонтальное секционирование (Partitioning).
Посмотрим на этот процесс по шагам:
Важное преимущество: Платформа 1С «не заметит» изменений. Она продолжит работать с одной таблицей, в то время как SQL Server сам будет распределять данные по разным физическим файлам. Это позволяет эффективно управлять дисковым пространством, не переписывая конфигурацию.
Проанализируем современное решение, появившееся в последних релизах платформы. Механизм ХранилищеДвоичныхДанных предназначен для того, чтобы вынести содержимое реквизитов с типом ХранилищеЗначения во внешнее хранилище (например, файловую систему или S3-совместимое хранилище).
Разберем нюансы использования:
Если вынос данных затруднен, рассмотрим вариант их «уплотнения» средствами СУБД. MS SQL Server поддерживает сжатие на уровне строк (Row) и страниц (Page). Выясним, как это работает:
Сжатие страниц позволяет находить повторяющиеся значения в блоках данных и заменять их короткими ссылками. Для справочников с большим количеством типизированных данных (например, одинаковые артикулы, города, статусы) это может дать экономию места до 50–70%.
1С официально поддерживает работу с включенным сжатием таблиц на стороне SQL. Это не выносит таблицу из базы, но радикально уменьшает её физический размер.
Рассмотрим креативный подход, который часто применяется в высоконагруженных системах. Суть заключается в разделении справочника на «легкую» и «тяжелую» части.
Код, Наименование, Ссылка. Это обеспечит работу ссылочной целостности и быстрый подбор.Пример программного обращения к внешней базе через ADO для получения данных:
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Driver={SQL Server};Server=ExternalServer;Database=ExtraData;Uid=user;Pwd=password;");
RecordSet = Connection.Execute("SELECT FullDescription FROM CatalogDetails WHERE GUID = '" + Строка(СсылкаНаОбъект.УникальныйИдентификатор()) + "'");
Если Не RecordSet.EOF Тогда
ТяжелоеОписание = RecordSet.Fields("FullDescription").Value;
КонецЕсли;
Connection.Close();
Прежде чем приступать к радикальным мерам, проанализируем, чем именно заняты эти 22 Гб. Очень часто рост справочника вызван не реальными данными, а сопутствующим «мусором»:
ВерсииОбъектов. Часто история изменений занимает в 5–10 раз больше места, чем сами данные справочника. Настройте регламент очистки старых версий.Таким образом, выбор метода зависит от характера данных. Для файлов используйте ХранилищеДвоичныхДанных, для огромных таблиц с данными — Секционирование или ВнешниеИсточникиДанных, а для оптимизации текущего хранения — Сжатие страниц и очистку ВерсийОбъектов.