Чистим данные типа ХранилищеЗначения в базе 1С:Предприятия 8.3
Содержание
Хранилище значений в 1С очищают не одной кнопкой, а по месту: сначала находят таблицу, которая разрослась, затем чистят её штатным механизмом. Для версий объектов это удаление устаревших версий, для файлов — перенос в тома на диске, для настроек — обработка настроек пользователей. Программно реквизит очищают записью Новый ХранилищеЗначения(Неопределено).
Типичная картина из практики: база Бухгалтерии за три года выросла с 4 до 40 ГБ, хотя документов прибавилось немного. В 9 случаях из 10 виноваты одна-две таблицы с двоичными данными. Их и надо найти до того, как что-то удалять.
Что такое хранилище значений и откуда в нём гигабайты
ХранилищеЗначения — тип данных платформы 1С:Предприятие 8.3. В реквизит такого типа можно положить почти что угодно: картинку, файл, таблицу значений, структуру настроек. Платформа сериализует значение и пишет его в базу двоичным полем. В MS SQL это поле типа image или varbinary(max), в PostgreSQL — bytea.
Сам по себе тип безобиден. Проблема в том, что типовые конфигурации активно им пользуются, и данные копятся годами без всякого контроля.
Кто обычно раздувает базу:
- 📄 Версии объектов. Механизм версионирования БСП сохраняет копию документа при каждой записи. Документ перепровели 30 раз — в базе 30 копий.
- 📎 Присоединённые файлы. Сканы договоров, фото, PDF-счета, если хранение настроено «в информационной базе».
- ⚙️ Настройки пользователей. Формы, отчёты, варианты отборов. Платформа хранит их в служебных хранилищах настроек.
- 📨 Данные обменов и ЭДО. Пакеты электронных документов, тексты сообщений, вложения.
- 🧩 Реквизиты доработок. Самописные справочники, куда программист складывает картинки или выгрузки «на всякий случай».
Не путайте с хранилищем конфигурации — это сервер групповой разработки, к данным базы он отношения не имеет. Журнал регистрации тоже живёт отдельно: в файловой базе и на сервере — в каталоге 1Cv8Log, а не в таблицах информационной базы.
Когда очистка хранилища значений действительно нужна
Чистить «на всякий случай» не стоит. Повод есть, когда видны конкретные симптомы.
| Симптом | Что проверить |
|---|---|
| Файловая база приближается к 10–20 ГБ, работает медленно | Размер таблиц версий и файлов |
Резервная копия делается часами, .dt весит десятки гигабайт | Таблицы с двоичными полями |
| Документ записывается заметно дольше, чем раньше | Включено ли версионирование для этого вида |
| Форма открывается с задержкой у одного пользователя | Его сохранённые настройки |
| На сервере СУБД кончается место на диске | Рост файла данных по месяцам |
Отдельная история — файловая база. У неё есть жёсткий потолок размера одной таблицы, и при разросшихся версиях или файлах до него можно дойти. Серверной базе такой лимит не грозит, но тормозят и бэкапы, и тестирование.
Подготовка: резервная копия и поиск самой тяжёлой таблицы
Перед любым удалением сделайте резервную копию и проверьте, что она разворачивается. Удалённые версии и файлы штатно не восстанавливаются.
Резервная копия
- Файловая база: скопируйте каталог базы целиком при закрытой программе или выгрузите
.dtчерезКонфигуратор → Администрирование → Выгрузить информационную базу. - Серверная база: штатный бэкап средствами СУБД —
BACKUP DATABASEв MS SQL илиpg_dumpв PostgreSQL. - Разверните копию в отдельную тестовую базу. На ней же удобно прогнать очистку первым разом.
Какая таблица толще всех
Имена таблиц в СУБД служебные: _InfoRg1234, _Reference56. Сначала выясняют размер, потом — какому объекту метаданных принадлежит таблица.
Для MS SQL:
SELECT TOP 20
t.name AS table_name,
SUM(a.total_pages) * 8 / 1024 AS size_mb
FROM sys.tables t
JOIN sys.partitions p ON p.object_id = t.object_id
JOIN sys.allocation_units a ON a.container_id = p.partition_id
GROUP BY t.name
ORDER BY size_mb DESC;
Для PostgreSQL:
SELECT relname AS table_name,
pg_size_pretty(pg_total_relation_size(oid)) AS size
FROM pg_class
WHERE relkind = 'r'
ORDER BY pg_total_relation_size(oid) DESC
LIMIT 20;
Сопоставить имя таблицы с объектом поможет функция платформы ПолучитьСтруктуруХраненияБазыДанных. Выполните её на сервере, например во внешней обработке:
&НаСервере
Процедура НайтиОбъектНаСервере(ИмяТаблицыСУБД)
Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Строка Из Структура Цикл
Если НРег(Строка.ИмяТаблицыХранения) = НРег(ИмяТаблицыСУБД) Тогда
Сообщить(Строка.ИмяТаблицы + " (" + Строка.Назначение + ")");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Второй параметр Истина возвращает имена таблиц так, как их видит СУБД. В ответ придёт, например, РегистрСведений.ВерсииОбъектов (Основная) — значит, чистить нужно версии.
Для файловой базы SQL-запросы не работают. Там проще посмотреть, сколько хранится версий и файлов, в интерфейсе программы — об этом в следующем разделе.
Способы очистки хранилища значений по источникам
Выбор способа зависит от того, что именно разрослось. Сначала — сравнение, ниже — подробности.
| Что разрослось | Способ | Риск |
|---|---|---|
| Версии объектов | Удаление устаревших версий штатной командой | Пропадёт история изменений за удалённый период |
| Присоединённые файлы | Перенос в тома на диске | Файлы нужно бэкапить отдельно от базы |
| Настройки пользователей | Очистка через обработку настроек | Пользователь потеряет свои колонки и отборы |
| Реквизиты доработок | Программная очистка кодом | Ошибка в отборе сотрёт нужные данные |
Способ 1. Удалить устаревшие версии объектов
В БП 3.0, ЗУП 3.1 и УТ 11 версионирование включается в Администрирование → Общие настройки, блок про историю изменений. Рядом есть ссылка на настройки версионирования и на сведения о хранимых версиях: там видно, сколько места они занимают.
- Откройте
Администрирование → Общие настройки. - В блоке версионирования перейдите к хранимым версиям.
- Выберите срок хранения: например, оставить версии за последний год.
- Запустите удаление устаревших версий и дождитесь окончания. На базе в десятки гигабайт это может идти часами — запускайте вечером.
В этих же настройках задаётся срок, после которого версии удаляются автоматически регламентным заданием. Настройте его сразу, иначе через год всё повторится.
Способ 2. Вынести файлы из базы в тома на диске
Присоединённые файлы не нужно удалять — их выносят в файловое хранилище на диске сервера. База худеет, а файлы остаются доступными из карточки документа.
- Подготовьте каталог на сервере, например
D:\1C_Files\Buh. Права на запись нужны той учётной записи, от которой работает сервер 1С (USR1CV8или ваша служебная). - В
Администрирование → Общие настройкив блоке присоединённых файлов выберите хранение в томах на диске. - Создайте том хранения файлов, укажите путь и при желании лимит размера.
- Запустите перенос уже накопленных файлов из информационной базы в тома.
Каталог томов в резервную копию базы не попадает. Добавьте его в задание бэкапа отдельно — иначе при восстановлении базы ссылки на файлы будут вести в пустоту.
Способ 3. Очистить настройки пользователей
Если тормозит форма у одного человека, начните с его настроек. В типовых конфигурациях на БСП путь такой: Администрирование → Настройки пользователей и прав → Персональные настройки пользователей → Настройки пользователей. Обработка показывает настройки отчётов, внешнего вида и прочие. Выделите лишнее и удалите — либо очистите всё у выбранного пользователя.
Программно это делает менеджер стандартного хранилища настроек:
// Удалить все общие и все настройки форм для пользователя Иванов
ИмяПользователя = "Иванов";
ХранилищеОбщихНастроек.Удалить(Неопределено, Неопределено, ИмяПользователя);
ХранилищеНастроекДанныхФорм.Удалить(Неопределено, Неопределено, ИмяПользователя);
ХранилищеСистемныхНастроек.Удалить(Неопределено, Неопределено, ИмяПользователя);
Параметры метода Удалить: ключ объекта, ключ настроек, имя пользователя. Неопределено означает «все». Пользователь при этом должен выйти из программы, иначе при закрытии сеанса платформа запишет часть настроек обратно.
Способ 4. Очистить реквизит типа ХранилищеЗначения кодом
Для доработок штатной кнопки нет. Значение очищают так: в реквизит записывают новое пустое хранилище. Удалять сам элемент справочника не нужно.
&НаСервере
Процедура ОчиститьВложенияНаСервере(ДатаГраницы)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 500
| Т.Ссылка КАК Ссылка
|ИЗ
| Справочник.АрхивВыгрузок КАК Т
|ГДЕ
| Т.ДатаВыгрузки < &ДатаГраницы
| И Т.ВложениеОчищено = ЛОЖЬ";
Запрос.УстановитьПараметр("ДатаГраницы", ДатаГраницы);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Вложение = Новый ХранилищеЗначения(Неопределено);
Объект.ВложениеОчищено = Истина;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
КонецЦикла;
КонецПроцедуры
Здесь АрхивВыгрузок, Вложение и ВложениеОчищено — имена условного самописного справочника, подставьте свои. Отбирать прямо по полю хранилища в запросе нельзя: такие поля не сравниваются. Поэтому нужен признак-флажок или отбор по дате.
Порция в 500 элементов не держит долгую транзакцию и не блокирует таблицу для коллег. ОбменДанными.Загрузка = Истина отключает обработчики записи — используйте это только для служебных объектов, не для документов с движениями.
После очистки: как вернуть место на диске
Удалили 20 ГБ версий, а файл базы не уменьшился — это нормально. СУБД помечает место свободным, но операционной системе его не отдаёт.
Файловая база
Закройте все сеансы, затем Конфигуратор → Администрирование → Тестирование и исправление. Отметьте Сжатие таблиц информационной базы и запустите. Режим требует монопольного доступа: предупредите пользователей, что работать в это время нельзя.
Второй вариант — выгрузить базу в .dt и загрузить её в новый пустой каталог. Файл 1Cv8.1CD после этого будет компактным.
MS SQL Server
-- сначала перестроить индексы крупной таблицы
ALTER INDEX ALL ON dbo._InfoRg1234 REBUILD;
-- затем ужать файл данных до целевого размера в МБ
DBCC SHRINKFILE (N'Buh_Data', 20000);
Логическое имя файла смотрите в свойствах базы в SQL Server Management Studio. Сжатие файла фрагментирует индексы, поэтому после него перестройте индексы ещё раз — штатным планом обслуживания.
PostgreSQL
Обычный VACUUM помечает место для повторного использования, а вернуть его на диск может только VACUUM FULL:
VACUUM FULL VERBOSE _inforg1234;
VACUUM FULL и перестроение индексов блокируют таблицу на всё время работы. Пользователи в эти часы получат ошибки блокировок, а длинные операции оборвутся. Запускайте в нерабочее время, предупредив всех заранее.
После всего сделайте свежую резервную копию: она и станет новой точкой отсчёта.
Как не дать хранилищу разрастись снова
Почти всегда база пухнет из-за настроек по умолчанию, которые никто не трогал. Пять минут настройки снимают проблему на годы.
- 🗂 Версионируйте выборочно. Историю изменений стоит хранить для договоров, кадровых приказов, справочника контрагентов. Для чеков ККМ и документов обмена с сайтом — обычно нет.
- ⏳ Включите автоудаление. Срок хранения версий 6–12 месяцев покрывает большинство разборов «кто поменял сумму».
- 📁 Файлы — сразу в тома. Чем раньше включено хранение на диске, тем меньше переносить потом.
- 📏 Следите за ростом. Раз в месяц записывайте размер базы и топ-5 таблиц. Рост на 2–3 ГБ за месяц без видимой причины — сигнал смотреть.
- 🧑💻 Проверяйте доработки. Если программист добавил реквизит типа
ХранилищеЗначения, спросите, кто и когда будет его чистить.
Когда лучше поручить очистку специалисту
Штатные команды из способов 1–3 бухгалтер с правами администратора выполнит сам. Позовите специалиста, если:
- 🔧 конфигурация сильно доработана, и толстая таблица принадлежит нетиповому объекту;
- 🕒 база работает круглосуточно, и окно для монопольных операций нужно планировать;
- 💾 на сервере СУБД почти кончилось место —
VACUUM FULLи перестроение индексов сами требуют свободного пространства, примерно с размер обрабатываемой таблицы; - 🔁 база участвует в распределённом обмене: массовая запись объектов может породить огромные пакеты изменений для других узлов.
Ориентир по стоимости: разовая диагностика и очистка у франчайзи обычно укладывается примерно в 2–6 часов работы специалиста. Точнее назовут после оценки размера базы и числа доработок.
Ошибки, из-за которых очистка оборачивается проблемой
- ❌ Удаление строк прямо в СУБД.
DELETEпо таблице регистра мимо платформы ломает связанные данные и итоги. Всё, что можно, удаляйте средствами 1С. - ❌ Одна гигантская транзакция. Очистка 2 млн записей разом раздувает журнал транзакций и может упасть по нехватке места. Работайте порциями.
- ❌ Очистка при включённом обмене без предупреждения. Изменённые объекты уйдут в другие узлы и перезапишут там данные.
- ❌ Забытые тома. Файлы вынесли на диск, а каталог не бэкапится. Первый же сбой диска — и сканы договоров потеряны.
- ❌ Ожидание мгновенного результата. Без сжатия таблиц или
VACUUM FULLразмер файла базы не изменится, даже если данных стало вдвое меньше.
Частые вопросы
Влияет ли очистка версий объектов на учёт и отчётность?
Можно ли восстановить удалённые версии или настройки?
Поможет ли запуск с параметром /ClearCache?
/ClearCache очищает локальный кэш клиента на компьютере пользователя. На размер информационной базы и хранилища значений он не влияет.