Чистим данные типа ХранилищеЗначения в базе 1С:Предприятия 8.3

· 10 мин

Содержание

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

Типичная картина из практики: база Бухгалтерии за три года выросла с 4 до 40 ГБ, хотя документов прибавилось немного. В 9 случаях из 10 виноваты одна-две таблицы с двоичными данными. Их и надо найти до того, как что-то удалять.

Что такое хранилище значений и откуда в нём гигабайты

ХранилищеЗначения — тип данных платформы 1С:Предприятие 8.3. В реквизит такого типа можно положить почти что угодно: картинку, файл, таблицу значений, структуру настроек. Платформа сериализует значение и пишет его в базу двоичным полем. В MS SQL это поле типа image или varbinary(max), в PostgreSQL — bytea.

Сам по себе тип безобиден. Проблема в том, что типовые конфигурации активно им пользуются, и данные копятся годами без всякого контроля.

Кто обычно раздувает базу:

  • 📄 Версии объектов. Механизм версионирования БСП сохраняет копию документа при каждой записи. Документ перепровели 30 раз — в базе 30 копий.
  • 📎 Присоединённые файлы. Сканы договоров, фото, PDF-счета, если хранение настроено «в информационной базе».
  • ⚙️ Настройки пользователей. Формы, отчёты, варианты отборов. Платформа хранит их в служебных хранилищах настроек.
  • 📨 Данные обменов и ЭДО. Пакеты электронных документов, тексты сообщений, вложения.
  • 🧩 Реквизиты доработок. Самописные справочники, куда программист складывает картинки или выгрузки «на всякий случай».

Не путайте с хранилищем конфигурации — это сервер групповой разработки, к данным базы он отношения не имеет. Журнал регистрации тоже живёт отдельно: в файловой базе и на сервере — в каталоге 1Cv8Log, а не в таблицах информационной базы.

Когда очистка хранилища значений действительно нужна

Чистить «на всякий случай» не стоит. Повод есть, когда видны конкретные симптомы.

СимптомЧто проверить
Файловая база приближается к 10–20 ГБ, работает медленноРазмер таблиц версий и файлов
Резервная копия делается часами, .dt весит десятки гигабайтТаблицы с двоичными полями
Документ записывается заметно дольше, чем раньшеВключено ли версионирование для этого вида
Форма открывается с задержкой у одного пользователяЕго сохранённые настройки
На сервере СУБД кончается место на дискеРост файла данных по месяцам

Отдельная история — файловая база. У неё есть жёсткий потолок размера одной таблицы, и при разросшихся версиях или файлах до него можно дойти. Серверной базе такой лимит не грозит, но тормозят и бэкапы, и тестирование.

Подготовка: резервная копия и поиск самой тяжёлой таблицы

Перед любым удалением сделайте резервную копию и проверьте, что она разворачивается. Удалённые версии и файлы штатно не восстанавливаются.

Резервная копия

  1. Файловая база: скопируйте каталог базы целиком при закрытой программе или выгрузите .dt через Конфигуратор → Администрирование → Выгрузить информационную базу.
  2. Серверная база: штатный бэкап средствами СУБД — BACKUP DATABASE в MS SQL или pg_dump в PostgreSQL.
  3. Разверните копию в отдельную тестовую базу. На ней же удобно прогнать очистку первым разом.

Какая таблица толще всех

Имена таблиц в СУБД служебные: _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 версионирование включается в Администрирование → Общие настройки, блок про историю изменений. Рядом есть ссылка на настройки версионирования и на сведения о хранимых версиях: там видно, сколько места они занимают.

  1. Откройте Администрирование → Общие настройки.
  2. В блоке версионирования перейдите к хранимым версиям.
  3. Выберите срок хранения: например, оставить версии за последний год.
  4. Запустите удаление устаревших версий и дождитесь окончания. На базе в десятки гигабайт это может идти часами — запускайте вечером.

В этих же настройках задаётся срок, после которого версии удаляются автоматически регламентным заданием. Настройте его сразу, иначе через год всё повторится.

Способ 2. Вынести файлы из базы в тома на диске

Присоединённые файлы не нужно удалять — их выносят в файловое хранилище на диске сервера. База худеет, а файлы остаются доступными из карточки документа.

  1. Подготовьте каталог на сервере, например D:\1C_Files\Buh. Права на запись нужны той учётной записи, от которой работает сервер 1С (USR1CV8 или ваша служебная).
  2. В Администрирование → Общие настройки в блоке присоединённых файлов выберите хранение в томах на диске.
  3. Создайте том хранения файлов, укажите путь и при желании лимит размера.
  4. Запустите перенос уже накопленных файлов из информационной базы в тома.

Каталог томов в резервную копию базы не попадает. Добавьте его в задание бэкапа отдельно — иначе при восстановлении базы ссылки на файлы будут вести в пустоту.

Способ 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 ГБ за месяц без видимой причины — сигнал смотреть.
  • 🧑‍💻 Проверяйте доработки. Если программист добавил реквизит типа ХранилищеЗначения, спросите, кто и когда будет его чистить.
Регламент обслуживания раз в квартал
Выполнено: 0 / 5

Когда лучше поручить очистку специалисту

Штатные команды из способов 1–3 бухгалтер с правами администратора выполнит сам. Позовите специалиста, если:

  • 🔧 конфигурация сильно доработана, и толстая таблица принадлежит нетиповому объекту;
  • 🕒 база работает круглосуточно, и окно для монопольных операций нужно планировать;
  • 💾 на сервере СУБД почти кончилось место — VACUUM FULL и перестроение индексов сами требуют свободного пространства, примерно с размер обрабатываемой таблицы;
  • 🔁 база участвует в распределённом обмене: массовая запись объектов может породить огромные пакеты изменений для других узлов.

Ориентир по стоимости: разовая диагностика и очистка у франчайзи обычно укладывается примерно в 2–6 часов работы специалиста. Точнее назовут после оценки размера базы и числа доработок.

Ошибки, из-за которых очистка оборачивается проблемой

  • ❌ Удаление строк прямо в СУБД. DELETE по таблице регистра мимо платформы ломает связанные данные и итоги. Всё, что можно, удаляйте средствами 1С.
  • ❌ Одна гигантская транзакция. Очистка 2 млн записей разом раздувает журнал транзакций и может упасть по нехватке места. Работайте порциями.
  • ❌ Очистка при включённом обмене без предупреждения. Изменённые объекты уйдут в другие узлы и перезапишут там данные.
  • ❌ Забытые тома. Файлы вынесли на диск, а каталог не бэкапится. Первый же сбой диска — и сканы договоров потеряны.
  • ❌ Ожидание мгновенного результата. Без сжатия таблиц или VACUUM FULL размер файла базы не изменится, даже если данных стало вдвое меньше.

Частые вопросы

Влияет ли очистка версий объектов на учёт и отчётность?
Нет. Версии — это копии для истории изменений. Проводки, остатки и регламентированные отчёты от них не зависят.
Можно ли восстановить удалённые версии или настройки?
Только из резервной копии. Разверните её в отдельную базу и найдите нужную версию там — переносить её в рабочую базу не нужно.
Поможет ли запуск с параметром /ClearCache?
Нет. /ClearCache очищает локальный кэш клиента на компьютере пользователя. На размер информационной базы и хранилища значений он не влияет.
Сколько места обычно освобождается?
Зависит от базы. Когда виноваты версии или файлы, размер нередко сокращается в несколько раз. Точную цифру покажет запрос к размерам таблиц до и после.
Нужно ли останавливать работу пользователей для очистки?
Для удаления версий и переноса файлов — нет, но лучше запускать вечером. Монопольный режим нужен только для сжатия таблиц файловой базы и загрузки .dt.